solara 0.8.0 → 0.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: fab777e1d69e66685057160bd2e985538210106df8a397be359fd0185f802614
4
- data.tar.gz: 26d2c512ddf0a43810b2c4bf5ab53d804aa37be2a82eb46a6eab40f2aaf0517a
3
+ metadata.gz: 06eafb3fee69d6bc3e49d8e61548f54c6da5622613c20803c335ce504f778440
4
+ data.tar.gz: 14174d2aedc0c2d7c3477abc47fddba2f814d3be02cabcfc5ba2d035e3258aec
5
5
  SHA512:
6
- metadata.gz: 204e786990bda9915a0d30c27a02b62d3c1f381be578d051a58bc1230075e68aea5ca0a95783c305f12cebd20e1f393393e893158f88c4af2554e0b17591f8ed
7
- data.tar.gz: cd30fcc67754e010bea2c10dc9d3bd86ee7b62c4ad12f8bf4fa74f0bef853b5c0542ec8f12277ce7115111d6783eebf8405e576880dfc14f54260f5d0c3c7e6d
6
+ metadata.gz: 4932da60d28a6be98b26b58c21dc5b372ecf83ffbce0e7e229bd95551a993ba4f7f9a01b538406c01e791ce4ece775b208a98e89ee04f6d1e0afb2f97a03b283
7
+ data.tar.gz: 39767cea4176efc5850b99f43f8a2e0583927dbb808c31b8329346739a13f02dab7f51e21cc5dea7864b9a3e4e55ad84884ab64a4779ea1201717df2e32c1608
@@ -14,131 +14,131 @@ class SwiftCodeGenerator
14
14
 
15
15
  private
16
16
 
17
- def generate_class(json_obj, class_name, list_items = nil)
18
- @registry.register(class_name, class_name)
19
- class_name = @registry.get_class_name(class_name, class_name)
20
- return if @generated_classes.any? { |c| c.include?("struct #{class_name}") }
21
-
22
- properties = []
23
- static_values = []
24
- instance_values = []
25
-
26
- json_obj.each do |key, value|
27
- nested_class_name = "#{class_name}#{StringCase.capitalize(key)}"
28
- @registry.register(nested_class_name, nested_class_name)
29
- nested_class_name = @registry.get_class_name(nested_class_name, nested_class_name)
30
-
31
- type = determine_type(value, nested_class_name, "#{class_name}.#{key}")
32
-
33
- if value.is_a?(Hash)
34
- generate_class(value, nested_class_name)
35
- static_values << "private static let #{key}Value = #{nested_class_name}.shared"
36
- instance_values << "#{key}: #{nested_class_name}.shared"
37
- elsif value.is_a?(Array) && !value.empty? && value.first.is_a?(Hash)
38
- generate_class(value.first, nested_class_name, value)
39
- type = "[#{nested_class_name}]"
40
- static_values << "private static let #{key}Value = #{nested_class_name}.instances"
41
- instance_values << "#{key}: #{nested_class_name}.instances"
17
+ def generate_class(json_obj, class_name, list_items = nil)
18
+ @registry.register(class_name, class_name)
19
+ class_name = @registry.get_class_name(class_name, class_name)
20
+ return if @generated_classes.any? { |c| c.include?("struct #{class_name}") }
21
+
22
+ properties = []
23
+ static_values = []
24
+ instance_values = []
25
+
26
+ json_obj.each do |key, value|
27
+ nested_class_name = "#{class_name}#{StringCase.capitalize(key)}"
28
+ @registry.register(nested_class_name, nested_class_name)
29
+ nested_class_name = @registry.get_class_name(nested_class_name, nested_class_name)
30
+
31
+ type = determine_type(value, nested_class_name, "#{class_name}.#{key}")
32
+
33
+ if value.is_a?(Hash)
34
+ generate_class(value, nested_class_name)
35
+ static_values << "private static let #{key}Value = #{nested_class_name}.shared"
36
+ instance_values << "#{key}: #{nested_class_name}.shared"
37
+ elsif value.is_a?(Array) && !value.empty? && value.first.is_a?(Hash)
38
+ generate_class(value.first, nested_class_name, value)
39
+ type = "[#{nested_class_name}]"
40
+ static_values << "private static let #{key}Value = #{nested_class_name}.instances"
41
+ instance_values << "#{key}: #{nested_class_name}.instances"
42
+ else
43
+ static_values << "private static let #{key}Value = #{swift_value(value)}"
44
+ instance_values << "#{key}: #{key}Value"
45
+ end
46
+
47
+ properties << "let #{key}: #{type}"
48
+ end
49
+
50
+ static_instances = if list_items
51
+ items_code = list_items.map.with_index do |item, index|
52
+ values = item.map do |key, value|
53
+ if value.is_a?(Hash)
54
+ nested_class_name = "#{class_name}#{StringCase.capitalize(key)}"
55
+ @registry.register(nested_class_name, nested_class_name)
56
+ nested_class_name = @registry.get_class_name(nested_class_name, nested_class_name)
57
+ "#{key}: #{nested_class_name}.shared"
58
+ elsif value.is_a?(Array) && !value.empty? && value.first.is_a?(Hash)
59
+ nested_class_name = "#{class_name}#{StringCase.capitalize(key)}"
60
+ @registry.register(nested_class_name, nested_class_name)
61
+ nested_class_name = @registry.get_class_name(nested_class_name, nested_class_name)
62
+ "#{key}: #{nested_class_name}.instances"
63
+ else
64
+ "#{key}: #{swift_value(value)}"
65
+ end
66
+ end.join(",\n ")
67
+ " private static let instance#{index + 1} = #{class_name}(\n #{values}\n )"
68
+ end.join("\n")
69
+
70
+ instances_list = (1..list_items.length).map { |i| "instance#{i}" }.join(", ")
71
+
72
+ <<~SWIFT
73
+ #{items_code}
74
+
75
+ static let instances: [#{class_name}] = [#{instances_list}]
76
+ SWIFT
42
77
  else
43
- static_values << "private static let #{key}Value = #{swift_value(value)}"
44
- instance_values << "#{key}: #{key}Value"
78
+ <<~SWIFT
79
+ private static var _shared: #{class_name}?
80
+
81
+ #{static_values.join("\n ")}
82
+
83
+ static var shared: #{class_name} {
84
+ if _shared == nil {
85
+ _shared = #{class_name}(
86
+ #{instance_values.join(",\n ")}
87
+ )
88
+ }
89
+ return _shared!
90
+ }
91
+ SWIFT
45
92
  end
