Skip to content

Commit 3eebb50

Browse files
authored
Merge pull request #9 from mbabicz/General-Improvements
General improvements
2 parents 3d2e870 + a23fea5 commit 3eebb50

23 files changed

Lines changed: 712 additions & 349 deletions

.github/workflows/pr-ci.yml

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -34,10 +34,19 @@ jobs:
3434
rm -rf ~/Library/Developer/Xcode/DerivedData
3535
rm -rf .build
3636
37-
- name: Create .env for CI
37+
- name: Create dummy Secrets.swift for CI
3838
run: |
39-
cat > .env << 'EOF'
40-
export OPENAI_API_KEY
39+
cat > SwiftGPT/Secrets.swift << 'EOF'
40+
//
41+
// Secrets.swift
42+
// SwiftGPT - CI Build
43+
//
44+
45+
import Foundation
46+
47+
enum Secrets {
48+
static let openaiApiKey = "dummy-key-for-ci-build"
49+
}
4150
EOF
4251
4352
- name: Resolve packages
@@ -47,14 +56,6 @@ jobs:
4756
-project SwiftGPT.xcodeproj \
4857
-scheme "SwiftGPT"
4958
50-
- name: Build SecretsManager plugin
51-
run: |
52-
set -euo pipefail
53-
xcodebuild -scheme SecretsManager \
54-
-destination 'platform=macOS' \
55-
-derivedDataPath ./DerivedData \
56-
build || echo "SecretsManager build skipped"
57-
5859
- name: Build (no code signing)
5960
run: |
6061
set -euo pipefail

.gitignore

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,4 +10,8 @@ profile
1010
.idea/
1111

1212
# system files
13-
.DS_Store
13+
.DS_Store
14+
15+
# Secrets
16+
Secrets.swift
17+
**/Secrets.swift

.swiftlint.yml

Lines changed: 96 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,51 +1,125 @@
1+
excluded:
2+
- "bin/*"
3+
- "Script/*"
4+
- "Generated/*"
5+
- "Package.swift"
6+
- "Resources/Localizables/Strings+Generated.swift"
7+
8+
disabled_rules:
9+
- identifier_name
10+
- inclusive_language
11+
- type_name
12+
- redundant_string_enum_value
13+
- todo
14+
15+
analyzer_rules:
16+
- explicit_self
17+
- unused_declaration
18+
- unused_import
19+
20+
opt_in_rules:
21+
- array_init
22+
- closure_spacing
23+
- contains_over_filter_count
24+
- contains_over_filter_is_empty
25+
- contains_over_first_not_nil
26+
- contains_over_range_nil_comparison
27+
- cyclomatic_complexity
28+
- discouraged_object_literal
29+
- empty_collection_literal
30+
- empty_count
31+
- empty_string
32+
- expiring_todo
33+
- explicit_init
34+
- fatal_error_message
35+
- file_name_no_space
36+
- first_where
37+
- flatmap_over_map_reduce
38+
- identical_operands
39+
- joined_default_parameter
40+
- last_where
41+
- legacy_multiple
42+
- legacy_random
43+
- literal_expression_end_indentation
44+
- modifier_order
45+
- nimble_operator
46+
- operator_usage_whitespace
47+
- optional_enum_case_matching
48+
- overridden_super_call
49+
- prefer_self_type_over_type_of_self
50+
- prohibited_super_call
51+
- raw_value_for_camel_cased_codable_enum
52+
- redundant_nil_coalescing
53+
- required_enum_case
54+
- sorted_first_last
55+
- static_operator
56+
- toggle_bool
57+
- unneeded_parentheses_in_closure_argument
58+
- untyped_error_in_catch
59+
- vertical_whitespace_closing_braces
60+
- yoda_condition
61+
- comment_spacing
62+
- function_body_length
63+
- file_length
64+
- line_length
65+
- type_body_length
66+
- nesting
67+
- large_tuple
68+
- vertical_whitespace
69+
- force_cast
70+
- force_try
71+
- force_unwrapping
72+
- implicitly_unwrapped_optional
73+
- trailing_whitespace
74+
175
line_length:
2-
warning: 160
3-
error: 200
76+
warning: 180
77+
error: 250
478
ignores_comments: true
579

680
function_body_length:
7-
warning: 100
8-
error: 160
81+
warning: 120
82+
error: 180
983

1084
file_length:
11-
warning: 400
85+
warning: 500
1286
error: 600
1387

14-
nesting:
15-
type_level: 6
88+
type_body_length:
89+
warning: 500
90+
error: 600
1691

1792
vertical_whitespace:
1893
max_empty_lines: 1
1994

95+
nesting:
96+
type_level: 6
97+
2098
large_tuple:
2199
warning: 5
22100
error: 6
23101

24-
opt_in_rules:
25-
- force_cast # as!
26-
- force_try # try!
27-
- force_unwrapping # !
28-
- implicitly_unwrapped_optional # !
29-
- unneeded_parentheses_in_closure_argument # ()
30-
31102
force_cast:
32-
severity: warning
103+
severity: error
33104

34105
force_try:
35-
severity: warning
106+
severity: error
36107

37108
force_unwrapping:
38-
severity: warning
109+
severity: error
39110

