hyper-d3 1.0.0.lap23
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +1 -0
- data/Gemfile +4 -0
- data/Gemfile.lock +313 -0
- data/README.md +118 -0
- data/Rakefile +31 -0
- data/hyper-d3.gemspec +27 -0
- data/lib/d3.rb +68 -0
- data/lib/d3/arc.rb +29 -0
- data/lib/d3/area.rb +53 -0
- data/lib/d3/axis.rb +79 -0
- data/lib/d3/band_scale.rb +30 -0
- data/lib/d3/collections.rb +9 -0
- data/lib/d3/color.rb +76 -0
- data/lib/d3/color_schemes.rb +34 -0
- data/lib/d3/continuous_scale.rb +60 -0
- data/lib/d3/creator.rb +11 -0
- data/lib/d3/curve.rb +74 -0
- data/lib/d3/dsv.rb +103 -0
- data/lib/d3/ease.rb +319 -0
- data/lib/d3/format.rb +95 -0
- data/lib/d3/histograms.rb +46 -0
- data/lib/d3/interpolate.rb +125 -0
- data/lib/d3/line.rb +27 -0
- data/lib/d3/map.rb +48 -0
- data/lib/d3/misc.rb +15 -0
- data/lib/d3/native.rb +112 -0
- data/lib/d3/nest.rb +100 -0
- data/lib/d3/ordinal_scale.rb +39 -0
- data/lib/d3/path.rb +24 -0
- data/lib/d3/pie.rb +25 -0
- data/lib/d3/point_scale.rb +27 -0
- data/lib/d3/polygon.rb +18 -0
- data/lib/d3/quadtree.rb +89 -0
- data/lib/d3/quantile_scale.rb +19 -0
- data/lib/d3/quantize_scale.rb +20 -0
- data/lib/d3/radial_area.rb +55 -0
- data/lib/d3/radial_line.rb +27 -0
- data/lib/d3/random.rb +14 -0
- data/lib/d3/search.rb +30 -0
- data/lib/d3/selection.rb +151 -0
- data/lib/d3/sequential_scale.rb +31 -0
- data/lib/d3/set.rb +30 -0
- data/lib/d3/source/d3-drag.js +234 -0
- data/lib/d3/source/d3-scale-chromatic.js +484 -0
- data/lib/d3/source/d3.js +17178 -0
- data/lib/d3/stack.rb +13 -0
- data/lib/d3/statistics.rb +81 -0
- data/lib/d3/symbol.rb +70 -0
- data/lib/d3/threshold_scale.rb +22 -0
- data/lib/d3/time_format.rb +47 -0
- data/lib/d3/time_interval.rb +85 -0
- data/lib/d3/transformations.rb +16 -0
- data/lib/hyper-d3.rb +17 -0
- data/lib/hyperloop/d3/component.rb +12 -0
- data/lib/hyperloop/d3/mixin.rb +59 -0
- data/lib/hyperloop/d3/version.rb +5 -0
- data/spec/arc_spec.rb +80 -0
- data/spec/area_spec.rb +98 -0
- data/spec/axis_spec.rb +174 -0
- data/spec/band_scale_spec.rb +73 -0
- data/spec/color_spec.rb +74 -0
- data/spec/continuous_scale_spec.rb +217 -0
- data/spec/coverage_spec.rb +16 -0
- data/spec/creator_spec.rb +15 -0
- data/spec/curve_spec.rb +206 -0
- data/spec/dsv_spec.rb +194 -0
- data/spec/ease_spec.rb +370 -0
- data/spec/format_spec.rb +87 -0
- data/spec/histograms_spec.rb +61 -0
- data/spec/html/index.html.erb +11 -0
- data/spec/interpolate_spec.rb +152 -0
- data/spec/line_spec.rb +54 -0
- data/spec/map_spec.rb +80 -0
- data/spec/misc_spec.rb +21 -0
- data/spec/nest_spec.rb +89 -0
- data/spec/objects_spec.rb +22 -0
- data/spec/ordinal_scale_spec.rb +59 -0
- data/spec/path_spec.rb +65 -0
- data/spec/pie_spec.rb +114 -0
- data/spec/point_scale_spec.rb +58 -0
- data/spec/polygon_spec.rb +51 -0
- data/spec/quadtree_spec.rb +128 -0
- data/spec/quantile_scale_spec.rb +24 -0
- data/spec/quantize_scale_spec.rb +40 -0
- data/spec/radial_area_spec.rb +123 -0
- data/spec/radial_line_spec.rb +50 -0
- data/spec/random_spec.rb +34 -0
- data/spec/search_spec.rb +69 -0
- data/spec/selection_data_spec.rb +64 -0
- data/spec/selection_manipulation_spec.rb +166 -0
- data/spec/selection_spec.rb +187 -0
- data/spec/sequential_scale_spec.rb +90 -0
- data/spec/set_spec.rb +57 -0
- data/spec/spec_helper.rb +1 -0
- data/spec/stack_spec.rb +5 -0
- data/spec/statistics_spec.rb +65 -0
- data/spec/symbol_spec.rb +116 -0
- data/spec/test_app/.gitignore +23 -0
- data/spec/test_app/Gemfile +7 -0
- data/spec/test_app/Gemfile.lock +206 -0
- data/spec/test_app/README.md +9 -0
- data/spec/test_app/Rakefile +6 -0
- data/spec/test_app/app/assets/config/manifest.js +3 -0
- data/spec/test_app/app/assets/images/.keep +0 -0
- data/spec/test_app/app/assets/javascripts/application.js +13 -0
- data/spec/test_app/app/assets/javascripts/cable.js +13 -0
- data/spec/test_app/app/assets/javascripts/channels/.keep +0 -0
- data/spec/test_app/app/assets/javascripts/data/elections_2016.rb +10 -0
- data/spec/test_app/app/assets/javascripts/data/harry_potter.rb +19 -0
- data/spec/test_app/app/assets/javascripts/data/iphones.rb +29 -0
- data/spec/test_app/app/assets/javascripts/data/london_population.rb +26 -0
- data/spec/test_app/app/assets/javascripts/data/man_vs_horse.rb +55 -0
- data/spec/test_app/app/assets/javascripts/data/mtg_modern_colors.rb +96 -0
- data/spec/test_app/app/assets/javascripts/data/mtg_modern_creatures.rb +116 -0
- data/spec/test_app/app/assets/javascripts/data/olympics_2016_medals.rb +100 -0
- data/spec/test_app/app/assets/javascripts/data/paradox.rb +60 -0
- data/spec/test_app/app/assets/javascripts/data/polish_pms.rb +28 -0
- data/spec/test_app/app/assets/javascripts/data/star_trek_voyager.rb +183 -0
- data/spec/test_app/app/assets/javascripts/data/weather_in_london.rb +381 -0
- data/spec/test_app/app/assets/javascripts/elections_2016.rb +27 -0
- data/spec/test_app/app/assets/javascripts/harry_potter.rb +42 -0
- data/spec/test_app/app/assets/javascripts/iphones.rb +54 -0
- data/spec/test_app/app/assets/javascripts/london_population.rb +53 -0
- data/spec/test_app/app/assets/javascripts/london_population_area.rb +49 -0
- data/spec/test_app/app/assets/javascripts/man_vs_horse.rb +60 -0
- data/spec/test_app/app/assets/javascripts/mtg_modern_colors.rb +56 -0
- data/spec/test_app/app/assets/javascripts/mtg_modern_creatures.rb +70 -0
- data/spec/test_app/app/assets/javascripts/olympics_2016_medals.rb +62 -0
- data/spec/test_app/app/assets/javascripts/paradox.rb +64 -0
- data/spec/test_app/app/assets/javascripts/polish_pms.rb +60 -0
- data/spec/test_app/app/assets/javascripts/star_trek_voyager.rb +44 -0
- data/spec/test_app/app/assets/javascripts/weather_in_london.rb +69 -0
- data/spec/test_app/app/assets/stylesheets/application.css +15 -0
- data/spec/test_app/app/channels/application_cable/channel.rb +4 -0
- data/spec/test_app/app/channels/application_cable/connection.rb +4 -0
- data/spec/test_app/app/controllers/application_controller.rb +27 -0
- data/spec/test_app/app/controllers/concerns/.keep +0 -0
- data/spec/test_app/app/helpers/application_helper.rb +2 -0
- data/spec/test_app/app/jobs/application_job.rb +2 -0
- data/spec/test_app/app/mailers/application_mailer.rb +4 -0
- data/spec/test_app/app/models/application_record.rb +3 -0
- data/spec/test_app/app/models/concerns/.keep +0 -0
- data/spec/test_app/app/views/application/index.erb +18 -0
- data/spec/test_app/app/views/application/visualization.erb +28 -0
- data/spec/test_app/app/views/layouts/application.html.erb +13 -0
- data/spec/test_app/bin/bundle +3 -0
- data/spec/test_app/bin/rails +4 -0
- data/spec/test_app/bin/rake +4 -0
- data/spec/test_app/bin/setup +38 -0
- data/spec/test_app/bin/update +29 -0
- data/spec/test_app/bin/yarn +11 -0
- data/spec/test_app/config.ru +5 -0
- data/spec/test_app/config/application.rb +18 -0
- data/spec/test_app/config/boot.rb +3 -0
- data/spec/test_app/config/cable.yml +10 -0
- data/spec/test_app/config/database.yml +25 -0
- data/spec/test_app/config/environment.rb +5 -0
- data/spec/test_app/config/environments/development.rb +54 -0
- data/spec/test_app/config/environments/production.rb +91 -0
- data/spec/test_app/config/environments/test.rb +42 -0
- data/spec/test_app/config/initializers/application_controller_renderer.rb +8 -0
- data/spec/test_app/config/initializers/assets.rb +14 -0
- data/spec/test_app/config/initializers/backtrace_silencers.rb +7 -0
- data/spec/test_app/config/initializers/cookies_serializer.rb +5 -0
- data/spec/test_app/config/initializers/filter_parameter_logging.rb +4 -0
- data/spec/test_app/config/initializers/inflections.rb +16 -0
- data/spec/test_app/config/initializers/mime_types.rb +4 -0
- data/spec/test_app/config/initializers/wrap_parameters.rb +14 -0
- data/spec/test_app/config/locales/en.yml +33 -0
- data/spec/test_app/config/puma.rb +56 -0
- data/spec/test_app/config/routes.rb +5 -0
- data/spec/test_app/config/secrets.yml +32 -0
- data/spec/test_app/config/spring.rb +6 -0
- data/spec/test_app/db/seeds.rb +7 -0
- data/spec/test_app/lib/assets/.keep +0 -0
- data/spec/test_app/lib/tasks/.keep +0 -0
- data/spec/test_app/log/.keep +0 -0
- data/spec/test_app/package.json +5 -0
- data/spec/test_app/public/404.html +67 -0
- data/spec/test_app/public/422.html +67 -0
- data/spec/test_app/public/500.html +66 -0
- data/spec/test_app/public/apple-touch-icon-precomposed.png +0 -0
- data/spec/test_app/public/apple-touch-icon.png +0 -0
- data/spec/test_app/public/favicon.ico +0 -0
- data/spec/test_app/public/robots.txt +1 -0
- data/spec/test_app/test/application_system_test_case.rb +5 -0
- data/spec/test_app/test/controllers/.keep +0 -0
- data/spec/test_app/test/fixtures/.keep +0 -0
- data/spec/test_app/test/fixtures/files/.keep +0 -0
- data/spec/test_app/test/helpers/.keep +0 -0
- data/spec/test_app/test/integration/.keep +0 -0
- data/spec/test_app/test/mailers/.keep +0 -0
- data/spec/test_app/test/models/.keep +0 -0
- data/spec/test_app/test/system/.keep +0 -0
- data/spec/test_app/test/test_helper.rb +10 -0
- data/spec/test_app/tmp/.keep +0 -0
- data/spec/test_app/vendor/.keep +0 -0
- data/spec/threshold_scale_spec.rb +28 -0
- data/spec/time_format_spec.rb +100 -0
- data/spec/time_interval_spec.rb +314 -0
- data/spec/transformations_spec.rb +51 -0
- data/startrekvoyager.png +0 -0
- metadata +529 -0
data/lib/d3/stack.rb
ADDED
@@ -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
|
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,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
|
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
|