apexcharts 0.1.8 → 0.1.9

Sign up to get free protection for your applications and to get access to all the features.
Files changed (71) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +29 -20
  3. data/lib/apex_charts/charts.rb +16 -0
  4. data/lib/{apexcharts/charts/area.rb → apex_charts/charts/area_chart.rb} +1 -1
  5. data/lib/{apexcharts/charts/bar.rb → apex_charts/charts/bar_chart.rb} +1 -1
  6. data/lib/{apexcharts/charts/base.rb → apex_charts/charts/base_chart.rb} +6 -4
  7. data/lib/{apexcharts/charts/bubble.rb → apex_charts/charts/bubble_chart.rb} +2 -2
  8. data/lib/{apexcharts/charts/candlestick.rb → apex_charts/charts/candlestick_chart.rb} +1 -1
  9. data/lib/{apexcharts/charts/cartesian.rb → apex_charts/charts/cartesian_chart.rb} +8 -6
  10. data/lib/{apexcharts/charts/column.rb → apex_charts/charts/column_chart.rb} +3 -1
  11. data/lib/{apexcharts/charts/donut.rb → apex_charts/charts/donut_chart.rb} +1 -1
  12. data/lib/{apexcharts → apex_charts}/charts/features/annotations.rb +7 -5
  13. data/lib/{apexcharts → apex_charts}/charts/features/mixable.rb +1 -1
  14. data/lib/{apexcharts/charts/heatmap.rb → apex_charts/charts/heatmap_chart.rb} +2 -2
  15. data/lib/{apexcharts/charts/line.rb → apex_charts/charts/line_chart.rb} +1 -1
  16. data/lib/{apexcharts/charts/mixed.rb → apex_charts/charts/mixed_charts.rb} +6 -4
  17. data/lib/{apexcharts/charts/pie.rb → apex_charts/charts/pie_chart.rb} +1 -1
  18. data/lib/apex_charts/charts/polar_chart.rb +9 -0
  19. data/lib/{apexcharts/charts/radar.rb → apex_charts/charts/radar_chart.rb} +2 -2
  20. data/lib/{apexcharts/charts/radial_bar.rb → apex_charts/charts/radial_bar_chart.rb} +1 -1
  21. data/lib/{apexcharts/charts/range_bar.rb → apex_charts/charts/range_bar_chart.rb} +1 -1
  22. data/lib/{apexcharts/charts/scatter.rb → apex_charts/charts/scatter_chart.rb} +1 -1
  23. data/lib/{apexcharts/charts/syncing.rb → apex_charts/charts/syncing_charts.rb} +1 -1
  24. data/lib/{apexcharts → apex_charts}/colors.rb +2 -1
  25. data/lib/apex_charts/config/default_options.rb +16 -0
  26. data/lib/{apexcharts/config.rb → apex_charts/configuration.rb} +7 -7
  27. data/lib/{apexcharts → apex_charts}/helper.rb +16 -16
  28. data/lib/{apexcharts/options/annotations.rb → apex_charts/options/annotations_options.rb} +3 -1
  29. data/lib/{apexcharts/options/axis.rb → apex_charts/options/axis_options.rb} +3 -1
  30. data/lib/{apexcharts/options/chart.rb → apex_charts/options/chart_options.rb} +3 -1
  31. data/lib/{apexcharts/options/data_labels.rb → apex_charts/options/data_labels_options.rb} +3 -1
  32. data/lib/{apexcharts → apex_charts}/options/div_attributes.rb +3 -1
  33. data/lib/{apexcharts/options/fill.rb → apex_charts/options/fill_options.rb} +3 -1
  34. data/lib/{apexcharts/options/grid.rb → apex_charts/options/grid_options.rb} +3 -1
  35. data/lib/{apexcharts/options/legend.rb → apex_charts/options/legend_options.rb} +3 -1
  36. data/lib/{apexcharts/options/markers.rb → apex_charts/options/markers_options.rb} +3 -1
  37. data/lib/{apexcharts/options/no_data.rb → apex_charts/options/no_data_options.rb} +3 -1
  38. data/lib/{apexcharts → apex_charts}/options/plot_options.rb +3 -1
  39. data/lib/{apexcharts/options/root.rb → apex_charts/options/root_options.rb} +6 -4
  40. data/lib/{apexcharts/options/states.rb → apex_charts/options/states_options.rb} +3 -1
  41. data/lib/{apexcharts/options/stroke.rb → apex_charts/options/stroke_options.rb} +3 -1
  42. data/lib/{apexcharts/options/theme.rb → apex_charts/options/theme_options.rb} +3 -1
  43. data/lib/{apexcharts/options/title.rb → apex_charts/options/title_subtitle_options.rb} +4 -2
  44. data/lib/{apexcharts/options/tooltip.rb → apex_charts/options/tooltip_options.rb} +3 -1
  45. data/lib/{apexcharts/options/x_axis.rb → apex_charts/options/x_axis_options.rb} +4 -2
  46. data/lib/{apexcharts/options/y_axis.rb → apex_charts/options/y_axis_options.rb} +4 -2
  47. data/lib/{apexcharts → apex_charts}/options_builder.rb +37 -34
  48. data/lib/apex_charts/prefix_with_apex.rb +7 -0
  49. data/lib/{apexcharts → apex_charts}/prefixer.rb +2 -0
  50. data/lib/{apexcharts → apex_charts}/renderer.rb +7 -1
  51. data/lib/apex_charts/series.rb +7 -0
  52. data/lib/{apexcharts/series/bubble.rb → apex_charts/series/bubble_series.rb} +4 -2
  53. data/lib/{apexcharts/series/cartesian.rb → apex_charts/series/cartesian_series.rb} +4 -2
  54. data/lib/{apexcharts/series/polar.rb → apex_charts/series/polar_series.rb} +4 -2
  55. data/lib/{apexcharts → apex_charts}/support/rails.rb +0 -0
  56. data/lib/{apexcharts → apex_charts}/support/sinatra.rb +0 -0
  57. data/lib/{apexcharts → apex_charts}/theme.rb +0 -0
  58. data/lib/{apexcharts → apex_charts}/utils.rb +0 -0
  59. data/lib/{apexcharts → apex_charts}/utils/copy.rb +2 -0
  60. data/lib/{apexcharts → apex_charts}/utils/date_time.rb +2 -0
  61. data/lib/{apexcharts → apex_charts}/utils/hash.rb +2 -0
  62. data/lib/{apexcharts → apex_charts}/version.rb +1 -1
  63. data/lib/apexcharts.rb +3 -3
  64. data/lib/apexcharts/prefix_with_apex.rb +18 -3
  65. data/vendor/assets/javascripts/apexcharts.js +11 -3
  66. metadata +67 -67
  67. data/lib/apexcharts/charts.rb +0 -19
  68. data/lib/apexcharts/charts/polar.rb +0 -7
  69. data/lib/apexcharts/config/default_options.rb +0 -12
  70. data/lib/apexcharts/options/subtitle.rb +0 -9
  71. data/lib/apexcharts/series.rb +0 -7
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: ab5fe55affbc927ac35a3b09eda054fc58b4d628559b856b09745a40995435a3
4
- data.tar.gz: 33e80f6bc63b97751eb8d9bb9cfa0ee394c4a857178d8b23ee1b484ab2d31317
3
+ metadata.gz: 737afc5c5ce435bfa18cfe6b7d00f51ffd74c040f8f5f51728dec1711a2514fc
4
+ data.tar.gz: e46f31763675b25c6cf0f010a16423aa2e6249240302af88e793f65277c7a816
5
5
  SHA512:
