solara 0.7.3 → 0.8.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: 58813f26f146e2116b645174ff1c07b4d55fd681c95aeac51d14816668b44211
4
- data.tar.gz: 212aebb78263261836b669f60c78fcb3148c79c0aee218cd90477458865ecc96
3
+ metadata.gz: fab777e1d69e66685057160bd2e985538210106df8a397be359fd0185f802614
4
+ data.tar.gz: 26d2c512ddf0a43810b2c4bf5ab53d804aa37be2a82eb46a6eab40f2aaf0517a
5
5
  SHA512:
6
- metadata.gz: 4f31381757be0faeeb566131c45a9242b63a8b89fb610ccd6b6abd5bb7b99937890ee6f2e5420ac95022d3e534aeeb48e29dc427206f18217871768caaa84a58
7
- data.tar.gz: aa9af4d947d47c5a5ae7d43f336e4ee1c4d16b8c4224778f19579061f8215e3508887143607688f831d89229ba7d2c89a5925f9c6f4b0487d73632fb7356f33c
6
+ metadata.gz: 204e786990bda9915a0d30c27a02b62d3c1f381be578d051a58bc1230075e68aea5ca0a95783c305f12cebd20e1f393393e893158f88c4af2554e0b17591f8ed
7
+ data.tar.gz: cd30fcc67754e010bea2c10dc9d3bd86ee7b62c4ad12f8bf4fa74f0bef853b5c0542ec8f12277ce7115111d6783eebf8405e576880dfc14f54260f5d0c3c7e6d
@@ -14,7 +14,7 @@ class DartCodeGenerator
14
14
 
15
15
  private
16
16
 
17
- def generate_class(json_obj, class_name)
17
+ def generate_class(json_obj, class_name, list_items = nil)
18
18
  @registry.register(class_name, class_name)
19
19
  class_name = @registry.get_class_name(class_name, class_name)
20
20
  return if @generated_classes.any? { |c| c.include?("class #{class_name}") }
@@ -34,36 +34,70 @@ class DartCodeGenerator
34
34
  if value.is_a?(Hash)
35
35
  generate_class(value, nested_class_name)
36
36
  companion_values << "static final #{key}Value = #{nested_class_name}.instance;"
37
+ instance_values << "#{key}: #{nested_class_name}.instance"
37
38
  elsif value.is_a?(Array) && !value.empty? && value.first.is_a?(Hash)
38
- generate_class(value.first, nested_class_name)
39
+ generate_class(value.first, nested_class_name, value)
39
40
  type = "List<#{nested_class_name}>"
40
- list_values = value.map { |_| "#{nested_class_name}.instance" }
41
- companion_values << "static final #{key}Value = <#{nested_class_name}>[#{list_values.join(", ")}];"
41
+ companion_values << "static final #{key}Value = #{nested_class_name}.instances;"
42
+ instance_values << "#{key}: #{nested_class_name}.instances"
42
43
  else
43
44
  companion_values << "static final #{key}Value = #{dart_value(value)};"
45
+ instance_values << "#{key}: #{key}Value"
44
46
  end
45
47
 
46
48
  properties << "final #{type} #{key};"
47
49
  constructor_params << "required this.#{key}"
48
- instance_values << "#{key}: #{key}Value"
49
50
  end
50
51
 
