stylegen 0.3.1 → 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: e4808a4d66b66694ce4df774bc4fc3cc4048e5eb28849bc9d6e89c191a2c9f32
4
- data.tar.gz: 639451c4ee1913d543c1b10cd3ed6dc7bf8f70b5711ac490ca1644d28b88bd88
3
+ metadata.gz: 31f78139e4e4008bf37ab9d48bc8e00309b7a04d98be8e0a2d66a281afde0780
4
+ data.tar.gz: e08e613e70ef4ca0f96989051db35496783caf8c4de3245fb78600d6a72cd15a
5
5
  SHA512:
6
- metadata.gz: 3ac5a414042b33bef240224d8390d79e92466b777a98bd9ffa0dcd20fe63b4b3353823d26dcc129655bd3d534b1eca2b7c9950b2b6e1764b5d7e30e8e1381ac2
7
- data.tar.gz: 8d2e762fef43e854ca222e9fba107fb8df885d2ae4b2d0ab44eed03c6f7e0c5f61138df701954fd479b4dcbe2f1698b18ae4a140423a625bab83ccff95b0eec5
6
+ metadata.gz: aa6e4794fb3fa16e907aa5fe272fce946b225de69565ca92dee659dd2ddaae63e6ae141c320366bb05ff8dade91ae5b3acd1cb8ca5f0641ab44cfa909971a4bc
7
+ data.tar.gz: d0b5c306bb2edc0e1c017ba35df7dfb6445d02fe66b12cc7560999461c7ce4a2549378a47b371466b49771cb7300fb360a50ca6345f62e48c23137d1a58644d2
data/.deepsource.toml ADDED
@@ -0,0 +1,5 @@
1
+ version = 1
2
+
3
+ [[analyzers]]
4
+ name = "ruby"
5
+ enabled = true
@@ -1,14 +1,14 @@
1
1
  name: CI
2
-
3
2
  on:
4
3
  push:
5
- branches: "*"
4
+ branches:
5
+ - master
6
6
  pull_request:
7
- branches: "*"
7
+ branches:
8
+ - master
8
9
 
9
10
  jobs:
10
11
  test:
11
-
12
12
  runs-on: ubuntu-latest
13
13
  strategy:
14
14
  matrix:
@@ -17,9 +17,10 @@ jobs:
17
17
  - "2.6"
18
18
  - "2.7"
19
19
  - "3.0"
20
+ - "3.1"
20
21
 
21
22
  steps:
22
- - uses: actions/checkout@v2
23
+ - uses: actions/checkout@v3
23
24
  - name: Set up Ruby
24
25
  uses: ruby/setup-ruby@v1
25
26
  with:
data/.rubocop.yml CHANGED
@@ -6,17 +6,6 @@ AllCops:
6
6
  TargetRubyVersion: 2.5
7
7
  NewCops: enable
8
8
 
9
- Style/StringLiterals:
10
- Enabled: true
11
- EnforcedStyle: double_quotes
12
-
13
- Metrics/ClassLength:
14
- Enabled: true
15
- Max: 150
16
-
17
- Naming/MethodParameterName:
18
- Enabled: false
19
-
20
9
  Metrics/MethodLength:
21
10
  Enabled: false
22
11
 
@@ -25,9 +14,3 @@ Metrics/AbcSize:
25
14
 
26
15
  Style/Documentation:
27
16
  Enabled: false
28
-
29
- Style/ParallelAssignment:
30
- Enabled: false
31
-
32
- Minitest/AssertInDelta:
33
- Enabled: false
data/CHANGELOG.md CHANGED
@@ -1,6 +1,15 @@
1
1
  # Changelog
2
2
  All notable changes to this project will be documented in this file.
3
3
 
4
+ ## v0.5.0
5
+ ### Changed
6
+ - Switched generated code from `struct` to `class`.
7
+ - SwiftUI: Use `Color(uiColor:)` initializer when running on iOS 15+.
8
+
9
+ ## v0.4.0
10
+ ### Added
11
+ - Added support for color descriptions.
12
+
4
13
  ## v0.3.1
5
14
  ### Changed
6
15
  - Increased precision of HEX color conversion to avoid truncation.
data/Gemfile CHANGED
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- source "https://rubygems.org"
3
+ source 'https://rubygems.org'
4
4
 
5
5
  gemspec
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- stylegen (0.3.1)
4
+ stylegen (0.5.0)
5
5
  dry-inflector (~> 0.2.0)
6
6
  gli (~> 2.1)
7
7
  json_schemer (~> 0.2.0)
@@ -13,9 +13,9 @@ GEM
13
13
  dry-inflector (0.2.0)
14
14
  ecma-re-validator (0.3.0)
15
15
  regexp_parser (~> 2.0)
16
- gli (2.20.1)
16
+ gli (2.21.0)
17
17
  hana (1.3.7)