46
93
 
47
- properties << "let #{key}: #{type}"
94
+ class_code = <<~SWIFT
95
+ struct #{class_name} {
96
+ #{properties.join("\n ")}
97
+
98
+ #{static_instances}
99
+ }
100
+ SWIFT
101
+
102
+ @generated_classes << class_code
48
103
  end
49
104
 
50
- static_instances = if list_items
51
- items_code = list_items.map.with_index do |item, index|
52
- values = item.map do |key, value|
53
- if value.is_a?(Hash)
54
- nested_class_name = "#{class_name}#{StringCase.capitalize(key)}"
55
- @registry.register(nested_class_name, nested_class_name)
56
- nested_class_name = @registry.get_class_name(nested_class_name, nested_class_name)
57
- "#{key}: #{nested_class_name}.shared"
58
- elsif value.is_a?(Array) && !value.empty? && value.first.is_a?(Hash)
59
- nested_class_name = "#{class_name}#{StringCase.capitalize(key)}"
60
- @registry.register(nested_class_name, nested_class_name)
61
- nested_class_name = @registry.get_class_name(nested_class_name, nested_class_name)
62
- "#{key}: #{nested_class_name}.instances"
63
- else
64
- "#{key}: #{swift_value(value)}"
65
- end
66
- end.join(",\n ")
67
- " private static let instance#{index + 1} = #{class_name}(\n #{values}\n )"
68
- end.join("\n")
69
-
70
- instances_list = (1..list_items.length).map { |i| "instance#{i}" }.join(", ")
71
-
72
- <<~SWIFT
73
- #{items_code}
74
-
75
- static let instances: [#{class_name}] = [#{instances_list}]
76
- SWIFT
77
- else
78
- <<~SWIFT
79
- private static var _shared: #{class_name}?
80
-
81
- #{static_values.join("\n ")}
82
-
83
- static var shared: #{class_name} {
84
- if _shared == nil {
85
- _shared = #{class_name}(
86
- #{instance_values.join(",\n ")}
87
- )
88
- }
89
- return _shared!
90
- }
91
- SWIFT
92
- end
93
-
94
- class_code = <<~SWIFT
95
- struct #{class_name} {
96
- #{properties.join("\n ")}
97
-
98
- #{static_instances}
99
- }
100
- SWIFT
101
-
102
- @generated_classes << class_code
103
- end
105
+ def determine_type(value, class_name, registry_key)
106
+ base_type = if value.is_a?(String) && ColorDetector.new(value).color?
107
+ "UIColor"
108
+ elsif value.is_a?(String)
109
+ "String"
110
+ elsif value.is_a?(Integer)
111
+ "Int"
112
+ elsif value.is_a?(Float)
113
+ "Double"
114
+ elsif value.is_a?(TrueClass) || value.is_a?(FalseClass)
115
+ "Bool"
116
+ elsif value.is_a?(Array)
117
+ item_type = value.empty? ? "Any" : determine_type(value.first, class_name, "#{registry_key}[]")
118
+ "[#{item_type}]"
119
+ elsif value.is_a?(Hash)
120
+ class_name
121
+ else
122
+ "Any"
123
+ end
104
124
 