51
- class_code = <<~DART
52
- class #{class_name} {
53
- #{properties.join("\n ")}
54
-
55
- const #{class_name}({#{constructor_params.join(", ")}});
56
-
52
+ static_instances = if list_items
53
+ items_code = list_items.map.with_index do |item, index|
54
+ values = item.map do |key, value|
55
+ if value.is_a?(Hash)
56
+ nested_class_name = "#{class_name}#{StringCase.capitalize(key)}"
57
+ @registry.register(nested_class_name, nested_class_name)
58
+ nested_class_name = @registry.get_class_name(nested_class_name, nested_class_name)
59
+ "#{key}: #{nested_class_name}.instance"
60
+ elsif value.is_a?(Array) && !value.empty? && value.first.is_a?(Hash)
61
+ nested_class_name = "#{class_name}#{StringCase.capitalize(key)}"
62
+ @registry.register(nested_class_name, nested_class_name)
63
+ nested_class_name = @registry.get_class_name(nested_class_name, nested_class_name)
64
+ "#{key}: #{nested_class_name}.instances"
65
+ else
66
+ "#{key}: #{dart_value(value)}"
67
+ end
68
+ end.join(",\n ")
69
+ " static final instance#{index + 1} = #{class_name}(\n #{values}\n );"
70
+ end.join("\n")
71
+
72
+ instances_list = (1..list_items.length).map { |i| "instance#{i}" }.join(", ")
73
+
74
+ <<~DART
75
+ #{items_code}
76
+
77
+ static final instances = <#{class_name}>[#{instances_list}];
78
+ DART
79
+ else
80
+ <<~DART
57
81
  static #{class_name}? _instance;
58
82
 
59
- #{companion_values.join("\n ")}
60
-
61
83
  static #{class_name} get instance {
62
84
  _instance ??= #{class_name}(
63
85
  #{instance_values.join(",\n ")}
64
86
  );
65
87
  return _instance!;
66
88
  }
89
+ DART
90
+ end
91
+
92
+ class_code = <<~DART
93
+ class #{class_name} {
94
+ #{properties.join("\n ")}
95
+
96
+ const #{class_name}({#{constructor_params.join(", ")}});
97
+
98
+ #{companion_values.join("\n ")}
99
+
100
+ #{static_instances}
67
101
  }
68
102
  DART
69
103
 
@@ -14,13 +14,14 @@ class KotlinCodeGenerator
14
14
 
15
15
  private
16
16
 
17
- def generate_class(json_obj, class_name)
17
+ def generate_class(json_obj, class_name, list_items = nil)
18
18
  @registry.register(class_name, class_name)
19
19
  class_name = @registry.get_class_name(class_name, class_name)
20
20
  return if @generated_classes.any? { |c| c.include?("data class #{class_name}") }
21
21
 
22
22
  properties = []
23
23
  companion_values = []
24
+ instance_values = []
24
25
 
25
26
  json_obj.each do |key, value|
26
27
  nested_class_name = "#{class_name}#{StringCase.capitalize(key)}"
@@ -32,37 +33,74 @@ class KotlinCodeGenerator
32
33
  if value.is_a?(Hash)
33
34
  generate_class(value, nested_class_name)
34
35
  companion_values << "private val #{key}Value = #{nested_class_name}.instance"
36
+ instance_values << "#{key} = #{nested_class_name}.instance"
35
37
  elsif value.is_a?(Array) && !value.empty? && value.first.is_a?(Hash)
36
- generate_class(value.first, nested_class_name)
38
+ generate_class(value.first, nested_class_name, value)
37
39
  type = "List<#{nested_class_name}>"
38
- list_values = value.map { |_| "#{nested_class_name}.instance" }
39
- companion_values << "private val #{key}Value = listOf(#{list_values.join(", ")})"
40
+ companion_values << "private val #{key}Value = #{nested_class_name}.instances"
41
+ instance_values << "#{key} = #{nested_class_name}.instances"
40
42
  else
41
43
  companion_values << "private val #{key}Value = #{kotlin_value(value)}"
44
+ instance_values << "#{key} = #{key}Value"
42
45
  end
43
46
 
44
47
  properties << "val #{key}: #{type}"
45
48
  end
46
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}.instance"
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} = #{kotlin_value(value)}"
65
+ end
66
+ end.join(",\n ")
67
+ " private val 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
+ <<~KOTLIN
73
+ companion object {
74
+ #{items_code}
75
+
76
+ val instances = listOf(#{instances_list})
77
+ }
78
+ KOTLIN
79
+ else
80
+ <<~KOTLIN
81
+ companion object {
82
+ private var _instance: #{class_name}? = null
83
+
84
+ #{companion_values.join("\n ")}
85
+
86
+ val instance: #{class_name}
87
+ get() {
88
+ if (_instance == null) {
89
+ _instance = #{class_name}(
90
+ #{instance_values.join(",\n ")}
91
+ )
92
+ }
93
+ return _instance!!
94
+ }
95
+ }
96
+ KOTLIN
97
+ end
98
+
47
99
  class_code = <<~KOTLIN