18
- json_schemer (0.2.18)
18
+ json_schemer (0.2.24)
19
19
  ecma-re-validator (~> 0.3)
20
20
  hana (~> 1.3)
21
21
  regexp_parser (~> 2.0)
data/README.md CHANGED
@@ -68,6 +68,7 @@ colors:
68
68
  alpha: 0.6
69
69
 
70
70
  primary_background:
71
+ description: The color for the main background of your interface.
71
72
  light: "#FFFFFF"
72
73
  dark:
73
74
  # Value for base (non-elevated) level
data/Rakefile CHANGED
@@ -1,8 +1,8 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "bundler/gem_tasks"
4
- require "rake/testtask"
5
- require "rubocop/rake_task"
3
+ require 'bundler/gem_tasks'
4
+ require 'rake/testtask'
5
+ require 'rubocop/rake_task'
6
6
 
7
7
  Rake::TestTask.new
8
8
  RuboCop::RakeTask.new
data/bin/stylegen CHANGED
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env ruby
2
2
  # frozen_string_literal: true
3
3
 
4
- require "stylegen/cli"
4
+ require 'stylegen/cli'
5
5
 
6
6
  exit Stylegen::CLI::App.run(ARGV)
@@ -1,17 +1,17 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "yaml"
4
- require "gli"
3
+ require 'yaml'
4
+ require 'gli'
5
5
 
6
- require "stylegen/validator"
7
- require "stylegen/generator"
6
+ require 'stylegen/validator'
7
+ require 'stylegen/generator'
8
8
 
9
9
  module Stylegen
10
10
  module CLI
11
11
  class App
12
12
  extend GLI::App
13
13
 
14
- program_desc "CLI tool for managing colors in iOS apps"
14
+ program_desc 'CLI tool for managing colors in iOS apps'
15
15
 
16
16
  version Stylegen::VERSION
17
17
 
@@ -19,30 +19,30 @@ module Stylegen
19
19
 
20
20
  # Commands
21
21
 
22
- desc "Generates a sample theme.yaml file in the current directory"
22
+ desc 'Generates a sample theme.yaml file in the current directory'
23
23
  command :init do |c|
24
24
  c.action do
25
- exit_now!("'theme.yaml' already exists!") if File.exist?("theme.yaml")
25
+ exit_now!("'theme.yaml' already exists!") if File.exist?('theme.yaml')
26
26
 
27
- template = File.read(File.join(__dir__, "template.yaml"))
28
- File.write("theme.yaml", template)
27
+ template = File.read(File.join(__dir__, 'template.yaml'))
28
+ File.write('theme.yaml', template)
29
29
 
30
30
  puts "Generated 'theme.yaml'."
31
31
  end
32
32
  end
33
33
 
34
- desc "Generates the Swift colors file"
34
+ desc 'Generates the Swift colors file'
35
35
  command :build do |c|
36
36
  c.action do
37
- exit_now!("'theme.yaml' not found. Create one with 'stylegen init'.") unless File.exist?("theme.yaml")
37
+ exit_now!("'theme.yaml' not found. Create one with 'stylegen init'.") unless File.exist?('theme.yaml')
38
38
 
39
- data = File.open("theme.yaml") { |file| YAML.safe_load(file) }
39
+ data = File.open('theme.yaml') { |file| YAML.safe_load(file) }
40
40
 
41
41
  validator = Validator.new
42
42
 
43
43
  unless validator.valid?(data)
44
44
  message = []
45
- message << "theme.yaml contains one or more errors:"
45
+ message << 'theme.yaml contains one or more errors:'
46
46
 
47
47
  validator.validate(data).each do |e|
48
48
  message << " #{e}"
@@ -37,6 +37,8 @@ colors:
37
37
  alpha: 0.6
38
38
 
39
39
  primary_background:
40
+ # Use `description` to document your colors (optional).
41
+ description: The color for the main background of your interface.
40
42
  light: "#FFFFFF"
41
43
  dark:
42
44
  # Value for base (non-elevated) level
data/lib/stylegen/cli.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "stylegen/cli/app"
3
+ require 'stylegen/cli/app'
@@ -2,12 +2,15 @@
2
2
 
3
3
  module Stylegen
4
4
  class BaseElevatedColor
5
+ attr_reader :description
6
+
5
7
  def initialize(base, elevated)
6
- @base, @elevated = base, elevated
8
+ @base = base
9
+ @elevated = elevated
7
10
  end
8
11
 
9
12
  def to_s(struct_name, indent = 0)
10
- indent_prefix = " " * indent
13
+ indent_prefix = ' ' * indent
11
14
 
12
15
  result = []
13
16
  result << "#{struct_name}("
@@ -4,8 +4,13 @@ module Stylegen
4
4
  class Color
