hyper-d3 1.0.0.lap23

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.
Files changed (204) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +1 -0
  3. data/Gemfile +4 -0
  4. data/Gemfile.lock +313 -0
  5. data/README.md +118 -0
  6. data/Rakefile +31 -0
  7. data/hyper-d3.gemspec +27 -0
  8. data/lib/d3.rb +68 -0
  9. data/lib/d3/arc.rb +29 -0
  10. data/lib/d3/area.rb +53 -0
  11. data/lib/d3/axis.rb +79 -0
  12. data/lib/d3/band_scale.rb +30 -0
  13. data/lib/d3/collections.rb +9 -0
  14. data/lib/d3/color.rb +76 -0
  15. data/lib/d3/color_schemes.rb +34 -0
  16. data/lib/d3/continuous_scale.rb +60 -0
  17. data/lib/d3/creator.rb +11 -0
  18. data/lib/d3/curve.rb +74 -0
  19. data/lib/d3/dsv.rb +103 -0
  20. data/lib/d3/ease.rb +319 -0
  21. data/lib/d3/format.rb +95 -0
  22. data/lib/d3/histograms.rb +46 -0
  23. data/lib/d3/interpolate.rb +125 -0
  24. data/lib/d3/line.rb +27 -0
  25. data/lib/d3/map.rb +48 -0
  26. data/lib/d3/misc.rb +15 -0
  27. data/lib/d3/native.rb +112 -0
  28. data/lib/d3/nest.rb +100 -0
  29. data/lib/d3/ordinal_scale.rb +39 -0
  30. data/lib/d3/path.rb +24 -0
  31. data/lib/d3/pie.rb +25 -0
  32. data/lib/d3/point_scale.rb +27 -0
  33. data/lib/d3/polygon.rb +18 -0
  34. data/lib/d3/quadtree.rb +89 -0
  35. data/lib/d3/quantile_scale.rb +19 -0
  36. data/lib/d3/quantize_scale.rb +20 -0
  37. data/lib/d3/radial_area.rb +55 -0
  38. data/lib/d3/radial_line.rb +27 -0
  39. data/lib/d3/random.rb +14 -0
  40. data/lib/d3/search.rb +30 -0
  41. data/lib/d3/selection.rb +151 -0
  42. data/lib/d3/sequential_scale.rb +31 -0
  43. data/lib/d3/set.rb +30 -0
  44. data/lib/d3/source/d3-drag.js +234 -0
  45. data/lib/d3/source/d3-scale-chromatic.js +484 -0
  46. data/lib/d3/source/d3.js +17178 -0
  47. data/lib/d3/stack.rb +13 -0
  48. data/lib/d3/statistics.rb +81 -0
  49. data/lib/d3/symbol.rb +70 -0
  50. data/lib/d3/threshold_scale.rb +22 -0
  51. data/lib/d3/time_format.rb +47 -0
  52. data/lib/d3/time_interval.rb +85 -0
  53. data/lib/d3/transformations.rb +16 -0
  54. data/lib/hyper-d3.rb +17 -0
  55. data/lib/hyperloop/d3/component.rb +12 -0
  56. data/lib/hyperloop/d3/mixin.rb +59 -0
  57. data/lib/hyperloop/d3/version.rb +5 -0
  58. data/spec/arc_spec.rb +80 -0
  59. data/spec/area_spec.rb +98 -0
  60. data/spec/axis_spec.rb +174 -0
  61. data/spec/band_scale_spec.rb +73 -0
  62. data/spec/color_spec.rb +74 -0
  63. data/spec/continuous_scale_spec.rb +217 -0
  64. data/spec/coverage_spec.rb +16 -0
  65. data/spec/creator_spec.rb +15 -0
  66. data/spec/curve_spec.rb +206 -0
  67. data/spec/dsv_spec.rb +194 -0
  68. data/spec/ease_spec.rb +370 -0
  69. data/spec/format_spec.rb +87 -0
  70. data/spec/histograms_spec.rb +61 -0
  71. data/spec/html/index.html.erb +11 -0
  72. data/spec/interpolate_spec.rb +152 -0
  73. data/spec/line_spec.rb +54 -0
  74. data/spec/map_spec.rb +80 -0
  75. data/spec/misc_spec.rb +21 -0
  76. data/spec/nest_spec.rb +89 -0
  77. data/spec/objects_spec.rb +22 -0
  78. data/spec/ordinal_scale_spec.rb +59 -0
  79. data/spec/path_spec.rb +65 -0
  80. data/spec/pie_spec.rb +114 -0
  81. data/spec/point_scale_spec.rb +58 -0
  82. data/spec/polygon_spec.rb +51 -0
  83. data/spec/quadtree_spec.rb +128 -0
  84. data/spec/quantile_scale_spec.rb +24 -0
  85. data/spec/quantize_scale_spec.rb +40 -0
  86. data/spec/radial_area_spec.rb +123 -0
  87. data/spec/radial_line_spec.rb +50 -0
  88. data/spec/random_spec.rb +34 -0
  89. data/spec/search_spec.rb +69 -0
  90. data/spec/selection_data_spec.rb +64 -0
  91. data/spec/selection_manipulation_spec.rb +166 -0
  92. data/spec/selection_spec.rb +187 -0
  93. data/spec/sequential_scale_spec.rb +90 -0
  94. data/spec/set_spec.rb +57 -0
  95. data/spec/spec_helper.rb +1 -0
  96. data/spec/stack_spec.rb +5 -0
  97. data/spec/statistics_spec.rb +65 -0
  98. data/spec/symbol_spec.rb +116 -0
  99. data/spec/test_app/.gitignore +23 -0
  100. data/spec/test_app/Gemfile +7 -0
  101. data/spec/test_app/Gemfile.lock +206 -0
  102. data/spec/test_app/README.md +9 -0
  103. data/spec/test_app/Rakefile +6 -0
  104. data/spec/test_app/app/assets/config/manifest.js +3 -0
  105. data/spec/test_app/app/assets/images/.keep +0 -0
  106. data/spec/test_app/app/assets/javascripts/application.js +13 -0
  107. data/spec/test_app/app/assets/javascripts/cable.js +13 -0
  108. data/spec/test_app/app/assets/javascripts/channels/.keep +0 -0
  109. data/spec/test_app/app/assets/javascripts/data/elections_2016.rb +10 -0
  110. data/spec/test_app/app/assets/javascripts/data/harry_potter.rb +19 -0
  111. data/spec/test_app/app/assets/javascripts/data/iphones.rb +29 -0
  112. data/spec/test_app/app/assets/javascripts/data/london_population.rb +26 -0
  113. data/spec/test_app/app/assets/javascripts/data/man_vs_horse.rb +55 -0
  114. data/spec/test_app/app/assets/javascripts/data/mtg_modern_colors.rb +96 -0
  115. data/spec/test_app/app/assets/javascripts/data/mtg_modern_creatures.rb +116 -0
  116. data/spec/test_app/app/assets/javascripts/data/olympics_2016_medals.rb +100 -0
  117. data/spec/test_app/app/assets/javascripts/data/paradox.rb +60 -0
  118. data/spec/test_app/app/assets/javascripts/data/polish_pms.rb +28 -0
  119. data/spec/test_app/app/assets/javascripts/data/star_trek_voyager.rb +183 -0
  120. data/spec/test_app/app/assets/javascripts/data/weather_in_london.rb +381 -0
  121. data/spec/test_app/app/assets/javascripts/elections_2016.rb +27 -0
  122. data/spec/test_app/app/assets/javascripts/harry_potter.rb +42 -0
  123. data/spec/test_app/app/assets/javascripts/iphones.rb +54 -0
  124. data/spec/test_app/app/assets/javascripts/london_population.rb +53 -0
  125. data/spec/test_app/app/assets/javascripts/london_population_area.rb +49 -0
  126. data/spec/test_app/app/assets/javascripts/man_vs_horse.rb +60 -0
  127. data/spec/test_app/app/assets/javascripts/mtg_modern_colors.rb +56 -0
  128. data/spec/test_app/app/assets/javascripts/mtg_modern_creatures.rb +70 -0
  129. data/spec/test_app/app/assets/javascripts/olympics_2016_medals.rb +62 -0
  130. data/spec/test_app/app/assets/javascripts/paradox.rb +64 -0
  131. data/spec/test_app/app/assets/javascripts/polish_pms.rb +60 -0
  132. data/spec/test_app/app/assets/javascripts/star_trek_voyager.rb +44 -0
  133. data/spec/test_app/app/assets/javascripts/weather_in_london.rb +69 -0
  134. data/spec/test_app/app/assets/stylesheets/application.css +15 -0
  135. data/spec/test_app/app/channels/application_cable/channel.rb +4 -0
  136. data/spec/test_app/app/channels/application_cable/connection.rb +4 -0
  137. data/spec/test_app/app/controllers/application_controller.rb +27 -0
  138. data/spec/test_app/app/controllers/concerns/.keep +0 -0
  139. data/spec/test_app/app/helpers/application_helper.rb +2 -0
  140. data/spec/test_app/app/jobs/application_job.rb +2 -0
  141. data/spec/test_app/app/mailers/application_mailer.rb +4 -0
  142. data/spec/test_app/app/models/application_record.rb +3 -0
  143. data/spec/test_app/app/models/concerns/.keep +0 -0
  144. data/spec/test_app/app/views/application/index.erb +18 -0
  145. data/spec/test_app/app/views/application/visualization.erb +28 -0
  146. data/spec/test_app/app/views/layouts/application.html.erb +13 -0
  147. data/spec/test_app/bin/bundle +3 -0
  148. data/spec/test_app/bin/rails +4 -0
  149. data/spec/test_app/bin/rake +4 -0
  150. data/spec/test_app/bin/setup +38 -0
  151. data/spec/test_app/bin/update +29 -0
  152. data/spec/test_app/bin/yarn +11 -0
  153. data/spec/test_app/config.ru +5 -0
  154. data/spec/test_app/config/application.rb +18 -0
  155. data/spec/test_app/config/boot.rb +3 -0
  156. data/spec/test_app/config/cable.yml +10 -0
  157. data/spec/test_app/config/database.yml +25 -0
  158. data/spec/test_app/config/environment.rb +5 -0
  159. data/spec/test_app/config/environments/development.rb +54 -0
  160. data/spec/test_app/config/environments/production.rb +91 -0
  161. data/spec/test_app/config/environments/test.rb +42 -0
  162. data/spec/test_app/config/initializers/application_controller_renderer.rb +8 -0
  163. data/spec/test_app/config/initializers/assets.rb +14 -0
  164. data/spec/test_app/config/initializers/backtrace_silencers.rb +7 -0
  165. data/spec/test_app/config/initializers/cookies_serializer.rb +5 -0
  166. data/spec/test_app/config/initializers/filter_parameter_logging.rb +4 -0
  167. data/spec/test_app/config/initializers/inflections.rb +16 -0
  168. data/spec/test_app/config/initializers/mime_types.rb +4 -0
  169. data/spec/test_app/config/initializers/wrap_parameters.rb +14 -0
  170. data/spec/test_app/config/locales/en.yml +33 -0
  171. data/spec/test_app/config/puma.rb +56 -0
  172. data/spec/test_app/config/routes.rb +5 -0
  173. data/spec/test_app/config/secrets.yml +32 -0
  174. data/spec/test_app/config/spring.rb +6 -0
  175. data/spec/test_app/db/seeds.rb +7 -0
  176. data/spec/test_app/lib/assets/.keep +0 -0
  177. data/spec/test_app/lib/tasks/.keep +0 -0
  178. data/spec/test_app/log/.keep +0 -0
  179. data/spec/test_app/package.json +5 -0
  180. data/spec/test_app/public/404.html +67 -0
  181. data/spec/test_app/public/422.html +67 -0
  182. data/spec/test_app/public/500.html +66 -0
  183. data/spec/test_app/public/apple-touch-icon-precomposed.png +0 -0
  184. data/spec/test_app/public/apple-touch-icon.png +0 -0
  185. data/spec/test_app/public/favicon.ico +0 -0
  186. data/spec/test_app/public/robots.txt +1 -0
  187. data/spec/test_app/test/application_system_test_case.rb +5 -0
  188. data/spec/test_app/test/controllers/.keep +0 -0
  189. data/spec/test_app/test/fixtures/.keep +0 -0
  190. data/spec/test_app/test/fixtures/files/.keep +0 -0
  191. data/spec/test_app/test/helpers/.keep +0 -0
  192. data/spec/test_app/test/integration/.keep +0 -0
  193. data/spec/test_app/test/mailers/.keep +0 -0
  194. data/spec/test_app/test/models/.keep +0 -0
  195. data/spec/test_app/test/system/.keep +0 -0
  196. data/spec/test_app/test/test_helper.rb +10 -0
  197. data/spec/test_app/tmp/.keep +0 -0
  198. data/spec/test_app/vendor/.keep +0 -0
  199. data/spec/threshold_scale_spec.rb +28 -0
  200. data/spec/time_format_spec.rb +100 -0
  201. data/spec/time_interval_spec.rb +314 -0
  202. data/spec/transformations_spec.rb +51 -0
  203. data/startrekvoyager.png +0 -0
  204. metadata +529 -0
