chroma 0.0.1 → 0.1.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
  SHA1:
3
- metadata.gz: 50d3030c7ac81f4ced369d991d94ae827af946c3
4
- data.tar.gz: 20fba6d256719e631c6f0333aeb32afcf13c0fc1
3
+ metadata.gz: ba59f54923418c9d94c2c434673428053bb71d71
4
+ data.tar.gz: 83e5c63353336387b402b9afd78533f6d0439e04
5
5
  SHA512:
6
- metadata.gz: 95b1f6fa55a3f8fc40c35a069c94c45a47a1bf6a889382971285bc4bb052331133f45b5f5e253d1a3f69340f928b1ae2026d959ed887d07feea44759c5382257
7
- data.tar.gz: 085c7c08e31045167d3e57832f1f518f5ad6a8309881be5bceaf1a747a402d6831d426cdeec2551825207cbbebdc045a3029a30c1671fffea28dd261d6489666
6
+ metadata.gz: c72995a317f6f18237dcdd0abb1023610895a777407d41a96df667ad56a306949ab3b36cc131c7e6412d5895387e53904dc3de6e03a1d50db40e74e3ced4ab74
7
+ data.tar.gz: d3bdef0aca890fc72a95f5d1eacfb527f92c4d42c07adbcaad01c376fb63a9c321f7093b7a7ae58aaa7cc6a0b7ea5cd4453b38740fe069a19fe7cca97d9ff3ff
@@ -1,4 +1,22 @@
1
- ### v0.0.1 - 2015-01-14
1
+ ## v0.1.0 - 2016-05-26
2
+
3
+ ### Dynamic Custom Palettes
4
+
5
+ You can generate custom palettes on the fly without predefining them now. The
6
+ old way of defining them with a name via `Chroma.define_palette` still works
7
+ too.
8
+
9
+ ```ruby
10
+ # New dynamic way
11
+ 'red'.paint.custom_palette do
12
+ spin 60
13
+ spin 180
14
+ end
15
+
16
+ #=> [red, yellow, cyan]
17
+ ```
18
+
19
+ ## v0.0.1 - 2015-01-14
2
20
 
3
21
  **Method Changes:**
4
22
 
@@ -15,7 +33,7 @@
15
33
  * Minor API doc example fixes.
16
34
  * Add public API usage examples to README.
17
35
 
18
- ### [v0.0.1.alpha.3] - 2015-01-13
36
+ ## [v0.0.1.alpha.3] - 2015-01-13
19
37
 
20
38
  **Bug Fixes:**
21
39
 
@@ -41,7 +59,7 @@
41
59
  * Introduced custom errors and replaced `raise` calls with them.
