Skip to content

Commit

Permalink
fixing linting errors
Browse files Browse the repository at this point in the history
  • Loading branch information
danielbarela committed Dec 18, 2023
1 parent 72de6be commit c039293
Show file tree
Hide file tree
Showing 110 changed files with 6,302 additions and 2,453 deletions.
4 changes: 4 additions & 0 deletions .swiftlint.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
disabled_rules:
- trailing_whitespace
excluded:
- Marlin/Pods
15 changes: 15 additions & 0 deletions Marlin/.swiftlint.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
disabled_rules:
- trailing_whitespace
- todo
excluded:
- Pods
- MarlinTests
identifier_name:
excluded:
- id
- a
- x
- y
- i
allowed_symbols:
- _
82 changes: 66 additions & 16 deletions Marlin/Marlin.xcodeproj/project.pbxproj

Large diffs are not rendered by default.

107 changes: 72 additions & 35 deletions Marlin/Marlin/CoreData/Persistence.swift
Original file line number Diff line number Diff line change
Expand Up @@ -11,17 +11,20 @@ import Combine

protocol PersistentStore {
func newTaskContext() -> NSManagedObjectContext
func fetchFirst<T: NSManagedObject>(_ entityClass:T.Type,
sortBy: [NSSortDescriptor]?,
func fetchFirst<T: NSManagedObject>(_ entityClass: T.Type,
sortBy: [NSSortDescriptor]?,
predicate: NSPredicate?,
context: NSManagedObjectContext?) throws-> T?
func fetch<ResultType: NSFetchRequestResult>(fetchRequest: NSFetchRequest<ResultType>) throws -> [ResultType]
func perform(_ block: @escaping () -> Void)
func save() throws
func fetchedResultsController<ResultType: NSFetchRequestResult>(fetchRequest: NSFetchRequest<ResultType>, sectionNameKeyPath: String?, cacheName name: String?) -> NSFetchedResultsController<ResultType>
func fetchedResultsController<ResultType: NSFetchRequestResult>(
fetchRequest: NSFetchRequest<ResultType>,
sectionNameKeyPath: String?,
cacheName name: String?) -> NSFetchedResultsController<ResultType>
func addViewContextObserver(_ observer: AnyObject, selector: Selector, name: Notification.Name)
func removeViewContextObserver(_ observer: AnyObject, name: Notification.Name)
func countOfObjects<T: NSManagedObject>(_ entityClass:T.Type) throws -> Int?
func countOfObjects<T: NSManagedObject>(_ entityClass: T.Type) throws -> Int?
func mainQueueContext() -> NSManagedObjectContext
func reset()

Expand Down Expand Up @@ -68,7 +71,7 @@ class MockPersistentStore: PersistentStore {
}

func fetchFirst<T: NSManagedObject>(_ entityClass:T.Type,
sortBy: [NSSortDescriptor]? = nil,
sortBy: [NSSortDescriptor]? = nil,
predicate: NSPredicate? = nil,
context: NSManagedObjectContext? = nil) throws-> T? {
return nil
Expand All @@ -82,7 +85,10 @@ class MockPersistentStore: PersistentStore {

}

func fetchedResultsController<ResultType: NSFetchRequestResult>(fetchRequest: NSFetchRequest<ResultType>, sectionNameKeyPath: String?, cacheName name: String?) -> NSFetchedResultsController<ResultType> {
func fetchedResultsController<ResultType: NSFetchRequestResult>(
fetchRequest: NSFetchRequest<ResultType>,
sectionNameKeyPath: String?,
cacheName name: String?) -> NSFetchedResultsController<ResultType> {
return NSFetchedResultsController<ResultType>(fetchRequest: fetchRequest,
managedObjectContext: newTaskContext(),
sectionNameKeyPath: sectionNameKeyPath,
Expand All @@ -101,7 +107,7 @@ class MockPersistentStore: PersistentStore {

}

func countOfObjects<T: NSManagedObject>(_ entityClass:T.Type) throws -> Int? {
func countOfObjects<T: NSManagedObject>(_ entityClass: T.Type) throws -> Int? {
return nil
}

Expand All @@ -119,9 +125,9 @@ class MockPersistentStore: PersistentStore {
class CoreDataPersistentStore: PersistentStore {
let logger = Logger(subsystem: "mil.nga.msi.Marlin", category: "persistence")

func fetchFirst<T: NSManagedObject>(_ entityClass:T.Type,
sortBy: [NSSortDescriptor]? = nil,
predicate: NSPredicate? = nil,
func fetchFirst<T: NSManagedObject>(_ entityClass: T.Type,
sortBy: [NSSortDescriptor]? = nil,
predicate: NSPredicate? = nil,
context: NSManagedObjectContext? = nil) throws-> T? {

return try (context ?? container.viewContext).fetchFirst(entityClass, sortBy: sortBy, predicate: predicate)
Expand All @@ -139,11 +145,15 @@ class CoreDataPersistentStore: PersistentStore {
try container.viewContext.save()
}

func fetchedResultsController<ResultType: NSFetchRequestResult>(fetchRequest: NSFetchRequest<ResultType>, sectionNameKeyPath: String?, cacheName name: String?) -> NSFetchedResultsController<ResultType> {
return NSFetchedResultsController<ResultType>(fetchRequest: fetchRequest,
managedObjectContext: container.viewContext,
sectionNameKeyPath: sectionNameKeyPath,
cacheName: nil)
func fetchedResultsController<ResultType: NSFetchRequestResult>(
fetchRequest: NSFetchRequest<ResultType>,
sectionNameKeyPath: String?,
cacheName name: String?) -> NSFetchedResultsController<ResultType> {
return NSFetchedResultsController<ResultType>(
fetchRequest: fetchRequest,
managedObjectContext: container.viewContext,
sectionNameKeyPath: sectionNameKeyPath,
cacheName: nil)
}

func addViewContextObserver(_ observer: AnyObject, selector: Selector, name: Notification.Name) {
Expand All @@ -154,7 +164,7 @@ class CoreDataPersistentStore: PersistentStore {
NotificationCenter.default.removeObserver(observer, name: name, object: container.viewContext)
}

func countOfObjects<T: NSManagedObject>(_ entityClass:T.Type) throws -> Int? {
func countOfObjects<T: NSManagedObject>(_ entityClass: T.Type) throws -> Int? {
var count: Int?
container.viewContext.performAndWait {
count = try? container.viewContext.countOfObjects(entityClass)
Expand Down Expand Up @@ -199,16 +209,18 @@ class CoreDataPersistentStore: PersistentStore {
return model
}()

var container : NSPersistentContainer {
if(_container == nil) {
var container: NSPersistentContainer {
if _container == nil {
_container = initializeContainer()
}
return _container!
}

func reset() {
do {
let tokenURL = NSPersistentContainer.defaultDirectoryURL().appendingPathComponent("MSICoreDataToken", isDirectory: true)
let tokenURL = NSPersistentContainer
.defaultDirectoryURL()
.appendingPathComponent("MSICoreDataToken", isDirectory: true)
try FileManager.default.removeItem(atPath: tokenURL.path)
} catch {
print(error.localizedDescription)
Expand All @@ -230,7 +242,9 @@ class CoreDataPersistentStore: PersistentStore {
}

func initializeContainer() -> NSPersistentContainer {
let container = NSPersistentContainer(name: "Marlin", managedObjectModel: CoreDataPersistentStore.managedObjectModel)
let container = NSPersistentContainer(
name: "Marlin",
managedObjectModel: CoreDataPersistentStore.managedObjectModel)
guard let description = container.persistentStoreDescriptions.first else {
fatalError("Failed to retrieve a persistent store description.")
}
Expand All @@ -250,15 +264,18 @@ class CoreDataPersistentStore: PersistentStore {
description.setOption(true as NSNumber,
forKey: NSPersistentHistoryTrackingKey)

container.loadPersistentStores(completionHandler: { (storeDescription, error) in
container.loadPersistentStores(completionHandler: { (_, error) in
if let error = error as NSError? {
// Replace this implementation with code to handle the error appropriately.
// fatalError() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development.

// fatalError() causes the application to generate a crash log and terminate.
// You should not use this function in a shipping application, although it may be
// useful during development.

/*
Typical reasons for an error here include:
* The parent directory does not exist, cannot be created, or disallows writing.
* The persistent store is not accessible, due to permissions or data protection when the device is locked.
* The persistent store is not accessible, due to permissions or data protection
* when the device is locked.
* The device is out of space.
* The store could not be migrated to the current model version.
Check the error message to determine what the actual problem was.
Expand Down Expand Up @@ -317,11 +334,17 @@ class CoreDataPersistentStore: PersistentStore {
if !inMemory {
do
{
let storeURL: URL = NSPersistentContainer.defaultDirectoryURL().appendingPathComponent("Marlin.sqlite")
let storeURL: URL = NSPersistentContainer
.defaultDirectoryURL()
.appendingPathComponent("Marlin.sqlite")
try FileManager.default.removeItem(atPath: storeURL.path)
let walURL: URL = NSPersistentContainer.defaultDirectoryURL().appendingPathComponent("Marlin.sqlite-wal")
let walURL: URL = NSPersistentContainer
.defaultDirectoryURL()
.appendingPathComponent("Marlin.sqlite-wal")
try FileManager.default.removeItem(atPath: walURL.path)
let shmURL: URL = NSPersistentContainer.defaultDirectoryURL().appendingPathComponent("Marlin.sqlite-shm")
let shmURL: URL = NSPersistentContainer
.defaultDirectoryURL()
.appendingPathComponent("Marlin.sqlite-shm")
try FileManager.default.removeItem(atPath: shmURL.path)
}
catch
Expand All @@ -330,7 +353,9 @@ class CoreDataPersistentStore: PersistentStore {
}
}
do {
let tokenURL = NSPersistentContainer.defaultDirectoryURL().appendingPathComponent("MSICoreDataToken", isDirectory: true)
let tokenURL = NSPersistentContainer
.defaultDirectoryURL()
.appendingPathComponent("MSICoreDataToken", isDirectory: true)
try FileManager.default.removeItem(atPath: tokenURL.path)
} catch {
print(error.localizedDescription)
Expand Down Expand Up @@ -429,7 +454,8 @@ class CoreDataPersistentStore: PersistentStore {
}

private func mergePersistentHistoryChanges(from history: [NSPersistentHistoryTransaction]) {
let entityMap: [String?: String] = MSI.shared.masterDataList.reduce([String?:String]()) { (partialResult, importable) -> [String?:String] in
let entityMap: [String?: String] =
MSI.shared.masterDataList.reduce([String?:String]()) { (partialResult, importable) -> [String?:String] in
var partialResult = partialResult
partialResult[importable.entity().name] = importable.key
return partialResult
Expand All @@ -443,9 +469,11 @@ class CoreDataPersistentStore: PersistentStore {
var insertCounts: [String? : Int] = [:]
for transaction in history {
let notif = transaction.objectIDNotification()
let inserts: Set<NSManagedObjectID> = notif.userInfo?["inserted_objectIDs"] as? Set<NSManagedObjectID> ?? Set<NSManagedObjectID>()
let updates: Set<NSManagedObjectID> = notif.userInfo?["updated_objectIDs"] as? Set<NSManagedObjectID> ?? Set<NSManagedObjectID>()

let inserts: Set<NSManagedObjectID> =
notif.userInfo?["inserted_objectIDs"] as? Set<NSManagedObjectID> ?? Set<NSManagedObjectID>()
let updates: Set<NSManagedObjectID> =
notif.userInfo?["updated_objectIDs"] as? Set<NSManagedObjectID> ?? Set<NSManagedObjectID>()

for insert in inserts {
let entityKey = entityMap[insert.entity.name]
insertCounts[entityKey] = (insertCounts[entityKey] ?? 0) + 1
Expand All @@ -466,11 +494,19 @@ class CoreDataPersistentStore: PersistentStore {
let inserts = insertCounts[dataSource.key] ?? 0
let updates = updateCounts[dataSource.key] ?? 0
if inserts != 0 || updates != 0 {
dataSourceUpdatedNotifications.append(DataSourceUpdatedNotification(key: dataSource.key, updates: updates, inserts: inserts))
dataSourceUpdatedNotifications.append(
DataSourceUpdatedNotification(
key: dataSource.key,
updates: updates,
inserts: inserts))
}
}

NotificationCenter.default.post(Notification(name: .BatchUpdateComplete, object: BatchUpdateComplete(dataSourceUpdates: dataSourceUpdatedNotifications)))
NotificationCenter.default.post(
Notification(
name: .BatchUpdateComplete,
object: BatchUpdateComplete(
dataSourceUpdates: dataSourceUpdatedNotifications)))
}
}

Expand Down Expand Up @@ -516,7 +552,8 @@ class CoreDataPersistentStore: PersistentStore {
try viewContext.save()
} catch {
// Replace this implementation with code to handle the error appropriately.
// fatalError() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development.
// fatalError() causes the application to generate a crash log and terminate. You should not use
// this function in a shipping application, although it may be useful during development.
let nsError = error as NSError
fatalError("Unresolved error \(nsError), \(nsError.userInfo)")
}
Expand Down
58 changes: 45 additions & 13 deletions Marlin/Marlin/DataSources/ASAM/Asam+DataSource.swift
Original file line number Diff line number Diff line change
Expand Up @@ -46,19 +46,38 @@ extension Asam: DataSource, Locatable, GeoPackageExportable, GeoJSONExportable {
static func postProcess() {}

static var isMappable: Bool = true
static var dataSourceName: String = NSLocalizedString("ASAM", comment: "ASAM data source display name")
static var fullDataSourceName: String = NSLocalizedString("Anti-Shipping Activity Messages", comment: "ASAM data source full display name")
static var dataSourceName: String =
NSLocalizedString("ASAM",
comment: "ASAM data source display name")
static var fullDataSourceName: String =
NSLocalizedString("Anti-Shipping Activity Messages",
comment: "ASAM data source full display name")
static var key: String = DataSourceType.asam.rawValue
static var metricsKey: String = "asams"
static var imageName: String? = "asam"
static var systemImageName: String? = nil
static var systemImageName: String?

static var color: UIColor = .black
static var imageScale = UserDefaults.standard.imageScale(key) ?? 1.0

static var defaultSort: [DataSourceSortParameter] = [DataSourceSortParameter(property:DataSourceProperty(name: "Date", key: #keyPath(Asam.date), type: .date), ascending: false)]
static var defaultFilter: [DataSourceFilterParameter] = [DataSourceFilterParameter(property: DataSourceProperty(name: "Date", key: #keyPath(Asam.date), type: .date), comparison: .window, windowUnits: DataSourceWindowUnits.last365Days)]

static var defaultSort: [DataSourceSortParameter] = [
DataSourceSortParameter(
property: DataSourceProperty(
name: "Date",
key: #keyPath(Asam.date),
type: .date),
ascending: false)
]
static var defaultFilter: [DataSourceFilterParameter] = [
DataSourceFilterParameter(
property: DataSourceProperty(
name: "Date",
key: #keyPath(Asam.date),
type: .date),
comparison: .window,
windowUnits: DataSourceWindowUnits.last365Days)
]

static var properties: [DataSourceProperty] = [
DataSourceProperty(name: "Date", key: #keyPath(Asam.date), type: .date),
DataSourceProperty(name: "Location", key: #keyPath(Asam.mgrs10km), type: .location),
Expand All @@ -84,28 +103,39 @@ extension Asam: BatchImportable {
let count = value.asam.count
NSLog("Received \(count) \(Self.key) records.")


let crossReference = Dictionary(grouping: value.asam, by: \.reference)
let duplicates = crossReference
.filter { $1.count > 1 }

print("Found Dupicate ASAMs \(duplicates.keys)")
return try await Self.importRecords(from: value.asam, taskContext: PersistenceController.current.newTaskContext())
return try await Self.importRecords(
from: value.asam,
taskContext: PersistenceController.current.newTaskContext())
}

static func dataRequest() -> [MSIRouter] {
let context = PersistenceController.current.newTaskContext()
var date: String? = nil
var date: String?
context.performAndWait {
let newestAsam = try? PersistenceController.current.fetchFirst(Asam.self, sortBy: [NSSortDescriptor(keyPath: \Asam.date, ascending: false)], predicate: nil, context: context)
let newestAsam =
try? PersistenceController.current.fetchFirst(Asam.self,
sortBy: [
NSSortDescriptor(
keyPath: \Asam.date,
ascending: false)],
predicate: nil,
context: context
)
date = newestAsam?.dateString
}
return [MSIRouter.readAsams(date: date)]
}

static func shouldSync() -> Bool {
// sync once every hour
return UserDefaults.standard.dataSourceEnabled(DataSourceDefinitions.asam.definition) && (Date().timeIntervalSince1970 - (60 * 60)) > UserDefaults.standard.lastSyncTimeSeconds(DataSourceDefinitions.asam.definition)
return UserDefaults.standard.dataSourceEnabled(DataSourceDefinitions.asam.definition)
&& (Date().timeIntervalSince1970 - (60 * 60)) >
UserDefaults.standard.lastSyncTimeSeconds(DataSourceDefinitions.asam.definition)
}

static func newBatchInsertRequest(with propertyList: [AsamModel]) -> NSBatchInsertRequest {
Expand All @@ -121,14 +151,16 @@ extension Asam: BatchImportable {
return value
}
return NSNull()
}) as [AnyHashable : Any])
}) as [AnyHashable: Any])
index += 1
return false
})
return batchInsertRequest
}

static func importRecords(from propertiesList: [AsamModel], taskContext: NSManagedObjectContext) async throws -> Int {
static func importRecords(
from propertiesList: [AsamModel],
taskContext: NSManagedObjectContext) async throws -> Int {
guard !propertiesList.isEmpty else { return 0 }

// Add name and author to identify source of persistent history changes.
Expand Down
Loading

0 comments on commit c039293

Please sign in to comment.