5
5
  attr_reader :red, :green, :blue, :alpha
6
6
 
7
- def initialize(r, g, b, a)
8
- @red, @green, @blue, @alpha = r, g, b, a
7
+ MAX_PRECISION = 16
8
+
9
+ def initialize(red, green, blue, alpha)
10
+ @red = red
11
+ @green = green
12
+ @blue = blue
13
+ @alpha = alpha
9
14
  end
10
15
 
11
16
  def self.from_hex(hex, alpha = nil)
@@ -21,9 +26,12 @@ module Stylegen
21
26
  raise ArgumentError, "Invalid color syntax: #{hex}"
22
27
  end
23
28
 
24
- max_precision = 16
25
-
26
- Color.new(r.round(max_precision), g.round(max_precision), b.round(max_precision), alpha || 1.0)
29
+ Color.new(
30
+ r.round(MAX_PRECISION),
31
+ g.round(MAX_PRECISION),
32
+ b.round(MAX_PRECISION),
33
+ alpha || 1.0
34
+ )
27
35
  end
28
36
 
29
37
  def grayscale?
@@ -34,7 +42,7 @@ module Stylegen
34
42
  if grayscale?
35
43
  "#{struct_name}(white: #{@red}, alpha: #{@alpha})"
36
44
  else
37
- indent_prefix = " " * indent
45
+ indent_prefix = ' ' * indent
38
46
 
39
47
  result = []
40
48
  result << "#{struct_name}("
@@ -3,11 +3,12 @@
3
3
  module Stylegen
4
4
  class LightDarkColor
5
5
  def initialize(light, dark)
6
- @light, @dark = light, dark
6
+ @light = light
7
+ @dark = dark
7
8
  end
8
9
 
9
10
  def to_s(struct_name, indent = 0)
10
- indent_prefix = " " * indent
11
+ indent_prefix = ' ' * indent
11
12
 
12
13
  result = []
13
14
  result << "#{struct_name}("
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "stylegen/colors/color"
4
- require "stylegen/colors/light_dark_color"
5
- require "stylegen/colors/base_elevated_color"
3
+ require 'stylegen/colors/color'
4
+ require 'stylegen/colors/light_dark_color'
5
+ require 'stylegen/colors/base_elevated_color'
data/lib/stylegen/data.rb CHANGED
@@ -1,8 +1,8 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "dry/inflector"
4
- require "stylegen/version"
5
- require "stylegen/colors"
3
+ require 'dry/inflector'
4
+ require 'stylegen/version'
5
+ require 'stylegen/colors'
6
6
 
7
7
  module Stylegen
8
8
  class Data
@@ -14,12 +14,31 @@ module Stylegen
14
14
  @inflector ||= Dry::Inflector.new
15
15
  end
16
16
 
17
+ def file_header
18
+ header = @data['header'] || <<~HEADER
19
+ //
20
+ // {{STYLEGEN_FILENAME}}
21
+ //
22
+ // Autogenerated by stylegen ({{STYLEGEN_VERSION}})
23
+ // DO NOT EDIT
24
+ //
25
+ HEADER
26
+
27
+ replacements = {
28
+ 'STYLEGEN_FILENAME' => basename,
29
+ 'STYLEGEN_VERSION' => version,
30
+ 'STYLEGEN_YEAR' => Date.today.year
31
+ }
32
+
33
+ header.strip.gsub(/{{(\w+)}}/) { replacements[Regexp.last_match(1)] || '' }
34
+ end
35
+
17
36
  def version
18
37
  Stylegen::VERSION
19
38
  end
20
39
 
21
40
  def system_name
22
- @data["system_name"] || "Theme"
41
+ @data['system_name'] || 'Theme'
23
42
  end
24
43
 
25
44
  def util_method_name
@@ -27,28 +46,36 @@ module Stylegen
27
46
  end
28
47
 
29
48
  def output_path
30
- @data["output_path"]
49
+ @data['output_path']
31
50
  end
32
51
 
33
52
  def swiftui?
34
- @data["swiftui"] || false
53
+ @data['swiftui'] || false
35
54
  end
36
55
 
37
56
  def basename
38
- File.basename(@data["output_path"])
57
+ File.basename(@data['output_path'])
39
58
  end
40
59
 
41
60
  def access_level
42
- @data["access_level"] || "internal"
61
+ @data['access_level'] || 'internal'
62
+ end
63
+
64
+ def effective_access_level
65
+ access_level == 'internal' ? '' : "#{access_level} "
43
66
  end
44
67
 
45
68
  def struct_name
46
69
  "#{system_name}Color"
47
70
  end
48
71
 
