hyper-d3 1.0.0.lap23

Sign up to get free protection for your applications and to get access to all the features.
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