40111
implicitly_unwrapped_optional:
41-
severity: warning
42-
43-
disabled_rules:
44-
- multiple_closures_with_trailing_closure
112+
severity: error
45113

46114
custom_rules:
115+
private_state_finder:
116+
include: "*.swift"
117+
name: "Private State"
118+
regex: "(@State\\s+var)"
119+
message: "States should be private."
120+
severity: warning
47121
sf_safe_symbol:
48122
name: "Safe SFSymbol"
49123
message: "Use `SFSafeSymbols` via `systemSymbol` parameters for type safety."
50124
regex: "(Image\\(systemName:)|(NSImage\\(symbolName:)|(Label[^,]+?,\\s*systemImage:)|(UIApplicationShortcutIcon\\(systemImageName:)"
51-
severity: error
125+
severity: warning

Resources/Localizables/Localizable.strings

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,3 +3,20 @@
33
"dalle.error.image_conversion" = "Image conversion error";
44
"message.textfield.placeholder" = "Message...";
55
"chat.introduce.title" = "Write your first message!";
6+
"error.network" = "Network error occurred";
7+
"error.api" = "API request failed";
8+
"error.unknown" = "An unexpected error occurred";
9+
"error.save_photo" = "Failed to save image to Photos";
10+
"error.save_photo_permission" = "Permission denied. Please allow access to Photos in Settings.";
11+
12+
// Accessibility
13+
"accessibility.tab.chatgpt" = "Chat with GPT";
14+
"accessibility.tab.dalle" = "Generate images with DALL·E";
15+
"accessibility.button.send" = "Send message";
16+
"accessibility.button.send.hint" = "Sends your message to the AI";
17+
"accessibility.button.share" = "Share image";
18+
"accessibility.button.save" = "Save image to photos";
19+
"accessibility.textfield.message" = "Message input field";
20+
"accessibility.image.generated" = "Generated image";
21+
"accessibility.image.user" = "User avatar";
22+
"accessibility.image.gpt" = "AI avatar";

Resources/Localizables/Strings+Generated.swift

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,38 @@ import Foundation
1010
// swiftlint:disable explicit_type_interface function_parameter_count identifier_name line_length
1111
// swiftlint:disable nesting type_body_length type_name vertical_whitespace_opening_braces
1212
internal enum L10n {
13+
internal enum Accessibility {
14+
internal enum Button {
15+
/// Save image to photos
16+
internal static let save = L10n.tr("Localizable", "accessibility.button.save", fallback: "Save image to photos")
17+
/// Send message
18+
internal static let send = L10n.tr("Localizable", "accessibility.button.send", fallback: "Send message")
19+
/// Share image
20+
internal static let share = L10n.tr("Localizable", "accessibility.button.share", fallback: "Share image")
21+
internal enum Send {
22+
/// Sends your message to the AI
23+
internal static let hint = L10n.tr("Localizable", "accessibility.button.send.hint", fallback: "Sends your message to the AI")
24+
}
25+
}
26+
internal enum Image {
27+
/// Generated image
28+
internal static let generated = L10n.tr("Localizable", "accessibility.image.generated", fallback: "Generated image")
29+
/// AI avatar
30+
internal static let gpt = L10n.tr("Localizable", "accessibility.image.gpt", fallback: "AI avatar")
31+
/// User avatar
32+
internal static let user = L10n.tr("Localizable", "accessibility.image.user", fallback: "User avatar")
33+
}
34+
internal enum Tab {
35+
/// Chat with GPT
36+
internal static let chatgpt = L10n.tr("Localizable", "accessibility.tab.chatgpt", fallback: "Chat with GPT")
37+
/// Generate images with DALL·E
38+
internal static let dalle = L10n.tr("Localizable", "accessibility.tab.dalle", fallback: "Generate images with DALL·E")
39+
}
40+
internal enum Textfield {
41+
/// Message input field
42+
internal static let message = L10n.tr("Localizable", "accessibility.textfield.message", fallback: "Message input field")
43+
}
44+
}
1345
internal enum Chat {
1446
internal enum Introduce {
1547
/// Write your first message!
@@ -32,6 +64,18 @@ internal enum L10n {
3264
internal static let title = L10n.tr("Localizable", "dalle.tab.title", fallback: "DALL·E 2")
3365
}
3466
}
67+
internal enum Error {
68+
/// API request failed
69+
internal static let api = L10n.tr("Localizable", "error.api", fallback: "API request failed")
70+
/// Network error occurred
71+
internal static let network = L10n.tr("Localizable", "error.network", fallback: "Network error occurred")
72+
/// Failed to save image to Photos
73+
internal static let savePhoto = L10n.tr("Localizable", "error.save_photo", fallback: "Failed to save image to Photos")
74+
/// Permission denied. Please allow access to Photos in Settings.
75+
internal static let savePhotoPermission = L10n.tr("Localizable", "error.save_photo_permission", fallback: "Permission denied. Please allow access to Photos in Settings.")
76+
/// An unexpected error occurred
77+
internal static let unknown = L10n.tr("Localizable", "error.unknown", fallback: "An unexpected error occurred")
78+
}
3579
internal enum Message {
3680
internal enum Textfield {
3781
/// Message...

0 commit comments

Comments
 (0)