6
- metadata.gz: 2d4a235395e45ba368b5355611fd43a0118442195f5709ee4f978f293f9f6d422b253690a83a33d0782ea91387a3841eeaa3f4406af16bb5ec9c6fd924166b32
7
- data.tar.gz: 0c55734ce94cd4ed1536b6f7e0b468b77579844431f0780ac97bd8e097ab27b876e50bbfe9b8e9cf6f8801eb50b750870ac9badee625480047962a38ac330aef
6
+ metadata.gz: a4d469bb0d6ccb22595939a9e5305ce8cfb75db59c2e54db786d937c10cf1f07d0cfe342238ab3289fbebad2149b7e3eee0df5c20fcea17230c9eb45fb8b0cee
7
+ data.tar.gz: 67de41d4a272ee5ed1cfd200c20e9d2b2a95300c00d03463a9561000481655af329f6629f1a6a3d1443ef92bffbc33f4593247f983943faa58eae78cbd3e559f
data/README.md CHANGED
@@ -1,5 +1,5 @@
1
1
  <p align="center">
2
- <img src="images/placeholder.png" height="80">
2
+ <img src="images/apexcharts.rb.png" height="150" />
3
3
  </p>
4
4
 
5
5
  <p align="center">
@@ -39,8 +39,11 @@
39
39
 
