Skip to content

Commit

Permalink
Improving API (#9)
Browse files Browse the repository at this point in the history
  • Loading branch information
leogdion authored Oct 11, 2024
1 parent 0a2b474 commit d450301
Show file tree
Hide file tree
Showing 44 changed files with 1,218 additions and 521 deletions.
18 changes: 9 additions & 9 deletions .swift-format
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,11 @@
"spaces" : 2
},
"indentConditionalCompilationBlocks" : true,
"indentSwitchCaseLabels" : true,
"lineBreakAroundMultilineExpressionChainComponents" : true,
"lineBreakBeforeControlFlowKeywords" : true,
"lineBreakBeforeEachArgument" : true,
"lineBreakBeforeEachGenericRequirement" : true,
"indentSwitchCaseLabels" : false,
"lineBreakAroundMultilineExpressionChainComponents" : false,
"lineBreakBeforeControlFlowKeywords" : false,
"lineBreakBeforeEachArgument" : false,
"lineBreakBeforeEachGenericRequirement" : false,
"lineLength" : 100,
"maximumBlankLines" : 1,
"multiElementCollectionTrailingCommas" : true,
Expand All @@ -20,7 +20,7 @@
]
},
"prioritizeKeepingFunctionOutputTogether" : false,
"respectsExistingLineBreaks" : false,
"respectsExistingLineBreaks" : true,
"rules" : {
"AllPublicDeclarationsHaveDocumentation" : true,
"AlwaysUseLiteralForEmptyCollectionInit" : false,
Expand All @@ -29,7 +29,7 @@
"BeginDocumentationCommentWithOneLineSummary" : false,
"DoNotUseSemicolons" : true,
"DontRepeatTypeInStaticProperties" : true,
"FileScopedDeclarationPrivacy" : true,
"FileScopedDeclarationPrivacy" : false,
"FullyIndirectEnum" : true,
"GroupNumericLiterals" : true,
"IdentifiersMustBeASCII" : true,
Expand All @@ -42,7 +42,7 @@
"NoCasesWithOnlyFallthrough" : true,
"NoEmptyTrailingClosureParentheses" : true,
"NoLabelsInCasePatterns" : true,
"NoLeadingUnderscores" : false,
"NoLeadingUnderscores" : true,
"NoParensAroundConditions" : true,
"NoPlaygroundLiterals" : true,
"NoVoidReturnOnFunctionSignature" : true,
Expand All @@ -67,4 +67,4 @@
"spacesAroundRangeFormationOperators" : false,
"tabWidth" : 2,
"version" : 1
}
}
129 changes: 129 additions & 0 deletions .swiftlint.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,129 @@
opt_in_rules:
- array_init
- closure_body_length
- closure_end_indentation
- closure_spacing
- collection_alignment
- conditional_returns_on_newline
- contains_over_filter_count
- contains_over_filter_is_empty
- contains_over_first_not_nil
- contains_over_range_nil_comparison
- convenience_type
- discouraged_object_literal
- discouraged_optional_boolean
- empty_collection_literal
- empty_count
- empty_string
- empty_xctest_method
- enum_case_associated_values_count
- expiring_todo
- explicit_acl
- explicit_init
- explicit_top_level_acl
# - fallthrough
- fatal_error_message
- file_name
- file_name_no_space
- file_types_order
- first_where
- flatmap_over_map_reduce
- force_unwrapping
# - function_default_parameter_at_end
- ibinspectable_in_extension
- identical_operands
- implicit_return
- implicitly_unwrapped_optional
- indentation_width
- joined_default_parameter
- last_where
- legacy_multiple
- legacy_random
- literal_expression_end_indentation
- lower_acl_than_parent
# - missing_docs
- modifier_order
- multiline_arguments
- multiline_arguments_brackets
- multiline_function_chains
- multiline_literal_brackets
- multiline_parameters
- nimble_operator
- nslocalizedstring_key
- nslocalizedstring_require_bundle
- number_separator
- object_literal
- operator_usage_whitespace
- optional_enum_case_matching
- overridden_super_call
- override_in_extension
- pattern_matching_keywords
- prefer_self_type_over_type_of_self
- prefer_zero_over_explicit_init
- private_action
- private_outlet
- prohibited_interface_builder
- prohibited_super_call
- quick_discouraged_call
- quick_discouraged_focused_test
- quick_discouraged_pending_test
- reduce_into
- redundant_nil_coalescing
- redundant_type_annotation
- required_enum_case
- single_test_class
- sorted_first_last
- sorted_imports
- static_operator
- strong_iboutlet
- toggle_bool
# - trailing_closure
- type_contents_order
- unavailable_function
- unneeded_parentheses_in_closure_argument
- unowned_variable_capture
- untyped_error_in_catch
- vertical_parameter_alignment_on_call
- vertical_whitespace_closing_braces
- vertical_whitespace_opening_braces
- xct_specific_matcher
- yoda_condition
analyzer_rules:
- unused_import
- unused_declaration
cyclomatic_complexity:
- 6
- 12
file_length:
warning: 225
error: 300
function_body_length:
- 50
- 76
function_parameter_count: 8
line_length:
- 108
- 200
closure_body_length:
- 50
- 60
identifier_name:
excluded:
- id
- no
excluded:
- DerivedData
- .build
indentation_width:
indentation_width: 2
file_name:
severity: error
fatal_error_message:
severity: error
disabled_rules:
- nesting
- implicit_getter
- switch_case_alignment
- closure_parameter_position
- trailing_comma
- opening_brace
11 changes: 11 additions & 0 deletions Example/Sources/Assets.xcassets/AccentColor.colorset/Contents.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
{
"colors" : [
{
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
58 changes: 58 additions & 0 deletions Example/Sources/Assets.xcassets/AppIcon.appiconset/Contents.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
{
"images" : [
{
"idiom" : "mac",
"scale" : "1x",
"size" : "16x16"
},
{
"idiom" : "mac",
"scale" : "2x",
"size" : "16x16"
},
{
"idiom" : "mac",
"scale" : "1x",
"size" : "32x32"
},
{
"idiom" : "mac",
"scale" : "2x",
"size" : "32x32"
},
{
"idiom" : "mac",
"scale" : "1x",
"size" : "128x128"
},
{
"idiom" : "mac",
"scale" : "2x",
"size" : "128x128"
},
{
"idiom" : "mac",
"scale" : "1x",
"size" : "256x256"
},
{
"idiom" : "mac",
"scale" : "2x",
"size" : "256x256"
},
{
"idiom" : "mac",
"scale" : "1x",
"size" : "512x512"
},
{
"idiom" : "mac",
"scale" : "2x",
"size" : "512x512"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
6 changes: 6 additions & 0 deletions Example/Sources/Assets.xcassets/Contents.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
{
"info" : {
"author" : "xcode",
"version" : 1
}
}
133 changes: 133 additions & 0 deletions Example/Sources/ContentObject.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,133 @@
//
// ContentObject.swift
// DataThespian
//
// Created by Leo Dion on 10/10/24.
//

import Combine
import DataThespian
import Foundation
import SwiftData

@Observable
@MainActor
internal class ContentObject {
internal let databaseChangePublisher = PassthroughSubject<any DatabaseChangeSet, Never>()
private var databaseChangeCancellable: AnyCancellable?
private var databaseChangeSubscription: AnyCancellable?
private var database: (any Database)?
internal private(set) var items = [ItemModel]()
internal var selectedItemsID: Set<ItemModel.ID> = []
private var newItem: AnyCancellable?
internal var error: (any Error)?

internal var selectedItems: [ItemModel] {
let selectedItemsID = self.selectedItemsID
let items: [ItemModel]
do {
items = try self.items.filter(
#Predicate<ItemModel> {
selectedItemsID.contains($0.id)
}
)
} catch {
assertionFailure("Unable to filter selected items: \(error.localizedDescription)")
self.error = error
items = []
}
// assert(items.count == selectedItemsID.count)
return items
}

internal init() {
self.databaseChangeSubscription = self.databaseChangePublisher.sink { _ in
self.beginUpdateItems()
}
}

private static func deleteModels(_ models: [Model<Item>], from database: (any Database))
async throws
{
try await database.withModelContext { modelContext in
let items: [Item] = models.compactMap {
modelContext.model(for: $0.persistentIdentifier) as? Item
}
dump(items.first?.persistentModelID)
assert(items.count == models.count)
for item in items {
modelContext.delete(item)
}
try modelContext.save()
}
}

private func beginUpdateItems() {
Task {
do {
try await self.updateItems()
} catch {
self.error = error
}
}
}

private func updateItems() async throws {
guard let database else {
return
}
self.items = try await database.withModelContext({ modelContext in
let items = try modelContext.fetch(FetchDescriptor<Item>())
return items.map(ItemModel.init)
})
}

internal func initialize(
withDatabase database: any Database, databaseChangePublisher: DatabaseChangePublicist
) {
self.database = database
self.databaseChangeCancellable = databaseChangePublisher(id: "contentView")
.subscribe(self.databaseChangePublisher)
self.beginUpdateItems()
}

internal func deleteSelectedItems() {
let models = self.selectedItems.map {
Model<Item>(persistentIdentifier: $0.id)
}
self.deleteItems(models)
}
internal func deleteItems(offsets: IndexSet) {
let models =
offsets
.compactMap { items[$0].id }
.map(Model<Item>.init(persistentIdentifier:))

assert(models.count == offsets.count)

self.deleteItems(models)
}

internal func deleteItems(_ models: [Model<Item>]) {
guard let database else {
return
}
Task {
try await Self.deleteModels(models, from: database)
}
}

internal func addItem(withDate date: Date = .init()) {
guard let database else {
return
}
Task {
try await database.withModelContext { modelContext in
let newItem = Item(timestamp: date)
modelContext.insert(newItem)
dump(newItem.persistentModelID)
try modelContext.save()
}
}
}
}
Loading

0 comments on commit d450301

Please sign in to comment.