48
100
  data class #{class_name}(
49
101
  #{properties.join(",\n ")}
50
102
  ) {
51
- companion object {
52
- private var _instance: #{class_name}? = null
53
-
54
- #{companion_values.join("\n ")}
55
-
56
- val instance: #{class_name}
57
- get() {
58
- if (_instance == null) {
59
- _instance = #{class_name}(
60
- #{json_obj.keys.map { |key| "#{key} = #{key}Value" }.join(",\n ")}
61
- )
62
- }
63
- return _instance!!
64
- }
65
- }
103
+ #{static_instances}
66
104
  }
67
105
  KOTLIN
68
106
 
@@ -1,108 +1,144 @@
1
1
  class SwiftCodeGenerator
2
- def initialize(json, parent_class_name, registry = nil)
3
- @json = json
4
- @parent_class_name = parent_class_name
5
- @registry = registry || ClassNameRegistry.new
6
- @generated_classes = []
7
- end
8
-
9
- def generate
10
- imports = "import UIKit\n\n"
11
- generate_class(@json, @parent_class_name)
12
- imports + @generated_classes.reverse.join("\n\n")
13
- end
14
-
15
- private
16
-
17
- def generate_class(json_obj, class_name)
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
-
25
- json_obj.each do |key, value|
26
- nested_class_name = "#{class_name}#{StringCase.capitalize(key)}"
27
- @registry.register(nested_class_name, nested_class_name)
28
- nested_class_name = @registry.get_class_name(nested_class_name, nested_class_name)
29
-
30
- type = determine_type(value, nested_class_name, "#{class_name}.#{key}")
31
-
32
- if value.is_a?(Hash)
33
- generate_class(value, nested_class_name)
34
- static_values << "private static let #{key}Value = #{nested_class_name}.shared"
35
- elsif value.is_a?(Array) && !value.empty? && value.first.is_a?(Hash)
36
- generate_class(value.first, nested_class_name)
37
- type = "[#{nested_class_name}]"
38
- list_values = value.map { |_| "#{nested_class_name}.shared" }
39
- static_values << "private static let #{key}Value = [#{list_values.join(", ")}]"
40
- else
41
- static_values << "private static let #{key}Value = #{swift_value(value)}"
42
- end
43
-
44
- properties << "let #{key}: #{type}"
45
- end
46
-
47
- class_code = <<~SWIFT
48
- struct #{class_name} {
49
- #{properties.join("\n ")}
50
-
51
- private static var _shared: #{class_name}?
52
-
53
- #{static_values.join("\n ")}
54
-
55
- static var shared: #{class_name} {
56
- if _shared == nil {
57
- _shared = #{class_name}(
58
- #{json_obj.keys.map { |key| "#{key}: #{key}Value" }.join(",\n ")}
59
- )
60
- }
61
- return _shared!
62
- }
63
- }
64
- SWIFT
65
-
66
- @generated_classes << class_code
67
- end
68
-
69
- def determine_type(value, class_name, registry_key)
70
- base_type = if value.is_a?(String) && ColorDetector.new(value).color?
71
- "UIColor"
72
- elsif value.is_a?(String)
73
- "String"
74
- elsif value.is_a?(Integer)
75
- "Int"
76
- elsif value.is_a?(Float)
77
- "Double"
78
- elsif value.is_a?(TrueClass) || value.is_a?(FalseClass)
79
- "Bool"
80
- elsif value.is_a?(Array)
81
- item_type = value.empty? ? "Any" : determine_type(value.first, class_name, "#{registry_key}[]")
82
- "[#{item_type}]"
83
- elsif value.is_a?(Hash)
84
- class_name
2
+ def initialize(json, parent_class_name, registry = nil)
3
+ @json = json
4
+ @parent_class_name = parent_class_name
5
+ @registry = registry || ClassNameRegistry.new
6
+ @generated_classes = []
7
+ end
8
+
9
+ def generate
10
+ imports = "import UIKit\n\n"
11
+ generate_class(@json, @parent_class_name)
12
+ imports + @generated_classes.reverse.join("\n\n")
13
+ end
14
+
15
+ private
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"
85
42
  else