49
- def colors
50
- @colors ||= @data["colors"].map do |key, value|
51
- [inflector.camelize_lower(key), generate_color(value)]
72
+ def color_entries
73
+ @color_entries ||= @data['colors'].map do |key, value|
74
+ {
75
+ property: inflector.camelize_lower(key),
76
+ description: value['description'],
77
+ color: generate_color(value)
78
+ }
52
79
  end
53
80
  end
54
81
 
@@ -57,17 +84,17 @@ module Stylegen
57
84
  def generate_color(data)
58
85
  if data.is_a?(String)
59
86
  Color.from_hex(data)
60
- elsif data.key?("color")
61
- Color.from_hex(data["color"], data["alpha"])
62
- elsif data.key?("light")
87
+ elsif data.key?('color')
88
+ Color.from_hex(data['color'], data['alpha'])
89
+ elsif data.key?('light')
63
90
  LightDarkColor.new(
64
- generate_color(data["light"]),
65
- generate_color(data["dark"])
91
+ generate_color(data['light']),
92
+ generate_color(data['dark'])
66
93
  )
67
- elsif data.key?("base")
94
+ elsif data.key?('base')
68
95
  BaseElevatedColor.new(
69
- generate_color(data["base"]),
70
- generate_color(data["elevated"])
96
+ generate_color(data['base']),
97
+ generate_color(data['elevated'])
71
98
  )
72
99
  end
73
100
  end
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "stylegen/data"
4
- require "stylegen/template"
3
+ require 'stylegen/data'
4
+ require 'stylegen/template'
5
5
 
6
6
  module Stylegen
7
7
  class Generator
@@ -10,16 +10,15 @@ module Stylegen
10
10
  end
11
11
 
12
12
  def generate
13
- template_content = File.read(File.join(__dir__, "resources/template.swift.erb"))
14
- template = Template.new(template_content, @data)
13
+ template = Template.new(@data)
15
14
 
16
- file = File.open(@data.output_path, "w")
15
+ file = File.open(@data.output_path, 'w')
17
16
  file << template.render
18
17
  file.close
19
18
  end
20
19
 
21
20
  def stats
22
- @stats ||= { output_path: @data.output_path, color_count: @data.colors.count }
21
+ @stats ||= { output_path: @data.output_path, color_count: @data.color_entries.count }
23
22
  end
24
23
  end
25
24
  end