42
60
  * Added API doc headers. (#4)
43
61
 
44
- ### [v0.0.1.alpha.2] - 2015-01-13
62
+ ## [v0.0.1.alpha.2] - 2015-01-13
45
63
 
46
64
  **Bug Fixes:**
47
65
 
@@ -82,6 +100,6 @@
82
100
  * `to_rgb_s` -> `to_rgb`
83
101
  * Removed `to_name_s` alias
84
102
 
85
- ### [v0.0.1.alpha.1] - 2015-01-11
103
+ ## [v0.0.1.alpha.1] - 2015-01-11
86
104
 
87
105
  * Initial release
data/README.md CHANGED
@@ -270,6 +270,20 @@ red.palette.respond_to? :my_palette #=> true
270
270
  red.palette.my_palette #=> [#ff0000 #ffff00 #00ffff #ffff33 #808080]
271
271
  ```
272
272
 
273
+ ## Dynamic Custom Palettes
274
+
275
+ You can generate custom palettes on the fly too with
276
+ `Chroma::Color#custom_palette`.
277
+
278
+ ```ruby
279
+ 'red'.paint.custom_palette do
280
+ spin 60
281
+ spin 180
282
+ end
283
+
284
+ #=> [red, yellow, cyan]
285
+ ```
286
+
273
287
  ## Serializing Colors
274
288
 
275
289
  Colors offer several methods to output to different string color [formats](#available-formats).
@@ -112,7 +112,11 @@ module Chroma
112
112
  raise Errors::PaletteDefinedError, "Palette `#{name}' already exists"
113
113
  end
114
114
 
115
- PaletteBuilder.build(name, &block)
115
+ palette_evaluator = PaletteBuilder.build(&block)
116
+
117
+ Harmonies.send(:define_method, name) do
118
+ palette_evaluator.evaluate(@color)
119
+ end
116
120
  end
117
121
 
118
122
  private
@@ -82,6 +82,22 @@ module Chroma
82
82
  Harmonies.new(self)
83
83
  end
84
84
 
85
+ # Defines a custom palette and immediately returns it. Uses a DSL inside
86
+ # `block` that mirrors the methods in {Color::Modifiers}.
87
+ #
88
+ # @example
89
+ # 'red'.paint.custom_palette do
90
+ # spin 60
91
+ # spin 180
92
+ # end
93
+ # #=> [red, yellow, cyan]
94
+ #
95
+ # @param block [Proc] the palette definition block
96
+ # @return [Array<Color>] palette array of colors
97
+ def custom_palette(&block)
98
+ PaletteBuilder.build(&block).evaluate(self)
99
+ end
100
+
85
101
  private
86
102
 
87
103
  def to_2char_hex(n)
@@ -4,47 +4,56 @@ module Chroma
4
4
  # Wrapper to instantiate a new instance of {PaletteBuilder} and call its
5
5
  # {PaletteBuilder#build} method.
6
6
  #
7
- # @param name [Symbol, String] the name of the custom palette
8
- # @param block [Proc] the palette definition block
9
- # @return [Symbol, String] the name of the custom palette
10
- def self.build(name, &block)
11
- new(name, &block).build
7
+ # @param block [Proc] the palette definition block
8
+ # @return [PaletteBuilder::PaletteEvaluator] lazy palette generator
9
+ def self.build(&block)
10
+ new(&block).build
12
11
  end
13
12
 
14
- # @param name [Symbol, String] the name of the custom palette
15
- # @param block [Proc] the palette definition block
16
- def initialize(name, &block)
17
- @name = name
13
+ # @param block [Proc] the palette definition block
14
+ def initialize(&block)
18
15
  @block = block
19
16
  end
20
17
 
21
- # Build the custom palette by defining a new method on {Harmonies}.
22
- # @return [Symbol, String] the name of the custom palette
18
+ # Build the custom palette
19
+ # @return [PaletteBuilder::PaletteEvaluator] lazy palette generator
23
20
  def build
24
21
  dsl = PaletteBuilderDsl.new
25
22
  dsl.instance_eval(&@block)
26
- conversions = dsl.conversions
27
-
28
- Harmonies.send(:define_method, @name) do
29
- conversions.map do |color_calls|
30
- color_calls.evaluate(@color)
31
- end.unshift(@color)
32
- end
23
+ dsl.evaluator
33
24
  end
34
25
 
35
26
  private
36
27
 
28
+ # Internal class for delaying evaluating a color to generate a
29
+ # final palette
30
+ class PaletteEvaluator
31
+ def initialize
32
+ @conversions = []
33
+ end
34
+
35
+ def <<(conversion)
36
+ @conversions << conversion
37
+ end
38
+
39
+ def evaluate(color)
40
+ @conversions.map do |color_calls|
41
+ color_calls.evaluate(color)
42
+ end.unshift(color)
43
+ end
44
+ end
45
+
37
46
  # Internal class for palette building DSL syntax.
38
47
  class PaletteBuilderDsl
39
- attr_reader :conversions
48
+ attr_reader :evaluator
40
49
 
41
50
  def initialize
42
- @conversions = []
51
+ @evaluator = PaletteEvaluator.new
43
52
  end
44
53
 
45
54
  def method_missing(name, *args)
46
55
  ColorCalls.new(name, args).tap do |color_calls|
47
- @conversions << color_calls
56
+ @evaluator << color_calls
48
57
  end
49
58
  end
50
59
 
@@ -1,3 +1,3 @@
1
1
  module Chroma
2
- VERSION = '0.0.1'
2
+ VERSION = '0.1.0'
3
3
  end
@@ -0,0 +1,19 @@
1
+ describe Chroma::Color, '#custom_palette' do
2
+ let(:subject) do
3
+ 'red'.paint.custom_palette do
4
+ spin 60
5
+ spin 180
6
+ spin(60).brighten(20)
7
+ greyscale
8
+ end
9
+ end
10
+
11
+ it 'generates the correct colors' do
12
+ expect(subject).
13
+ to generate_palette %w(#ff0000 #ffff00 #00ffff #ffff33 #808080)
14
+ end
15
+
16
+ it 'keeps the same format' do
17
+ expect(subject).to all have_format :name
18
+ end
19
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: chroma
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jeremy Fairbank
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-01-14 00:00:00.000000000 Z
11
+ date: 2016-05-27 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -100,6 +100,7 @@ files:
100
100
  - spec/chroma/paint_spec.rb
101
101
  - spec/chroma_spec.rb
102
102
  - spec/color/attributes_spec.rb
103
+ - spec/color/custom_palette_spec.rb
103
104
  - spec/color/modifiers_spec.rb
104
105
  - spec/color/palette_spec.rb
105
106
  - spec/color/serializers_spec.rb
@@ -135,6 +136,7 @@ test_files:
135
136
  - spec/chroma/paint_spec.rb
136
137
  - spec/chroma_spec.rb
137
138
  - spec/color/attributes_spec.rb
139
+ - spec/color/custom_palette_spec.rb
138
140
  - spec/color/modifiers_spec.rb
139
141
  - spec/color/palette_spec.rb
140
142
  - spec/color/serializers_spec.rb