86
- "Any"
43
+ static_values << "private static let #{key}Value = #{swift_value(value)}"
44
+ instance_values << "#{key}: #{key}Value"
87
45
  end
88
46
 
89
- @registry.get_type(value, base_type)
47
+ properties << "let #{key}: #{type}"
90
48
  end
91
49
 
92
- def swift_value(value)
93
- if value.is_a?(String) && ColorDetector.new(value).color?
94
- hex = value.gsub('#', '')
95
- r = "Double(0x#{hex[0,2]}) / 255.0"
96
- g = "Double(0x#{hex[2,2]}) / 255.0"
97
- b = "Double(0x#{hex[4,2]}) / 255.0"
98
- a = hex.length == 8 ? "Double(0x#{hex[6,2]}) / 255.0" : "1.0"
99
- return "UIColor(red: #{r}, green: #{g}, blue: #{b}, alpha: #{a})"
100
- end
101
- return "\"#{value}\"" if value.is_a?(String)
102
- return value.to_s if value.is_a?(Integer) || value.is_a?(Float)
103
- return value.to_s.downcase if value.is_a?(TrueClass) || value.is_a?(FalseClass)
104
- return "[#{value.map { |v| swift_value(v) }.join(", ")}]" if value.is_a?(Array)
105
- return "nil" if value.nil?
106
- value.to_s
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
104
+
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
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})"
107
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
143
+ end
108
144
  end
@@ -1,3 +1,3 @@
1
1
  module Solara
2
- VERSION = "0.7.3"
2
+ VERSION = "0.8.0"
3
3
  end
metadata CHANGED
@@ -1,14 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: solara
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.7.3
4
+ version: 0.8.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Malek Kamel
8
- autorequire:
9
8
  bindir: bin
10
9
  cert_chain: []
11
- date: 2024-10-29 00:00:00.000000000 Z
10
+ date: 2025-03-08 00:00:00.000000000 Z
12
11
  dependencies:
13
12
  - !ruby/object:Gem::Dependency
14
13
  name: thor
@@ -72,14 +71,14 @@ dependencies:
72
71
  requirements:
73
72
  - - "~>"
74
73
  - !ruby/object:Gem::Version
75
- version: 1.25.0
74
+ version: 1.27.0
76
75
  type: :runtime
77
76
  prerelease: false
78
77
  version_requirements: !ruby/object:Gem::Requirement
79
78
  requirements:
80
79
  - - "~>"
81
80
  - !ruby/object:Gem::Version
82
- version: 1.25.0
81
+ version: 1.27.0
83
82
  - !ruby/object:Gem::Dependency
84
83
  name: cgi
85
84
  requirement: !ruby/object:Gem::Requirement
@@ -358,7 +357,6 @@ homepage: https://github.com/yourusername/solara
358
357
  licenses:
359
358
  - MIT
360
359
  metadata: {}
361
- post_install_message:
362
360
  rdoc_options: []
363
361
  require_paths:
364
362
  - solara/lib
@@ -373,8 +371,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
373
371
  - !ruby/object:Gem::Version
374
372
  version: '0'
375
373
  requirements: []
376
- rubygems_version: 3.5.21
377
- signing_key:
374
+ rubygems_version: 3.6.5
378
375
  specification_version: 4
379
376
  summary: Solara is a Ruby library that simplifies the management of white label apps
380
377
  for Flutter, iOS, Android, and Web.