@@ -26,6 +26,9 @@
26
26
  "Color": {
27
27
  "type": "object",
28
28
  "properties": {
29
+ "description": {
30
+ "type": "string"
31
+ },
29
32
  "color": {
30
33
  "$ref": "#/definitions/HexColor"
31
34
  },
@@ -41,6 +44,9 @@
41
44
  "BaseElevatedColor": {
42
45
  "type": "object",
43
46
  "properties": {
47
+ "description": {
48
+ "type": "string"
49
+ },
44
50
  "base": {
45
51
  "$ref": "#/definitions/AbstractColor"
46
52
  },
@@ -54,6 +60,9 @@
54
60
  "LightDarkColor": {
55
61
  "type": "object",
56
62
  "properties": {
63
+ "description": {
64
+ "type": "string"
65
+ },
57
66
  "light": {
58
67
  "$ref": "#/definitions/AbstractColor"
59
68
  },
@@ -107,4 +116,4 @@
107
116
  "output_path",
108
117
  "colors"
109
118
  ]
110
- }
119
+ }
@@ -1,16 +1,166 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "erb"
4
-
5
3
  module Stylegen
4
+ # rubocop:disable Metrics/ClassLength
6
5
  class Template
7
- def initialize(content, data)
8
- @content = content
6
+ attr_reader :data
7
+
8
+ def initialize(data)
9
9
  @data = data
10
10
  end
11
11
 
12
12
  def render
13
- ERB.new(@content, nil, "-").result(binding)
13
+ result = []
14
+ result << render_header
15
+ result << render_imports
16
+ result << render_struct
17
+ result << render_colors
18
+ result << render_utils
19
+ result.join("\n")
20
+ end
21
+
22
+ private
23
+
24
+ def render_header
25
+ @data.file_header << "\n"
26
+ end
27
+
28
+ def render_imports
29
+ result = []
30
+ result << 'import UIKit'
31
+ result << 'import SwiftUI' if data.swiftui?
32
+ result << ''
33
+ result.join("\n")
34
+ end
35
+
36
+ def render_struct
37
+ <<~HEREDOC.lstrip
38
+ #{data.effective_access_level} final class #{data.struct_name} {
39
+
40
+ let rawValue: UIColor
41
+
42
+ private init(_ rawValue: UIColor) {
43
+ self.rawValue = rawValue
44
+ }
45
+
46
+ private convenience init(white: CGFloat, alpha: CGFloat) {
47
+ self.init(
48
+ UIColor(white: white, alpha: alpha)
49
+ )
50
+ }
51
+
52
+ private convenience init(red: CGFloat, green: CGFloat, blue: CGFloat, alpha: CGFloat) {
53
+ self.init(
54
+ UIColor(red: red, green: green, blue: blue, alpha: alpha)
55
+ )
56
+ }
57
+
58
+ private convenience init(light: #{data.struct_name}, dark: #{data.struct_name}) {
59
+ if #available(iOS 13.0, *) {
60
+ self.init(
61
+ UIColor(dynamicProvider: { (traits: UITraitCollection) -> UIColor in
62
+ switch traits.userInterfaceStyle {
63
+ case .dark:
64
+ return dark.rawValue
65
+ default:
66
+ return light.rawValue
67
+ }
68
+ })
69
+ )
70
+ } else {
71
+ self.init(light.rawValue)
72
+ }
73
+ }
74
+
75
+ private convenience init(base: #{data.struct_name}, elevated: #{data.struct_name}) {
76
+ if #available(iOS 13.0, *) {
77
+ self.init(
78
+ UIColor(dynamicProvider: { (traits: UITraitCollection) -> UIColor in
79
+ switch traits.userInterfaceLevel {
80
+ case .elevated:
81
+ return elevated.rawValue
82
+ default:
83
+ return base.rawValue
84
+ }
85
+ })
86
+ )
87
+ } else {
88
+ self.init(base.rawValue)
89
+ }
90
+ }
91
+
92
+ }
93
+ HEREDOC
94
+ end
95
+
96
+ def render_colors
97
+ result = []
98
+ result << '// MARK: Colors'
99
+ result << ''
100
+ result << "#{data.effective_access_level} extension #{data.struct_name} {".lstrip
101
+ result << ''
102
+
103
+ data.color_entries.each do |entry|
104
+ unless entry[:description].nil?
105
+ entry[:description].strip.lines.each do |line|
106
+ result << " /// #{line.strip}"
107
+ end
108
+ end
109
+
110
+ result << " static let #{entry[:property]} = #{entry[:color].to_s(data.struct_name, 4)}\n"
111
+ end
112
+
113
+ result << '}'
114
+ result << ''
115
+ result.join("\n")
116
+ end
117
+
118
+ def render_utils
119
+ result = []
120
+ result << '// MARK: Utils'
121
+ result << ''
122
+
123
+ if data.swiftui?
124
+ result << <<~HEREDOC.lstrip
125
+ #{data.effective_access_level} extension Color {
126
+
127
+ @inline(__always)
128
+ static func #{data.util_method_name}(_ color: #{data.struct_name}) -> Color {
129
+ if #available(iOS 15.0, *) {
130
+ return Color(uiColor: color.rawValue)
131
+ } else {
132
+ return Color(color.rawValue)
133
+ }
134
+ }
135
+
136
+ }
137
+ HEREDOC
138
+ end
139
+
140
+ result << <<~HEREDOC.lstrip
141
+ #{data.effective_access_level} extension UIColor {
142
+
143
+ @inline(__always)
144
+ static func #{data.util_method_name}(_ color: #{data.struct_name}) -> UIColor {
145
+ return color.rawValue
146
+ }
147
+
148
+ }
149
+ HEREDOC
150
+
151
+ result << <<~HEREDOC.lstrip
152
+ #{data.effective_access_level} extension CGColor {
153
+
154
+ @inline(__always)
155
+ static func #{data.util_method_name}(_ color: #{data.struct_name}) -> CGColor {
156
+ return color.rawValue.cgColor
157
+ }
158
+
159
+ }
160
+ HEREDOC
161
+
162
+ result.join("\n")
14
163
  end
15
164
  end
165
+ # rubocop:enable Metrics/ClassLength
16
166
  end
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "json_schemer"
3
+ require 'json_schemer'
4
4
 
5
5
  module Stylegen
6
6
  class Validator
@@ -12,7 +12,7 @@ module Stylegen
12
12
  errors = []
13
13
 
14
14
  schema.validate(config).each do |v|
15
- errors << JSONSchemer::Errors.pretty(v) unless v["type"] == "schema"
15
+ errors << JSONSchemer::Errors.pretty(v) unless v['type'] == 'schema'
16
16
  end
17
17
 
18
18
  errors
@@ -21,7 +21,7 @@ module Stylegen
21
21
  private
22
22
 
23
23
  def schema
24
- @schema ||= JSONSchemer.schema(File.read(File.join(__dir__, "resources/schema.json")))
24
+ @schema ||= JSONSchemer.schema(File.read(File.join(__dir__, 'resources/schema.json')))
25
25
  end
26
26
  end
27
27
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Stylegen
4
- VERSION = "0.3.1"
4
+ VERSION = '0.5.0'
5
5
  end
