procreate-swatches 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (51) hide show
  1. checksums.yaml +7 -0
  2. data/.codeclimate.yml +7 -0
  3. data/.gitignore +16 -0
  4. data/.rspec +2 -0
  5. data/.rubocop.yml +8 -0
  6. data/.ruby-version +1 -0
  7. data/.travis.yml +19 -0
  8. data/.yardopts +5 -0
  9. data/CODE_OF_CONDUCT.md +74 -0
  10. data/Gemfile +6 -0
  11. data/Gemfile.lock +102 -0
  12. data/LICENSE.txt +21 -0
  13. data/README.md +230 -0
  14. data/Rakefile +8 -0
  15. data/bin/console +14 -0
  16. data/bin/setup +8 -0
  17. data/doc/Procreate/Swatches/ColorsHelper.html +693 -0
  18. data/doc/Procreate/Swatches/Errors/InvalidFormat.html +220 -0
  19. data/doc/Procreate/Swatches/Errors/InvalidPath.html +220 -0
  20. data/doc/Procreate/Swatches/Errors.html +128 -0
  21. data/doc/Procreate/Swatches/Exporter.html +754 -0
  22. data/doc/Procreate/Swatches/Parser.html +622 -0
  23. data/doc/Procreate/Swatches/Wrapper.html +1168 -0
  24. data/doc/Procreate/Swatches.html +497 -0
  25. data/doc/Procreate.html +128 -0
  26. data/doc/_index.html +209 -0
  27. data/doc/class_list.html +51 -0
  28. data/doc/css/common.css +1 -0
  29. data/doc/css/full_list.css +58 -0
  30. data/doc/css/style.css +496 -0
  31. data/doc/file.CODE_OF_CONDUCT.html +146 -0
  32. data/doc/file.LICENSE.html +70 -0
  33. data/doc/file.README.html +296 -0
  34. data/doc/file_list.html +66 -0
  35. data/doc/frames.html +17 -0
  36. data/doc/index.html +296 -0
  37. data/doc/js/app.js +292 -0
  38. data/doc/js/full_list.js +216 -0
  39. data/doc/js/jquery.js +4 -0
  40. data/doc/method_list.html +275 -0
  41. data/doc/top-level-namespace.html +110 -0
  42. data/lib/procreate/swatches/colors_helper.rb +83 -0
  43. data/lib/procreate/swatches/errors/invalid_format.rb +19 -0
  44. data/lib/procreate/swatches/errors/invalid_path.rb +16 -0
  45. data/lib/procreate/swatches/exporter.rb +131 -0
  46. data/lib/procreate/swatches/parser.rb +82 -0
  47. data/lib/procreate/swatches/version.rb +8 -0
  48. data/lib/procreate/swatches/wrapper.rb +155 -0
  49. data/lib/procreate/swatches.rb +60 -0
  50. data/procreate-swatches.gemspec +41 -0
  51. metadata +275 -0