105
- def determine_type(value, class_name, registry_key)
106
- base_type = if value.is_a?(String) && ColorDetector.new(value).color?
107
- "UIColor"
108
- elsif value.is_a?(String)
109
- "String"
110
- elsif value.is_a?(Integer)
111
- "Int"
112
- elsif value.is_a?(Float)
113
- "Double"
114
- elsif value.is_a?(TrueClass) || value.is_a?(FalseClass)
115
- "Bool"
116
- elsif value.is_a?(Array)
117
- item_type = value.empty? ? "Any" : determine_type(value.first, class_name, "#{registry_key}[]")
118
- "[#{item_type}]"
119
- elsif value.is_a?(Hash)
120
- class_name
121
- else
122
- "Any"
123
- end
124
-
125
- @registry.get_type(value, base_type)
126
- end
125
+ @registry.get_type(value, base_type)
126
+ end
127
127
 
128
- def swift_value(value)
129
- if value.is_a?(String) && ColorDetector.new(value).color?
130
- hex = value.gsub('#', '')
131
- r = "Double(0x#{hex[0, 2]}) / 255.0"
132
- g = "Double(0x#{hex[2, 2]}) / 255.0"
133
- b = "Double(0x#{hex[4, 2]}) / 255.0"
134
- a = hex.length == 8 ? "Double(0x#{hex[6, 2]}) / 255.0" : "1.0"
135
- return "UIColor(red: #{r}, green: #{g}, blue: #{b}, alpha: #{a})"
128
+ def swift_value(value)
129
+ if value.is_a?(String) && ColorDetector.new(value).color?
130
+ hex = value.gsub('#', '')
131
+ r = "Double(0x#{hex[0,2]}) / 255.0"
132
+ g = "Double(0x#{hex[2,2]}) / 255.0"
133
+ b = "Double(0x#{hex[4,2]}) / 255.0"
134
+ a = hex.length == 8 ? "Double(0x#{hex[6,2]}) / 255.0" : "1.0"
135
+ return "UIColor(red: #{r}, green: #{g}, blue: #{b}, alpha: #{a})"
136
+ end
137
+ return "\"#{value}\"" if value.is_a?(String)
138
+ return value.to_s if value.is_a?(Integer) || value.is_a?(Float)
139
+ return value.to_s.downcase if value.is_a?(TrueClass) || value.is_a?(FalseClass)
140
+ return "[#{value.map { |v| swift_value(v) }.join(", ")}]" if value.is_a?(Array)
141
+ return "nil" if value.nil?
142
+ value.to_s
136
143
  end
137
- return "\"#{value}\"" if value.is_a?(String)
138
- return value.to_s if value.is_a?(Integer) || value.is_a?(Float)
139
- return value.to_s.downcase if value.is_a?(TrueClass) || value.is_a?(FalseClass)
140
- return "[#{value.map { |v| swift_value(v) }.join(", ")}]" if value.is_a?(Array)
141
- return "nil" if value.nil?
142
- value.to_s
143
- end
144
- end
144
+ end
@@ -55,6 +55,7 @@ project.ext {
55
55
 
56
56
  def update_gradle(gradle_file, gradle_content)
57
57
  properties_loader = @is_kotlin_gradle ? KOTLIN_PROPERTIES_LOADER : GROOVY_PROPERTIES_LOADER
58
+ original_content = gradle_content.dup
58
59
 
59
60
  if @is_kotlin_gradle
60
61
  # Add imports for Kotlin
@@ -91,8 +92,22 @@ project.ext {
91
92
  )
92
93
 
93
94
  gradle_content.sub!(android_block_regex, updated_android_block)
94
- File.write(gradle_file, gradle_content)
95
- Solara.logger.debug("Updated #{gradle_file} (#{@is_kotlin_gradle ? 'Kotlin' : 'Groovy'}) to use brand.properties")
95
+
96
+ # Compare normalized content
97
+ if normalize_content(gradle_content) != normalize_content(original_content)
98
+ File.write(gradle_file, gradle_content)
99
+ Solara.logger.debug("Updated #{gradle_file} (#{@is_kotlin_gradle ? 'Kotlin' : 'Groovy'}) to use brand.properties")
100
+ else
101
+ Solara.logger.debug("No changes needed for #{gradle_file}")
102
+ end
103
+ end
104
+
105
+ def normalize_content(content)
106
+ # Remove empty lines and normalize whitespace
107
+ content.lines
108
+ .map(&:strip)
109
+ .reject(&:empty?)
110
+ .join("\n")
96
111
  end
97
112
 
98
113
  def add_source_sets(gradle_file)
@@ -1,3 +1,3 @@
1
1
  module Solara
2
- VERSION = "0.8.0"
2
+ VERSION = "0.9.0"
3
3
  end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: solara
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.8.0
4
+ version: 0.9.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Malek Kamel
8
8
  bindir: bin
9
9
  cert_chain: []
10
- date: 2025-03-08 00:00:00.000000000 Z
10
+ date: 2025-03-10 00:00:00.000000000 Z
11
11
  dependencies:
12
12
  - !ruby/object:Gem::Dependency
13
13
  name: thor