data/lib/stylegen.rb CHANGED
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "stylegen/version"
4
- require "stylegen/colors"
5
- require "stylegen/generator"
6
- require "stylegen/data"
7
- require "stylegen/validator"
3
+ require 'stylegen/version'
4
+ require 'stylegen/colors'
5
+ require 'stylegen/generator'
6
+ require 'stylegen/data'
7
+ require 'stylegen/validator'
data/stylegen.gemspec CHANGED
@@ -1,31 +1,31 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "./lib/stylegen/version"
3
+ require './lib/stylegen/version'
4
4
 
5
5
  Gem::Specification.new do |s|
6
- s.name = "stylegen"
6
+ s.name = 'stylegen'
7
7
  s.version = Stylegen::VERSION
8
8
  s.platform = Gem::Platform::RUBY
9
- s.authors = ["Ramon Torres"]
10
- s.email = ["raymondjavaxx@gmail.com"]
11
- s.homepage = "https://github.com/raymondjavaxx/stylegen"
12
- s.description = s.summary = "Tool for generating styling code for iOS apps"
9
+ s.authors = ['Ramon Torres']
10
+ s.email = ['raymondjavaxx@gmail.com']
11
+ s.homepage = 'https://github.com/raymondjavaxx/stylegen'
12
+ s.description = s.summary = 'Tool for generating styling code for iOS apps'
13
13
  s.files = `git ls-files`.split("\n")
14
14
  s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
15
15
  s.executables = `git ls-files -- bin/*`.split("\n").map { |f| File.basename(f) }
16
- s.require_paths = ["lib"]
17
- s.license = "MIT"
16
+ s.require_paths = ['lib']
17
+ s.license = 'MIT'
18
18
 
19
- s.add_runtime_dependency "dry-inflector", "~> 0.2.0"
20
- s.add_runtime_dependency "gli", "~> 2.1"
21
- s.add_runtime_dependency "json_schemer", "~> 0.2.0"
19
+ s.add_runtime_dependency 'dry-inflector', '~> 0.2.0'
20
+ s.add_runtime_dependency 'gli', '~> 2.1'
21
+ s.add_runtime_dependency 'json_schemer', '~> 0.2.0'
22
22
 
23
- s.add_development_dependency "bundler"
24
- s.add_development_dependency "minitest", "~> 5.14"
25
- s.add_development_dependency "rake"
26
- s.add_development_dependency "rubocop"
27
- s.add_development_dependency "rubocop-minitest"
28
- s.add_development_dependency "rubocop-rake"
23
+ s.add_development_dependency 'bundler'
24
+ s.add_development_dependency 'minitest', '~> 5.14'
25
+ s.add_development_dependency 'rake'
26
+ s.add_development_dependency 'rubocop'
27
+ s.add_development_dependency 'rubocop-minitest'
28
+ s.add_development_dependency 'rubocop-rake'
29
29
 
30
- s.required_ruby_version = ">= 2.5.0"
30
+ s.required_ruby_version = '>= 2.5.0'
31
31
  end
data/test/helper.rb CHANGED
@@ -1,8 +1,8 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- gem "minitest"
3
+ gem 'minitest'
4
4
 
5
- require "minitest/pride"
6
- require "minitest/autorun"
5
+ require 'minitest/pride'
6
+ require 'minitest/autorun'
7
7
 
8
- require_relative "../lib/stylegen"
8
+ require_relative '../lib/stylegen'
@@ -1,12 +1,12 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative "helper"
3
+ require_relative 'helper'
4
4
 
5
5
  class TestBaseElevatedColor < MiniTest::Test
6
6
  def test_to_string
7
7
  color = Stylegen::BaseElevatedColor.new(
8
- Stylegen::Color.from_hex("#000000"),
9
- Stylegen::Color.from_hex("#333333")
8
+ Stylegen::Color.from_hex('#000000'),
9
+ Stylegen::Color.from_hex('#333333')
10
10
  )
11
11
 
12
12
  # Default indentation
@@ -18,7 +18,7 @@ class TestBaseElevatedColor < MiniTest::Test
18
18
  )
19
19
  CODE
20
20
 
21
- assert_equal expected, color.to_s("ThemeColor")
21
+ assert_equal expected, color.to_s('ThemeColor')
22
22
 
23
23
  # Additional indentation
24
24
 
@@ -29,6 +29,6 @@ class TestBaseElevatedColor < MiniTest::Test
29
29
  )
30
30
  CODE
31
31
 
32
- assert_equal expected, color.to_s("ThemeColor", 4)
32
+ assert_equal expected, color.to_s('ThemeColor', 4)
33
33
  end
34
34
  end
data/test/test_color.rb CHANGED
@@ -1,40 +1,40 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative "helper"
3
+ require_relative 'helper'
4
4
 
5
5
  class TestColor < MiniTest::Test
6
6
  def test_parsing