data/lib/d3/stack.rb ADDED
@@ -0,0 +1,13 @@
1
+ module D3
2
+ class StackGenerator
3
+ include D3::Native
4
+
5
+ attributes_d3_block %i[keys value order offset]
6
+ end
7
+
8
+ class << self
9
+ def stack
10
+ D3::StackGenerator.new @d3.JS.stack
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,81 @@
1
+ module D3
2
+ class << self
3
+ def min(data, &block)
4
+ if block
5
+ @d3.JS.min(data, proc{|x| y=yield(x); y.nil? ? `undefined` : y})
6
+ else
7
+ @d3.JS.min(data.compact)
8
+ end
9
+ end
10
+
11
+ def max(data, &block)
12
+ if block
13
+ @d3.JS.max(data, proc{|x| y=yield(x); y.nil? ? `undefined` : y})
14
+ else
15
+ @d3.JS.max(data.compact)
16
+ end
17
+ end
18
+
19
+ def sum(data, &block)
20
+ if block
21
+ @d3.JS.sum(data, proc{|x| y=yield(x); y.nil? ? `undefined` : y})
22
+ else
23
+ @d3.JS.sum(data.compact)
24
+ end
25
+ end
26
+
27
+ def mean(data, &block)
28
+ result = if block
29
+ @d3.JS.mean(data, proc{|x| y=yield(x); y.nil? ? `undefined` : y})
30
+ else
31
+ @d3.JS.mean(data.compact)
32
+ end
33
+ `result === undefined ? nil : result`
34
+ end
35
+
36
+ def median(data, &block)
37
+ result = if block
38
+ @d3.JS.median(data, proc{|x| y=yield(x); y.nil? ? `undefined` : y})
39
+ else
40
+ @d3.JS.median(data.compact)
41
+ end
42
+ `result === undefined ? nil : result`
43
+ end
44
+
45
+ def deviation(data, &block)
46
+ result = if block
47
+ @d3.JS.deviation(data, proc{|x| y=yield(x); y.nil? ? `undefined` : y})
48
+ else
49
+ @d3.JS.deviation(data.compact)
50
+ end
51
+ `result === undefined ? nil : result`
52
+ end
53
+
54
+ def variance(data, &block)
55
+ result = if block
56
+ @d3.JS.variance(data, proc{|x| y=yield(x); y.nil? ? `undefined` : y})
57
+ else
58
+ @d3.JS.variance(data.compact)
59
+ end
60
+ `result === undefined ? nil : result`
61
+ end
62
+
63
+ def quantile(data, p, &block)
64
+ result = if block
65
+ @d3.JS.quantile(data, p, proc{|x| y=yield(x); y.nil? ? `undefined` : y})
66
+ else
67
+ @d3.JS.quantile(data.compact, p)
68
+ end
69
+ `result === undefined ? nil : result`
70
+ end
71
+
72
+ def extent(data, &block)
73
+ (a,b) = if block
74
+ @d3.JS.extent(data, proc{|x| y=yield(x); y.nil? ? `undefined` : y})
75
+ else
76
+ @d3.JS.extent(data.compact)
77
+ end
78
+ [`a === undefined ? nil : a`, `b === undefined ? nil : b`]
79
+ end
80
+ end
81
+ end
data/lib/d3/symbol.rb ADDED
@@ -0,0 +1,70 @@
1
+ module D3
2
+ class SymbolGenerator
3
+ include D3::Native
4
+
5
+ def call(*args)
6
+ @native.call(*args)
7
+ end
8
+
9
+ attribute_d3_block :size
10
+
11
+ def type(new_value=`undefined`, &block)
12
+ if block_given?
13
+ @native.JS.type{|*args| yield(*args).to_n}
14
+ self
15
+ elsif `new_value === undefined`
16
+ D3::SymbolType.new @native.JS.type
17
+ else
18
+ @native.JS.type(new_value.to_n)
19
+ self
20
+ end
21
+ end
22
+
23
+ def type=(new_value)
24
+ @native.type(new_value.to_n)
25
+ self
26
+ end
27
+ end
28
+
29
+ class SymbolType
30
+ include D3::Native
31
+ end
32
+
33
+ class << self
34
+ def symbol
35
+ D3::SymbolGenerator.new @d3.JS.symbol
36
+ end
37
+
38
+ def symbols
39
+ `window.d3.symbols`.map{|st| D3::SymbolType.new(st)}
40
+ end
41
+
42
+ def symbol_circle
43
+ D3::SymbolType.new `window.d3.symbolCircle`
44
+ end
45
+
46
+ def symbol_cross
47
+ D3::SymbolType.new `window.d3.symbolCross`
48
+ end
49
+
50
+ def symbol_diamond
51
+ D3::SymbolType.new `window.d3.symbolDiamond`
52
+ end
53
+
54
+ def symbol_square
55
+ D3::SymbolType.new `window.d3.symbolSquare`
56
+ end
57
+
58
+ def symbol_star
59
+ D3::SymbolType.new `window.d3.symbolStar`
60
+ end
61
+
62
+ def symbol_triangle
63
+ D3::SymbolType.new `window.d3.symbolTriangle`
64
+ end
65
+
66
+ def symbol_wye
67
+ D3::SymbolType.new `window.d3.symbolWye`
68
+ end
69
+ end
70
+ end
@@ -0,0 +1,22 @@
1
+ module D3
2
+ class ThresholdScale
3
+ include D3::Native
4
+ attributes_d3 %i[domain range]
5
+ alias_native_new :copy
6
+
7
+ def call(t)
8
+ @native.call(t)
9
+ end
10
+
11
+ def invert_extent(t)
12
+ a,b = @native.JS.invertExtent(t)
13
+ [`a === undefined ? nil : a`, `b === undefined ? nil : b`]
14
+ end
15
+ end
16
+
17
+ class << self
18
+ def scale_threshold
19
+ D3::ThresholdScale.new @d3.JS.scaleThreshold
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,47 @@
1
+ module D3
2
+ class TimeFormatLocale
3
+ include D3::Native
4
+ aliases_native %i[format utcFormat parse utcParse]
5
+ end
6
+
7
+ class << self
8
+ aliases_d3 %i[
9
+ timeFormat
10
+ timeParse
11
+ utcFormat
12
+ utcParse
13
+ isoFormat
14
+ isoParse
15
+ ]
16
+
17
+ def time_format_locale(spec={})
18
+ D3::TimeFormatLocale.new @d3.JS.timeFormatLocale(
19
+ {
20
+ dateTime: spec.fetch(:date_time, "%x, %X"),
21
+ date: spec.fetch(:date, "%-m/%-d/%Y"),
22
+ time: spec.fetch(:time, "%-I:%M:%S %p"),
23
+ periods: spec.fetch(:periods, ["AM", "PM"]),
24
+ days: spec.fetch(:days, ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"]),
25
+ shortDays: spec.fetch(:short_days, ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"]),
26
+ months: spec.fetch(:months, ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"]),
27
+ shortMonths: spec.fetch(:short_months, ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]),
28
+ }.to_n
29
+ )
30
+ end
31
+
32
+ def time_format_default_locale(spec={})
33
+ D3::TimeFormatLocale.new @d3.JS.timeFormatDefaultLocale(
34
+ {
35
+ dateTime: spec.fetch(:date_time, "%x, %X"),
36
+ date: spec.fetch(:date, "%-m/%-d/%Y"),
37
+ time: spec.fetch(:time, "%-I:%M:%S %p"),
38
+ periods: spec.fetch(:periods, ["AM", "PM"]),
39
+ days: spec.fetch(:days, ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"]),
40
+ shortDays: spec.fetch(:short_days, ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"]),
41
+ months: spec.fetch(:months, ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"]),
42
+ shortMonths: spec.fetch(:short_months, ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]),
43
+ }.to_n
44
+ )
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,85 @@
1
+ module D3
2
+ class TimeInterval
3
+ include D3::Native
4
+
5
+ aliases_native %i[
6
+ round
7
+ floor
8
+ ceil
9
+ offset
10
+ range
11
+ count
12
+ ]
13
+ alias_native_new :every
14
+
15
+ def filter(&block)
16
+ D3::TimeInterval.new(@native.JS.filter(block))
17
+ end
18
+ end
19
+
20
+ class << self
21
+ def time_year; D3::TimeInterval.new(`window.d3.timeYear`); end
22
+ def utc_year; D3::TimeInterval.new(`window.d3.utcYear`); end
23
+ def time_month; D3::TimeInterval.new(`window.d3.timeMonth`); end
24
+ def utc_month; D3::TimeInterval.new(`window.d3.utcMonth`); end
25
+ def time_week; D3::TimeInterval.new(`window.d3.timeWeek`); end
26
+ def utc_week; D3::TimeInterval.new(`window.d3.utcWeek`); end
27
+ def time_monday; D3::TimeInterval.new(`window.d3.timeMonday`); end
28
+ def utc_monday; D3::TimeInterval.new(`window.d3.utcMonday`); end
29
+ def time_tuesday; D3::TimeInterval.new(`window.d3.timeTuesday`); end
30
+ def utc_tuesday; D3::TimeInterval.new(`window.d3.utcTuesday`); end
31
+ def time_wednesday; D3::TimeInterval.new(`window.d3.timeWednesday`); end
32
+ def utc_wednesday; D3::TimeInterval.new(`window.d3.utcWednesday`); end
33
+ def time_thursday; D3::TimeInterval.new(`window.d3.timeThursday`); end
34
+ def utc_thursday; D3::TimeInterval.new(`window.d3.utcThursday`); end
35
+ def time_friday; D3::TimeInterval.new(`window.d3.timeFriday`); end
36
+ def utc_friday; D3::TimeInterval.new(`window.d3.utcFriday`); end
37
+ def time_saturday; D3::TimeInterval.new(`window.d3.timeSaturday`); end
38
+ def utc_saturday; D3::TimeInterval.new(`window.d3.utcSaturday`); end
39
+ def time_sunday; D3::TimeInterval.new(`window.d3.timeSunday`); end
40
+ def utc_sunday; D3::TimeInterval.new(`window.d3.utcSunday`); end
41
+ def time_day; D3::TimeInterval.new(`window.d3.timeDay`); end
42
+ def utc_day; D3::TimeInterval.new(`window.d3.utcDay`); end
43
+ def time_hour; D3::TimeInterval.new(`window.d3.timeHour`); end
44
+ def utc_hour; D3::TimeInterval.new(`window.d3.utcHour`); end
45
+ def time_minute; D3::TimeInterval.new(`window.d3.timeMinute`); end
46
+ def utc_minute; D3::TimeInterval.new(`window.d3.utcMinute`); end
47
+ def time_second; D3::TimeInterval.new(`window.d3.timeSecond`); end
48
+ def utc_second; D3::TimeInterval.new(`window.d3.utcSecond`); end
49
+ def time_millisecond; D3::TimeInterval.new(`window.d3.timeMillisecond`); end
50
+ def utc_millisecond; D3::TimeInterval.new(`window.d3.utcMillisecond`); end
51
+
52
+ aliases_d3 %i[
53
+ timeYears
54
+ utcYears
55
+ timeMilliseconds
56
+ utcMilliseconds
57
+ timeSeconds
58
+ utcSeconds
59
+ timeMinutes
60
+ utcMinutes
61
+ timeHours
62
+ utcHours
63
+ timeDays
64
+ utcDays
65
+ timeWeeks
66
+ utcWeeks
67
+ timeSundays
68
+ utcSundays
69
+ timeMondays
70
+ utcMondays
71
+ timeTuesdays
72
+ utcTuesdays
73
+ timeWednesdays
74
+ utcWednesdays
75
+ timeThursdays
76
+ utcThursdays
77
+ timeFridays
78
+ utcFridays
79
+ timeSaturdays
80
+ utcSaturdays
81
+ timeMonths
82
+ utcMonths
83
+ ]
84
+ end
85
+ end
@@ -0,0 +1,16 @@
1
+ module D3
2
+ class << self
3
+ aliases_d3 %i[
4
+ cross
5
+ merge
6
+ pairs
7
+ permute
8
+ shuffle
9
+ ticks
10
+ tickStep
11
+ range
12
+ transpose
13
+ zip
14
+ ]
15
+ end
16
+ end
data/lib/hyper-d3.rb ADDED
@@ -0,0 +1,17 @@
1
+ require "hyperloop-config"
2
+ require "hyper-component"
3
+ Hyperloop.import "d3/source/d3.js", client_only: true
4
+ Hyperloop.import "d3/source/d3-drag.js", client_only: true
5
+ Hyperloop.import "d3/source/d3-scale-chromatic.js", client_only: true
6
+ Hyperloop.import "hyper-d3"
7
+ require "opal-activesupport"
8
+ require "hyperloop/d3/version"
9
+
10
+ if RUBY_ENGINE == 'opal'
11
+ require "d3"
12
+ require "hyper-component"
13
+ require "hyperloop/d3/mixin"
14
+ require "hyperloop/d3/component"
15
+ else
16
+ Opal.append_path __dir__.untaint
17
+ end
@@ -0,0 +1,12 @@
1
+ module Hyperloop
2
+ module D3
3
+ class Component
4
+ include Hyperloop::D3::Mixin
5
+ def self.inherited(base)
6
+ base.class_eval do
7
+ param data: nil
8
+ end
9
+ end
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,59 @@
1
+ require 'react/component'
2
+
3
+ module Hyperloop
4
+ module D3
5
+ module Mixin
6
+ def self.included(base)
7
+ base.include(Hyperloop::Component::Mixin)
8
+ base.class_eval do
9
+ param data: nil
10
+
11
+ def _set_dom_node(dom_node)
12
+ @_dom_node = dom_node
13
+ end
14
+
15
+ def self.before_unmount_with_selection(&block)
16
+ before_unmount do
17
+ if @_dom_node && block
18
+ selection = ::D3.select(@_dom_node)
19
+ block.call(selection, @_data)
20
+ end
21
+ end
22
+ end
23
+
24
+ def self.render_with_selection(tag = 'SVG', &block)
25
+ render do
26
+ if block
27
+ @_d3_render_block = block
28
+ else
29
+ @_d3_render_block = proc { |selection, data| selection.text("Please supply a block for render_with_selection")}
30
+ end
31
+ @_data = params.data
32
+ send(tag, ref: method(:_set_dom_node).to_proc)
33
+ end
34
+ end
35
+
36
+ def should_component_update?
37
+ false
38
+ end
39
+
40
+ after_mount do
41
+ if @_dom_node && @_d3_render_block
42
+ selection = ::D3.select(@_dom_node)
43
+ @_d3_render_block.call(selection, @_data)
44
+ end
45
+ end
46
+
47
+ before_receive_props do |new_props|
48
+ @_data = new_props[:data] if new_props[:data]
49
+ if @_dom_node && @_d3_render_block
50
+ selection = ::D3.select(@_dom_node)
51
+ @_d3_render_block.call(selection, @_data)
52
+ end
53
+ end
54
+ end
55
+ end
56
+
57
+ end
58
+ end
59
+ end
@@ -0,0 +1,5 @@
1
+ module Hyperloop
2
+ module D3
3
+ VERSION = "1.0.0.lap23"
4
+ end
5
+ end
data/spec/arc_spec.rb ADDED
@@ -0,0 +1,80 @@
1
+ describe "d3 - arc" do
2
+ it "d3.arc" do
3
+ expect(D3.arc).to be_instance_of(D3::ArcGenerator)
4
+ end
5
+
6
+ let(:example_arc) {
7
+ D3.arc
8
+ .inner_radius(0)
9
+ .outer_radius(100)
10
+ .start_angle(0)
11
+ .end_angle(Math::PI / 2)
12
+ }
13
+
14
+ # That's a weird rounding error, documentation says "M0,-100A100,100,0,0,1,100,0L0,0Z"
15
+ it "basics" do
16
+ expect(example_arc.()).to eq("M6.123233995736766e-15,-100A100,100,0,0,1,100,0L0,0Z")
17
+ end
18
+
19
+ it "passing hash" do
20
+ arc = D3.arc
21
+ expect(arc.({
22
+ innerRadius: 0,
23
+ outerRadius: 100,
24
+ startAngle: 0,
25
+ endAngle: Math::PI / 2,
26
+ }.to_n)).to eq("M6.123233995736766e-15,-100A100,100,0,0,1,100,0L0,0Z")
27
+ end
28
+
29
+ it "arc.inner_radius" do
30
+ arc = D3.arc.inner_radius(20)
31
+ expect(arc.inner_radius.()).to eq(20)
32
+ arc.inner_radius{|t| t*10}
33
+ expect(arc.inner_radius.(12)).to eq(120)
34
+ end
35
+
36
+ it "arc.outer_radius" do
37
+ arc = D3.arc.outer_radius(100)
38
+ expect(arc.outer_radius.()).to eq(100)
39
+ arc.outer_radius{|t| t*10}
40
+ expect(arc.outer_radius.(12)).to eq(120)
41
+ end
42
+
43
+ it "arc.start_angle" do
44
+ arc = D3.arc.start_angle(Math::PI/2)
45
+ expect(arc.start_angle.()).to eq(Math::PI/2)
46
+ arc.start_angle{|t| t*10}
47
+ expect(arc.start_angle.(12)).to eq(120)
48
+ end
49
+
50
+ it "arc.end_angle" do
51
+ arc = D3.arc.end_angle(3*Math::PI/2)
52
+ expect(arc.end_angle.()).to eq(3*Math::PI/2)
53
+ arc.end_angle{|t| t*10}
54
+ expect(arc.end_angle.(12)).to eq(120)
55
+ end
56
+
57
+ it "arc.corner_radius" do
58
+ arc = D3.arc.corner_radius(5)
59
+ expect(arc.corner_radius.()).to eq(5)
60
+ arc.corner_radius{|t| t*10}
61
+ expect(arc.corner_radius.(12)).to eq(120)
62
+ expect(example_arc.corner_radius(5).()).to eq(
63
+ "M6.217248937900877e-15,-94.86832980505139"+
64
+ "A5,5,0,0,1,5.263157894736849,-99.86139979479094"+
65
+ "A100,100,0,0,1,99.86139979479093,-5.263157894736842"+
66
+ "A5,5,0,0,1,94.86832980505139,0"+
67
+ "L0,0Z"
68
+ )
69
+ end
70
+
71
+ it "arc.centroid" do
72
+ expect(example_arc.centroid).to eq([35.35533905932738, -35.35533905932737])
73
+ expect(D3.arc.centroid({
74
+ innerRadius: 20,
75
+ outerRadius: 40,
76
+ startAngle: Math::PI * 0.25,
77
+ endAngle: Math::PI * 0.75 ,
78
+ }.to_n)).to eq([30,0])
79
+ end
80
+ end