40
40
  ## Trusted By
41
41
 
42
- <img src="images/users/bilendo.png" title="Use case: enterprise dashboards to visualize account receivables data" width="202" height="40" />
43
- <img src="images/users/ventrata.png" title="Use case: ticket sales for clients (visitor attractions and tour operators)" width="180" height="40" />
42
+ Organization/Company | Use Case
43
+ -----------------------------------------------------------------------|------------------------------------------------------------------
44
+ <img src="/images/users/copient-health.png" width="143" height="40" /> | Reports/charts related to Operating Room utilization statistics
45
+ <img src="/images/users/bilendo.png" width="202" height="40" /> | Enterprise dashboards to visualize account receivables data
46
+ <img src="/images/users/ventrata.png" width="180" height="40" /> | Ticket sales for clients (visitor attractions and tour operators)
44
47
 
45
48
  > If your organization/company uses ApexCharts.RB in production, please comment on
46
49
  > [this issue](https://github.com/styd/apexcharts.rb/issues/34).
@@ -49,7 +52,7 @@
49
52
  ## Supported By
50
53
 
51
54
  <a href="https://www.jetbrains.com/?from=ApexCharts.RB">
52
- <img src="images/supporters/jetbrains.svg" title="Grants 1 License for All Products Pack (worth US$649.00/year)" width="120" height="120" />
55
+ <img src="images/supporters/jetbrains.svg" title="Grants 1 License for All Products Pack" width="120" height="120" />
53
56
  </a>
54
57
 
55
58
 
@@ -58,7 +61,7 @@
58
61
  This README might not be for the version you use.
59
62
  Choose the right README:
60
63
 
61
- > [v0.1.8] | [v0.1.7] | [v0.1.6] | [v0.1.5] | [v0.1.4] | [v0.1.3] | [v0.1.2] | [v0.1.1]
64
+ > [v0.1.9] | [v0.1.8] | [v0.1.7] | [v0.1.6] | [v0.1.5] | [v0.1.4] | [v0.1.3] | [v0.1.2] | [v0.1.1]
62
65
 
63
66
  ## Table of Contents
64
67
 
@@ -249,13 +252,18 @@ Given:
249
252
  <%
250
253
  require 'date'
251
254
 
252
- def ohlc(ary)
253
- [rand(ary.min..ary.max), ary.max, ary.min, rand(ary.min..ary.max)]
255
+ def candlestick_data
256
+ @acc = rand(6570..6650)
257
+ 60.times.map {|i| [Date.today - 60 + i, ohlc] }.to_h
254
258
  end
255
259
 
256
- candlestick_data = 50.times.map do |i|
257
- [Date.today - 50 + i, ohlc(Array.new(2){ rand(6570..6650) })]
258
- end.to_h
260
+ def ohlc
261
+ open = @acc + rand(-20..20)
262
+ high = open + rand(0..100)
263
+ low = open - rand(0..100)
264
+ @acc = close = open + rand(-((high-low)/3)..((high-low)/2))
265
+ [open, high, low, close]
266
+ end
259
267
 
260
268
  candlestick_options = {
261
269
  plot_options: {
@@ -275,9 +283,6 @@ You can make candlestick chart with this:
275
283
  ```
276
284
  ![Example Candlestick Chart](images/candlestick_chart.gif)
277
285
 
278
- Real life candlestick chart probably don't look like that.
279
- That's because I just use random sets of numbers as the data.
280
-
281
286
 
282
287
  #### Mixed Charts
283
288
 
@@ -626,6 +631,12 @@ use it like so:
626
631
  <%= area_chart series, tooltip: {y: {formatter: function(val) { return '$' + parseFloat(val).toLocaleString() }}} %>
627
632
  ```
628
633
 
634
+ Or, without the _functionable-json_ gem, use function as object as follows:
635
+
636
+ ```erb
637
+ <%= area_chart series, tooltip: {y: {formatter: {function: {args: "val", body: "return '$' + parseFloat(val).toLocaleString();"}} }} %>
638
+ ```
639
+
629
640
 
630
641
  ## Reusable Custom Palette
631
642
 
@@ -692,7 +703,7 @@ Besides setting the environtment variable, if you just want a quick prefix, you
692
703
  do this on your _Gemfile_:
693
704
 
694
705
  ```ruby
695
- gem 'apexcharts', require: 'apexcharts/prefix_with_apex'
706
+ gem 'apexcharts', require: 'apex_charts/prefix_with_apex'
696
707
  ```
697
708
 
698
709
  and you'll get `apex_line_chart`, `apex_area_chart`, etc.
@@ -878,18 +889,16 @@ The gem is available as open source under the terms of the
878
889
  [MIT License](https://opensource.org/licenses/MIT).
879
890
 
880
891
 
881
- ## Like the charts?
882
-
883
- Consider donating to the author of [ApexCharts.JS] to support his awesome library.
884
- This project wouldn't be possible without it.
892
+ ## Articles
885
893
 
886
- Become a sponsor on [Patreon](https://patreon.com/junedchhipa).
887
- One time donation on [PayPal](https://paypal.me/junedchhipa)
894
+ - [Rails em 8 minutos: Criando gráficos incríveis com ApexCharts](https://onebitcode.com/graficos-incriveis-no-ruby-on-rails/)
895
+ - [【Rails】 5分でApexChart.jsを導入する方法](https://qiita.com/syukan3/items/aa741df278f628087a3c)
888
896
 
889
897
 
890
898
  [ApexCharts.JS]: https://github.com/apexcharts/apexcharts.js
891
899
 
892
900
 
901
+ [v0.1.9]: https://github.com/styd/apexcharts.rb/blob/v0.1.9/README.md
893
902
  [v0.1.8]: https://github.com/styd/apexcharts.rb/blob/v0.1.8/README.md
894
903
  [v0.1.7]: https://github.com/styd/apexcharts.rb/blob/v0.1.7/README.md
895
904
  [v0.1.6]: https://github.com/styd/apexcharts.rb/blob/v0.1.6/README.md
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ApexCharts::Charts
4
+ %w[
5
+ base cartesian line area bar column scatter
6
+ candlestick heatmap bubble radar polar pie donut
7
+ ].each do |type|
8
+ autoload :"#{type.capitalize}Chart", "apex_charts/charts/#{type}_chart.rb"
9
+ end
10
+
11
+ autoload :RangeBarChart, 'apex_charts/charts/range_bar_chart.rb'
12
+ autoload :RadialBarChart, 'apex_charts/charts/radial_bar_chart.rb'
13
+
14
+ autoload :MixedCharts, 'apex_charts/charts/mixed_charts.rb'
15
+ autoload :SyncingCharts, 'apex_charts/charts/syncing_charts.rb'
16
+ end
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- module ApexCharts
3
+ module ApexCharts::Charts
4
4
  class AreaChart < CartesianChart
5
5
  def chart_type
6
6
  'area'
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- module ApexCharts
3
+ module ApexCharts::Charts
4
4
  class BarChart < CartesianChart
5
5
  def chart_type
6
6
  'bar'
@@ -1,6 +1,8 @@
1
- module ApexCharts
1
+ # frozen_string_literal: true
2
+
3
+ module ApexCharts::Charts
2
4
  class BaseChart
3
- include Utils::Hash
5
+ include ApexCharts::Utils::Hash
4
6
 
5
7
  attr_reader :options, :series, :sample
6
8
 
@@ -10,7 +12,7 @@ module ApexCharts
10
12
  end
11
13
 
12
14
  def render
13
- Renderer.render_default(options)
15
+ ApexCharts::Renderer.render_default(options)
14
16
  end
15
17
 
16
18
  def chart_type; end
@@ -25,7 +27,7 @@ module ApexCharts
25
27
 
26
28
  def build_options(options)
27
29
  deep_merge(
28
- OptionsBuilder.new(sample, options).build_options,
30
+ ApexCharts::OptionsBuilder.new(sample, options).build_options,
29
31
  camelize_keys(
30
32
  {**@series, chart: {type: chart_type}}.compact
31
33
  )
@@ -1,13 +1,13 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- module ApexCharts
3
+ module ApexCharts::Charts
4
4
  class BubbleChart < BaseChart
5
5
  def chart_type
6
6
  'bubble'
7
7
  end
8
8
 
9
9
  def series_type
10
- BubbleSeries
10
+ ApexCharts::Series::BubbleSeries
11
11
  end
12
12
  end
13
13
  end
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- module ApexCharts
3
+ module ApexCharts::Charts
4
4
  class CandlestickChart < CartesianChart
5
5
  def chart_type
6
6
  'candlestick'
@@ -1,12 +1,14 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require_relative 'features/annotations'
4
+ require_relative 'features/mixable'
3
5
  require_relative '../utils/hash'
4
6
 
5
- module ApexCharts
7
+ module ApexCharts::Charts
6
8
  class CartesianChart < BaseChart
7
- include Annotations
8
- include Mixable
9
- include Utils::Hash
9
+ include Features::Annotations
10
+ include Features::Mixable
11
+ include ApexCharts::Utils::Hash
10
12
 
11
13
  def initialize(outer_self, data, options={}, &block)
12
14
  @outer_self = outer_self
@@ -27,7 +29,7 @@ module ApexCharts
27
29
  end
28
30
 
29
31
  def series_type
30
- CartesianSeries
32
+ ApexCharts::Series::CartesianSeries
31
33
  end
32
34
 
33
35
  def more_options
@@ -74,7 +76,7 @@ module ApexCharts
74
76
  end
75
77
 
76
78
  def handle_time(input)
77
- Utils::DateTime.convert(input)
79
+ ApexCharts::Utils::DateTime.convert(input)
78
80
  end
79
81
  end
80
82
  end
@@ -1,4 +1,6 @@
1
- module ApexCharts
1
+ # frozen_string_literal: true
2
+
3
+ module ApexCharts::Charts
2
4
  class ColumnChart < BarChart
3
5
  def more_options
4
6
  {plot_options: {bar: {horizontal: false}}}
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- module ApexCharts
3
+ module ApexCharts::Charts
4
4
  class DonutChart < PolarChart
5
5
  def chart_type
6
6
  'donut'
@@ -1,4 +1,6 @@
1
- module ApexCharts
1
+ # frozen_string_literal: true
2
+
3
+ module ApexCharts::Charts::Features
2
4
  module Annotations
3
5
  def annotation(axis, value:, text:, color: nil, **options)
4
6
  @annotations ||= {}
@@ -35,7 +37,7 @@ module ApexCharts
35
37
  axis = axis.to_s.delete_suffix('axis').to_sym
36
38
  case value
37
39
  when Range
38
- value = Utils::DateTime.convert_range(value)
40
+ value = ApexCharts::Utils::DateTime.convert_range(value)
39
41
 
40
42
  case axis
41
43
  when :x
@@ -47,10 +49,10 @@ module ApexCharts
47
49
  end
48
50
  else
49
51
  if axis == :points
50
- value.map! {|x| Utils::DateTime.convert(x) }
52
+ value.map! {|x| ApexCharts::Utils::DateTime.convert(x) }
51
53
  {x: value.first, y: value.last}
52
54
  else
53
- value = Utils::DateTime.convert(value)
55
+ value = ApexCharts::Utils::DateTime.convert(value)
54
56
  {axis => value}
55
57
  end
56
58
  end
@@ -69,6 +71,6 @@ module ApexCharts
69
71
  }
70
72
  end
71
73
 
72
- include Utils::Hash
74
+ include ApexCharts::Utils::Hash
73
75
  end
74
76
  end
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- module ApexCharts
3
+ module ApexCharts::Charts::Features
4
4
  module Mixable
5
5
  def mixed_series
6
6
  series[:series].each {|d| d.merge!(type: chart_type) }
@@ -1,13 +1,13 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- module ApexCharts
3
+ module ApexCharts::Charts
4
4
  class HeatmapChart < BaseChart
5
5
  def chart_type
6
6
  'heatmap'
7
7
  end
8
8
 
9
9
  def series_type
10
- CartesianSeries
10
+ ApexCharts::Series::CartesianSeries
11
11
  end
12
12
  end
13
13
  end
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- module ApexCharts
3
+ module ApexCharts::Charts
4
4
  class LineChart < CartesianChart
5
5
  def chart_type
6
6
  'line'
@@ -1,9 +1,11 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- module ApexCharts
3
+ require_relative 'features/annotations'
4
+
5
+ module ApexCharts::Charts
4
6
  class MixedCharts < BaseChart
5
- include Annotations
6
- include Utils::Hash
7
+ include Features::Annotations
8
+ include ApexCharts::Utils::Hash
7
9
 
8
10
  def initialize(outer_self, options={}, &block)
9
11
  @outer_self = outer_self
@@ -93,7 +95,7 @@ module ApexCharts
93
95
  end
94
96
 
95
97
  def handle_time(input)
96
- Utils::DateTime.convert(input)
98
+ ApexCharts::Utils::DateTime.convert(input)
97
99
  end
98
100
  end
99
101
  end
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- module ApexCharts
3
+ module ApexCharts::Charts
4
4
  class PieChart < PolarChart
5
5
  def chart_type
6
6
  'pie'
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ApexCharts::Charts
4
+ class PolarChart < BaseChart
5
+ def series_type
6
+ ApexCharts::Series::PolarSeries
7
+ end
8
+ end
9
+ end
@@ -1,13 +1,13 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- module ApexCharts
3
+ module ApexCharts::Charts
4
4
  class RadarChart < BaseChart
5
5
  def chart_type
6
6
  'radar'
7
7
  end
8
8
 
9
9
  def series_type
10
- CartesianSeries
10
+ ApexCharts::Series::CartesianSeries
11
11
  end
12
12
  end
13
13
  end
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- module ApexCharts
3
+ module ApexCharts::Charts
4
4
  class RadialBarChart < PolarChart
5
5
  def chart_type
6
6
  'radialBar'
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- module ApexCharts
3
+ module ApexCharts::Charts
4
4
  class RangeBarChart < BarChart
5
5
  def chart_type
6
6
  'rangeBar'
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- module ApexCharts
3
+ module ApexCharts::Charts
4
4
  class ScatterChart < CartesianChart
5
5
  def chart_type
6
6
  'scatter'
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- module ApexCharts
3
+ module ApexCharts::Charts
4
4
  class SyncingCharts
5
5
  def initialize(outer_self, options={}, &block)
6
6
  @outer_self = outer_self
@@ -17,7 +17,8 @@ module ApexCharts
17
17
  def clean(colors)
18
18
  colors = colors.respond_to?(:to_set) ? colors.to_a.flatten : Array(colors)
19
19
  colors.map do |color|
20
- raise "unrecognized color #{color}" unless color.tap(&:upcase!)[/^#[0-9A-F]{6}/]
20
+ color = color.upcase
21
+ raise "unrecognized color #{color}" unless color[/^#[0-9A-F]{6}/]
21
22
 
22
23
  color
23
24
  end