7
- color = Stylegen::Color.from_hex("#FF8000")
8
- assert_equal 1.0, color.red
9
- assert_equal 0.5019607843137255, color.green
10
- assert_equal 0.0, color.blue
11
- assert_equal 1.0, color.alpha
7
+ color = Stylegen::Color.from_hex('#FF8000')
8
+ assert_in_delta(1.0, color.red)
9
+ assert_in_delta(0.5019607843137255, color.green)
10
+ assert_in_delta(0.0, color.blue)
11
+ assert_in_delta(1.0, color.alpha)
12
12
 
13
13
  # Optional pound sign
14
- color = Stylegen::Color.from_hex("FF8000")
15
- assert_equal 1.0, color.red
16
- assert_equal 0.5019607843137255, color.green
17
- assert_equal 0.0, color.blue
18
- assert_equal 1.0, color.alpha
14
+ color = Stylegen::Color.from_hex('FF8000')
15
+ assert_in_delta(1.0, color.red)
16
+ assert_in_delta(0.5019607843137255, color.green)
17
+ assert_in_delta(0.0, color.blue)
18
+ assert_in_delta(1.0, color.alpha)
19
19
 
20
20
  # Specify alpha
21
- color = Stylegen::Color.from_hex("#FF8000", 0.5)
22
- assert_equal 0.5, color.alpha
21
+ color = Stylegen::Color.from_hex('#FF8000', 0.5)
22
+ assert_in_delta(0.5, color.alpha)
23
23
  end
24
24
 
25
25
  def test_parsing_shorthand_syntax
26
- color = Stylegen::Color.from_hex("#FC0")
27
- assert_equal 1.0, color.red
28
- assert_equal 0.8000000000000002, color.green
29
- assert_equal 0.0, color.blue
30
- assert_equal 1.0, color.alpha
26
+ color = Stylegen::Color.from_hex('#FC0')
27
+ assert_in_delta(1.0, color.red)
28
+ assert_in_delta(0.8000000000000002, color.green)
29
+ assert_in_delta(0.0, color.blue)
30
+ assert_in_delta(1.0, color.alpha)
31
31
 
32
32
  # Optional pound sign
33
- color = Stylegen::Color.from_hex("FC0")
34
- assert_equal 1.0, color.red
35
- assert_equal 0.8000000000000002, color.green
36
- assert_equal 0.0, color.blue
37
- assert_equal 1.0, color.alpha
33
+ color = Stylegen::Color.from_hex('FC0')
34
+ assert_in_delta(1.0, color.red)
35
+ assert_in_delta(0.8000000000000002, color.green)
36
+ assert_in_delta(0.0, color.blue)
37
+ assert_in_delta(1.0, color.alpha)
38
38
  end
39
39
 
40
40
  def test_grayscale
@@ -46,7 +46,7 @@ class TestColor < MiniTest::Test
46
46
  end
47
47
 
48
48
  def test_to_string
49
- color = Stylegen::Color.from_hex("#00FF00")
49
+ color = Stylegen::Color.from_hex('#00FF00')
50
50
 
51
51
  expected = <<~CODE.strip
52
52
  ThemeColor(
@@ -57,11 +57,11 @@ class TestColor < MiniTest::Test
57
57
  )
58
58
  CODE
59
59
 
60
- assert_equal expected, color.to_s("ThemeColor")
60
+ assert_equal expected, color.to_s('ThemeColor')
61
61
 
62
62
  # Grayscale
63
- color = Stylegen::Color.from_hex("#FFFFFF")
64
- expected = "ThemeColor(white: 1.0, alpha: 1.0)"
65
- assert_equal expected, color.to_s("ThemeColor")
63
+ color = Stylegen::Color.from_hex('#FFFFFF')
64
+ expected = 'ThemeColor(white: 1.0, alpha: 1.0)'
65
+ assert_equal expected, color.to_s('ThemeColor')
66
66
  end
67
67
  end
@@ -1,12 +1,12 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative "helper"
3
+ require_relative 'helper'
4
4
 
5
5
  class TestLightDarkColor < MiniTest::Test
6
6
  def test_to_string
7
7
  color = Stylegen::LightDarkColor.new(
8
- Stylegen::Color.from_hex("#FFFFFF"),
9
- Stylegen::Color.from_hex("#333333")
8
+ Stylegen::Color.from_hex('#FFFFFF'),
9
+ Stylegen::Color.from_hex('#333333')
10
10
  )
11
11
 
12
12
  # Default indentation
@@ -18,7 +18,7 @@ class TestLightDarkColor < MiniTest::Test
18
18
  )
19
19
  CODE
20
20
 
21
- assert_equal expected, color.to_s("ThemeColor")
21
+ assert_equal expected, color.to_s('ThemeColor')
22
22
 
23
23
  # Additional indentation
24
24
 
@@ -29,6 +29,6 @@ class TestLightDarkColor < MiniTest::Test
29
29
  )