@@ -0,0 +1,82 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'zip'
4
+
5
+ module Procreate
6
+ module Swatches
7
+ #
8
+ # The class that handles the parsing of a +.swatches+ file to
9
+ # an instance of {Procreate::Swatches::Wrapper}.
10
+ #
11
+ class Parser
12
+ include CallableClass
13
+ include ColorsHelper
14
+
15
+ # @!method self.call
16
+ # Creates a new instance of {Procreate::Swatches::Parser} and calls {#call}
17
+ # Dynamically included by using {https://github.com/laurentzziu/callable_class CallableClass} gem.
18
+
19
+ # @!attribute [r] wrapper
20
+ # @return [Procreate::Swatches::Wrapper]
21
+ attr_reader :wrapper
22
+
23
+ # @!attribute [r] file_path
24
+ # @return [String] The path of the +.swatches+ file
25
+ attr_reader :file_path
26
+
27
+ #
28
+ # Initialize a new instance of {Procreate::Swatches::Parser}
29
+ #
30
+ # @param [String] file_path The path of the +.swatches+ file
31
+ #
32
+ # @raise [Procreate::Swatches::Errors::InvalidPath] Error raised when the provided path is invalid
33
+ # @raise [Procreate::Swatches::Errors::InvalidFormat] Error raised when the provided path contains a file with an invalid format (accepted format: +.swatches+)
34
+ #
35
+ def initialize(file_path)
36
+ @file_path = file_path
37
+
38
+ validate!
39
+ end
40
+
41
+ #
42
+ # Process the provided +.swatches+ file and wrap the content in
43
+ # a {Procreate::Swatches::Wrapper}
44
+ #
45
+ # @return [Procreate::Swatches::Wrapper] A wrapper instance for the +.swatches+ file
46
+ #
47
+ def call
48
+ unzip
49
+ wrap_colors
50
+ end
51
+
52
+ private
53
+
54
+ def unzip
55
+ zip_file = Zip::File.open(@file_path)
56
+ entry = zip_file.glob(SWATCHES_FILE_NAME).first
57
+ raw_content = entry.get_input_stream.read
58
+ @content = JSON.parse(raw_content).first
59
+ end
60
+
61
+ def wrap_colors
62
+ name = @content['name']
63
+ colors = @content['swatches']
64
+
65
+ colors = colors.compact.map do |color|
66
+ string = to_chroma_hsv(color)
67
+ Chroma::Color.new(string)
68
+ end
69
+
70
+ @wrapper = Wrapper.new(name, colors)
71
+ end
72
+
73
+ SWATCHES_FILE_REGEXP = /\.swatches\z/.freeze
74
+
75
+ def validate!
76
+ raise(Errors::InvalidPath) unless file_path.present? && File.exist?(file_path) && File.file?(file_path)
77
+
78
+ raise(Errors::InvalidFormat) unless file_path.match(SWATCHES_FILE_REGEXP).present?
79
+ end
80
+ end
81
+ end
82
+ end
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Procreate
4
+ module Swatches
5
+ # Current gem version
6
+ VERSION = '0.1.0'
7
+ end
8
+ end
@@ -0,0 +1,155 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Procreate
4
+ module Swatches
5
+ #
6
+ # Wrapper class for the name and colors of a +.swatches+ file.
7
+ #
8
+ class Wrapper
9
+ include ColorsHelper
10
+
11
+ # @!attribute name
12
+ # @return [String] Name of the swatches palette
13
+ attr_accessor :name
14
+ # @!attribute [w] colors
15
+ # @return [Array<Chroma::Color, String>] Colors array
16
+ attr_writer :colors
17
+
18
+ # The default name, used in case a custom name is not provided
19
+ DEFAULT_SWATCHES_NAME = 'My beautiful palette'
20
+
21
+ #
22
+ # Initialize a new instance of {Procreate::Swatches::Wrapper}
23
+ #
24
+ # @param [String] name Name of the swatches palette
25
+ # @param [Array<Chroma::Color, String>] colors Colors array. Each color will be converted to a {https://github.com/jfairbank/chroma Chroma::Color} instance.
26
+ #
27
+ def initialize(name, colors)
28
+ @name = name.present? ? name : DEFAULT_SWATCHES_NAME
29
+
30
+ @colors ||= []
31
+ Array(colors).each { |color| add_color(color) }
32
+ end
33
+
34
+ #
35
+ # Add a new color to the colors array.
36
+ # It will be converted to a {https://github.com/jfairbank/chroma Chroma::Color} instance.
37
+ #
38
+ # @param [Chroma::Color, String] color Color in a supported format.
39
+ #
40
+ # @return [Array<Chroma::Color>] The current colors available in the wrapper.
41
+ #
42
+ def <<(color)
43
+ add_color(color)
44
+ end
45
+
46
+ alias push <<
47
+
48
+ #
49
+ # Remove the last color from the colors array.
50
+ #
51
+ # @return [Array<Chroma::Color>] The current colors available in the wrapper.
52
+ #
53
+ def pop
54
+ @colors.pop
55
+ end
56
+
57
+ # Available formats to return the colors as. These types are supported by {https://github.com/jfairbank/chroma Chroma::Color}
58
+ AVAILABLE_COLOR_FORMATS = %i[hsv hsl hex hex8 rgb name].freeze
59
+
60
+ #
61
+ # Returns the list of available color formats a color
62
+ # can be retrieved into.
63
+ #
64
+ # @return [Array<Symbol>] The list of available formats a color can be retrived into.
65
+ #
66
+ def available_color_formats
67
+ AVAILABLE_COLOR_FORMATS
68
+ end
69
+
70
+ #
71
+ # Attribute reader for colors.
72
+ # It supports returning the colors in different formats.
73
+ # If not format is provided, an array of {https://github.com/jfairbank/chroma Chroma::Color}s is returned.
74
+ # If an invalid format is provided, it will fallback to the default format.
75
+ #
76
+ # @param [String, Symbol] format Format to return the colors array in.
77
+ #
78
+ # @return [Array<Chroma::Color>] Return an array of {https://github.com/jfairbank/chroma Chroma::Color} when no format is provided. This is the default option.
79
+ # @return [Array<String>] Return an array of +Strings+, in the specified format.
80
+ #
81
+ def colors(format: nil)
82
+ format = format.to_sym unless format.nil?
83
+ format = nil unless format.in?(AVAILABLE_COLOR_FORMATS)
84
+
85
+ return @colors if format.nil?
86
+
87
+ @colors.map do |color|
88
+ color.send("to_#{format}")
89
+ end
90
+ end
91
+
92
+ #
93
+ # Convert the wrapper to the JSON format needed to create a
94
+ # +.swatches+ file.
95
+ # A maximum of 30 ({Procreate::Swatches::ColorsHelper::SWATCHES_MAX_SIZE}) colors is returned.
96
+ # This is a limitation of Procreate.
97
+ #
98
+ # @return [String] Wrapper content, in JSON format.
99
+ #
100
+ def to_json(*_args)
101
+ [
102
+ {
103
+ name: @name,
104
+ swatches: colors_to_json
105
+ }
106
+ ].to_json
107
+ end
108
+
109
+ alias to_swatches to_json
110
+ alias to_procreate to_json
111
+
112
+ #
113
+ # Export the wrapper to a +.swatches+ file
114
+ #
115
+ # @param [<Type>] options All options suported by {Procreate::Swatches::Exporter#initialize}
116
+ #
117
+ # @return [String] swatches_path Path of the exported +.swatches+ file
118
+ #
119
+ def to_file(options = {})
120
+ Exporter.call(self, options)
121
+ end
122
+
123
+ alias export to_file
124
+
125
+ # @todo Check if the colors array is the same (regardless of order)
126
+ #
127
+ # Wrapper file comparison.
128
+ # It check for the same class, name and colors array
129
+ #
130
+ # @param [Procreate::Swatches::Wrapper] other Another wrapper instance
131
+ #
132
+ # @return [Boolean] The wrappers are equal
133
+ #
134
+ def ==(other)
135
+ other.is_a?(self.class) && name == other.name && colors == other.colors
136
+ end
137
+
138
+ private
139
+
140
+ def add_color(color)
141
+ color = prepare_color_for_push(color)
142
+
143
+ @colors << color unless color.nil?
144
+
145
+ @colors
146
+ end
147
+
148
+ def colors_to_json
149
+ @colors.first(SWATCHES_MAX_SIZE).map do |color|
150
+ to_swatches_json(color)
151
+ end
152
+ end
153
+ end
154
+ end
155
+ end
@@ -0,0 +1,60 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'chroma'
4
+ require 'callable_class'
5
+ require 'json'
6
+ require 'active_support/all'
7
+
8
+ require 'procreate/swatches/version'
9
+
10
+ require 'procreate/swatches/errors/invalid_format'
11
+ require 'procreate/swatches/errors/invalid_path'
12
+
13
+ require 'procreate/swatches/colors_helper'
14
+ require 'procreate/swatches/wrapper'
15
+ require 'procreate/swatches/parser'
16
+ require 'procreate/swatches/exporter'
17
+
18
+ # All things {https://procreate.art Procreate} tools.
19
+ module Procreate
20
+ #
21
+ # Interact with +.swatches+ files ({https://procreate.art Procreate}) and manipulate them.
22
+ #
23
+ module Swatches
24
+ # Internal name of the +.swatches+ file.
25
+ # Used for both parsing and exporting +.swatches+ files.
26
+ SWATCHES_FILE_NAME = 'Swatches.json'
27
+ class << self
28
+ #
29
+ # Parse a +.swatches+ file from the provided file path
30
+ #
31
+ # @param [String] file_path A file path to the +.swatches+ file
32
+ #
33
+ # @return [Procreate::Swatches::Wrapper] wrapper A wrapper instance to be further manipulated
34
+ #
35
+ def parse(file_path)
36
+ Parser.call(file_path)
37
+ end
38
+
39
+ #
40
+ # Export an array of colors to a +.swatches+ file, with the possibility to provide a custom palette name.
41
+ #
42
+ # @param [String] name Preferred name for the exported +.swatches+ file palette. Visible instance the Procreate app.
43
+ # @param [Array<String, Chroma::Color>] colors An array of valid color strings or {https://github.com/jfairbank/chroma Chroma::Color} instances
44
+ # @param [Hash] options Options for exporting the wrapper
45
+ # @option options [String] :export_directory ('Dir.pwd') The export directory for the +.swatches+ file
46
+ # @option options [String] :file_name ('Wrapper#name') Custom file name for the exported +.swatches+ file. If none is provided, the +name+ of the +wrapper+ instance is used
47
+ #
48
+ # @return [String] swatches_path Path of the exported +.swatches+ file
49
+ #
50
+ def export(name, colors, options = {})
51
+ wrapper = Wrapper.new(name, colors)
52
+
53
+ Exporter.call(wrapper, options)
54
+ end
55
+
56
+ alias from_file parse
57
+ alias to_file export
58
+ end
59
+ end
60
+ end
@@ -0,0 +1,41 @@
1
+ # frozen_string_literal: true
2
+
3
+ lib = File.expand_path('../lib', __FILE__)
4
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
5
+ require 'procreate/swatches/version'
6
+
7
+ Gem::Specification.new do |spec|
8
+ spec.name = 'procreate-swatches'
9
+ spec.version = Procreate::Swatches::VERSION
10
+ spec.authors = ['Florinel Gorgan']
11
+ spec.email = ['florin@floringorgan.com']
12
+
13
+ spec.summary = 'A gem to interact with Procreate .swatches files.'
14
+ spec.description = 'A gem to interact with Procreate .swatches files.'
15
+ spec.homepage = 'https://github.com/laurentzziu/procreate-swatches'
16
+ spec.license = 'MIT'
17
+
18
+ # Specify which files should be added to the gem when it is released.
19
+ # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
20
+ spec.files = Dir.chdir(File.expand_path('..', __FILE__)) do
21
+ `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
22
+ end
23
+ spec.bindir = 'exe'
24
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
25
+ spec.require_paths = ['lib']
26
+
27
+ spec.add_dependency 'callable_class', '~> 0.1.1'
28
+ spec.add_dependency 'chroma'
29
+ spec.add_dependency 'rubyzip', '>= 1.0.0'
30
+
31
+ spec.add_development_dependency 'activesupport'
32
+ spec.add_development_dependency 'bundler', '~> 2.0'
33
+ spec.add_development_dependency 'pry'
34
+ spec.add_development_dependency 'rake', '~> 10.0'
35
+ spec.add_development_dependency 'rspec', '~> 3.0'
36
+ spec.add_development_dependency 'rubocop'
37
+ spec.add_development_dependency 'rubocop-performance'
38
+ spec.add_development_dependency 'rubocop-rspec'
39
+ spec.add_development_dependency 'simplecov'
40
+ spec.add_development_dependency 'simplecov-console'
41
+ end
metadata ADDED
@@ -0,0 +1,275 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: procreate-swatches
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Florinel Gorgan
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2019-04-27 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: callable_class
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: 0.1.1
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: 0.1.1
27
+ - !ruby/object:Gem::Dependency
28
+ name: chroma
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rubyzip
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: 1.0.0
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: 1.0.0
55
+ - !ruby/object:Gem::Dependency
56
+ name: activesupport
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: bundler
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '2.0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '2.0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: pry
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: rake
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - "~>"
102
+ - !ruby/object:Gem::Version
103
+ version: '10.0'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - "~>"
109
+ - !ruby/object:Gem::Version
110
+ version: '10.0'
111
+ - !ruby/object:Gem::Dependency
112
+ name: rspec
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - "~>"
116
+ - !ruby/object:Gem::Version
117
+ version: '3.0'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - "~>"
123
+ - !ruby/object:Gem::Version
124
+ version: '3.0'
125
+ - !ruby/object:Gem::Dependency
126
+ name: rubocop
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - ">="
130
+ - !ruby/object:Gem::Version
131
+ version: '0'
132
+ type: :development
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - ">="
137
+ - !ruby/object:Gem::Version
138
+ version: '0'
139
+ - !ruby/object:Gem::Dependency
140
+ name: rubocop-performance
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - ">="
144
+ - !ruby/object:Gem::Version
145
+ version: '0'
146
+ type: :development
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - ">="
151
+ - !ruby/object:Gem::Version
152
+ version: '0'
153
+ - !ruby/object:Gem::Dependency
154
+ name: rubocop-rspec
155
+ requirement: !ruby/object:Gem::Requirement
156
+ requirements:
157
+ - - ">="
158
+ - !ruby/object:Gem::Version
159
+ version: '0'
160
+ type: :development
161
+ prerelease: false
162
+ version_requirements: !ruby/object:Gem::Requirement
163
+ requirements:
164
+ - - ">="
165
+ - !ruby/object:Gem::Version
166
+ version: '0'
167
+ - !ruby/object:Gem::Dependency
168
+ name: simplecov
169
+ requirement: !ruby/object:Gem::Requirement
170
+ requirements:
171
+ - - ">="
172
+ - !ruby/object:Gem::Version
173
+ version: '0'
174
+ type: :development
175
+ prerelease: false
176
+ version_requirements: !ruby/object:Gem::Requirement
177
+ requirements:
178
+ - - ">="
179
+ - !ruby/object:Gem::Version
180
+ version: '0'
181
+ - !ruby/object:Gem::Dependency
182
+ name: simplecov-console
183
+ requirement: !ruby/object:Gem::Requirement
184
+ requirements:
185
+ - - ">="
186
+ - !ruby/object:Gem::Version
187
+ version: '0'
188
+ type: :development
189
+ prerelease: false
190
+ version_requirements: !ruby/object:Gem::Requirement
191
+ requirements:
192
+ - - ">="
193
+ - !ruby/object:Gem::Version
194
+ version: '0'
195
+ description: A gem to interact with Procreate .swatches files.
196
+ email:
197
+ - florin@floringorgan.com
198
+ executables: []
199
+ extensions: []
200
+ extra_rdoc_files: []
201
+ files:
202
+ - ".codeclimate.yml"
203
+ - ".gitignore"
204
+ - ".rspec"
205
+ - ".rubocop.yml"
206
+ - ".ruby-version"
207
+ - ".travis.yml"
208
+ - ".yardopts"
209
+ - CODE_OF_CONDUCT.md
210
+ - Gemfile
211
+ - Gemfile.lock
212
+ - LICENSE.txt
213
+ - README.md
214
+ - Rakefile
215
+ - bin/console
216
+ - bin/setup
217
+ - doc/Procreate.html
218
+ - doc/Procreate/Swatches.html
219
+ - doc/Procreate/Swatches/ColorsHelper.html
220
+ - doc/Procreate/Swatches/Errors.html
221
+ - doc/Procreate/Swatches/Errors/InvalidFormat.html
222
+ - doc/Procreate/Swatches/Errors/InvalidPath.html
223
+ - doc/Procreate/Swatches/Exporter.html
224
+ - doc/Procreate/Swatches/Parser.html
225
+ - doc/Procreate/Swatches/Wrapper.html
226
+ - doc/_index.html
227
+ - doc/class_list.html
228
+ - doc/css/common.css
229
+ - doc/css/full_list.css
230
+ - doc/css/style.css
231
+ - doc/file.CODE_OF_CONDUCT.html
232
+ - doc/file.LICENSE.html
233
+ - doc/file.README.html
234
+ - doc/file_list.html
235
+ - doc/frames.html
236
+ - doc/index.html
237
+ - doc/js/app.js
238
+ - doc/js/full_list.js
239
+ - doc/js/jquery.js
240
+ - doc/method_list.html
241
+ - doc/top-level-namespace.html
242
+ - lib/procreate/swatches.rb
243
+ - lib/procreate/swatches/colors_helper.rb
244
+ - lib/procreate/swatches/errors/invalid_format.rb
245
+ - lib/procreate/swatches/errors/invalid_path.rb
246
+ - lib/procreate/swatches/exporter.rb
247
+ - lib/procreate/swatches/parser.rb
248
+ - lib/procreate/swatches/version.rb
249
+ - lib/procreate/swatches/wrapper.rb
250
+ - procreate-swatches.gemspec
251
+ homepage: https://github.com/laurentzziu/procreate-swatches
252
+ licenses:
253
+ - MIT
254
+ metadata: {}
255
+ post_install_message:
256
+ rdoc_options: []
257
+ require_paths:
258
+ - lib
259
+ required_ruby_version: !ruby/object:Gem::Requirement
260
+ requirements:
261
+ - - ">="
262
+ - !ruby/object:Gem::Version
263
+ version: '0'
264
+ required_rubygems_version: !ruby/object:Gem::Requirement
265
+ requirements:
266
+ - - ">="
267
+ - !ruby/object:Gem::Version
268
+ version: '0'
269
+ requirements: []
270
+ rubyforge_project:
271
+ rubygems_version: 2.6.14
272
+ signing_key:
273
+ specification_version: 4
274
+ summary: A gem to interact with Procreate .swatches files.
275
+ test_files: []