30
30
  CODE
31
31
 
32
- assert_equal expected, color.to_s("ThemeColor", 4)
32
+ assert_equal expected, color.to_s('ThemeColor', 4)
33
33
  end
34
34
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: stylegen
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.1
4
+ version: 0.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ramon Torres
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-08-22 00:00:00.000000000 Z
11
+ date: 2022-12-15 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: dry-inflector
@@ -144,6 +144,7 @@ executables:
144
144
  extensions: []
145
145
  extra_rdoc_files: []
146
146
  files:
147
+ - ".deepsource.toml"
147
148
  - ".github/workflows/ci.yml"
148
149
  - ".gitignore"
149
150
  - ".rubocop.yml"
@@ -165,7 +166,6 @@ files:
165
166
  - lib/stylegen/data.rb
166
167
  - lib/stylegen/generator.rb
167
168
  - lib/stylegen/resources/schema.json
168
- - lib/stylegen/resources/template.swift.erb
169
169
  - lib/stylegen/template.rb
170
170
  - lib/stylegen/validator.rb
171
171
  - lib/stylegen/version.rb
@@ -193,7 +193,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
193
193
  - !ruby/object:Gem::Version
194
194
  version: '0'
195
195
  requirements: []
196
- rubygems_version: 3.0.3
196
+ rubygems_version: 3.1.2
197
197
  signing_key:
198
198
  specification_version: 4
199
199
  summary: Tool for generating styling code for iOS apps
@@ -1,97 +0,0 @@
1
- //
2
- // <%= @data.basename %>
3
- //
4
- // Autogenerated by stylegen (<%= @data.version %>)
5
- // DO NOT EDIT
6
- //
7
-
8
- import UIKit
9
- <% if @data.swiftui? -%>
10
- import SwiftUI
11
- <% end -%>
12
-
13
- <%= @data.access_level %> struct <%= @data.struct_name %> {
14
-
15
- let uiColor: UIColor
16
-
17
- fileprivate init(white: CGFloat, alpha: CGFloat) {
18
- self.uiColor = UIColor(white: white, alpha: alpha)
19
- }
20
-
21
- fileprivate init(red: CGFloat, green: CGFloat, blue: CGFloat, alpha: CGFloat) {
22
- self.uiColor = UIColor(red: red, green: green, blue: blue, alpha: alpha)
23
- }
24
-
25
- fileprivate init(_ color: UIColor) {
26
- self.uiColor = color
27
- }
28
-
29
- fileprivate init(light: <%= @data.struct_name %>, dark: <%= @data.struct_name %>) {
30
- if #available(iOS 13.0, *) {
31
- self.uiColor = UIColor(dynamicProvider: { (traits: UITraitCollection) -> UIColor in
32
- switch traits.userInterfaceStyle {
33
- case .dark:
34
- return dark.uiColor
35
- default:
36
- return light.uiColor
37
- }
38
- })
39
- } else {
40
- self.uiColor = light.uiColor
41
- }
42
- }
43
-
44
- fileprivate init(base: <%= @data.struct_name %>, elevated: <%= @data.struct_name %>) {
45
- if #available(iOS 13.0, *) {
46
- self.uiColor = UIColor(dynamicProvider: { (traits: UITraitCollection) -> UIColor in
47
- switch traits.userInterfaceLevel {
48
- case .elevated:
49
- return elevated.uiColor
50
- default:
51
- return base.uiColor
52
- }
53
- })
54
- } else {
55
- self.uiColor = base.uiColor
56
- }
57
- }
58
-
59
- }
60
-
61
- // MARK: Colors
62
-
63
- <%= @data.access_level %> extension <%= @data.struct_name %> {
64
- <% @data.colors.each do |member, color| %>
65
- static let <%= member %> = <%= color.to_s(@data.struct_name, 4) %>
66
- <% end %>
67
- }
68
-
69
- // MARK: - Extensions
70
- <% if @data.swiftui? %>
71
- <%= @data.access_level %> extension Color {
72
-
73
- @inline(__always)
74
- static func <%= @data.util_method_name %>(_ color: <%= @data.struct_name %>) -> Color {
75
- return Color(color.uiColor)
76
- }
77
-
78
- }
79
- <% end -%>
80
-
81
- <%= @data.access_level %> extension UIColor {
82
-
83
- @inline(__always)
84
- static func <%= @data.util_method_name %>(_ color: <%= @data.struct_name %>) -> UIColor {
85
- return color.uiColor
86
- }
87
-
88
- }
89
-
90
- <%= @data.access_level %> extension CGColor {
91
-
92
- @inline(__always)
93
- static func <%= @data.util_method_name %>(_ color: <%= @data.struct_name %>) -> CGColor {
94
- return color.uiColor.cgColor
95
- }
96
-
97
- }