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
@@ -0,0 +1,64 @@
1
+ require "hyper-d3"
2
+ require "data/paradox"
3
+
4
+ class ParadoxComponent
5
+ include Hyperloop::D3::Mixin
6
+
7
+ render_with_selection do |selection, paradox_data|
8
+ svg = selection
9
+ .attr("height", "600px")
10
+ .attr("width", "100%")
11
+ width = svg.style("width").to_i
12
+
13
+ min_date, max_date = paradox_data.map(&:time).minmax
14
+ count = paradox_data.map{|g| [g.series, g.number]}.uniq.size
15
+ bar_height = 580 / count
16
+
17
+ x = D3.scale_linear.domain([min_date, max_date]).range([0,width-220])
18
+ y = D3.scale_ordinal.range(count.times.map{|x| bar_height * x})
19
+ c = D3.scale_ordinal.range(D3.scheme_category_10)
20
+ stripes = D3.scale_ordinal.range([0,1])
21
+
22
+ graph_area = svg.append("g")
23
+ .attr("transform", "translate(200, 20)")
24
+
25
+ paradox_data.each do |game|
26
+ dlc = (game.dlc != "")
27
+ full_game = "#{game.series} #{game.number}"
28
+
29
+ graph_area.append("circle")
30
+ .attr("cx", x.(game.time))
31
+ .attr("cy", y.(full_game))
32
+ .attr("r", dlc ? 8 : 12)
33
+ .attr("fill", c.("#{game.series}"))
34
+ .attr("opacity", 0.6)
35
+ .attr("stroke-width", "1px")
36
+ .attr("stroke", "black")
37
+
38
+ unless dlc
39
+ graph_area.append("text")
40
+ .attr("x", -200 + 5)
41
+ .attr("y", y.(full_game) + 4)
42
+ .text(full_game)
43
+
44
+ color = D3.color(c.("#{game.series}"))
45
+ color = color.brighter(stripes.("#{full_game}"))
46
+ graph_area.append("rect")
47
+ .attr("x", -200)
48
+ .attr("width", width)
49
+ .attr("y", y.(full_game) - bar_height/2)
50
+ .attr("height", bar_height)
51
+ .attr("fill", color)
52
+ .attr("opacity", 0.2)
53
+ end
54
+ end
55
+
56
+
57
+ axis_bottom = D3.axis_bottom(x)
58
+ .tick_format(D3.time_format("%B %Y"))
59
+ graph_area.append("g").attr("transform", "translate(0, 560)").call(axis_bottom)
60
+ end
61
+ end
62
+
63
+ # manual mount of component, usually you would use the react_component view helper for example
64
+ React.render(React.create_element(ParadoxComponent, data: ParadoxGames), `document.body.querySelector("#visualization")`)
@@ -0,0 +1,60 @@
1
+ require "react/test/utils" # just for mounting manually here, please ignore
2
+ require "data/polish_pms"
3
+
4
+ class PolishPMsComponent
5
+ include Hyperloop::D3::Mixin
6
+
7
+ render_with_selection do |selection, pm_data|
8
+ svg = selection
9
+ .attr("height", "600px")
10
+ .attr("width", "100%")
11
+ width = svg.style("width").to_i
12
+
13
+ min_date = pm_data.map(&:start).min
14
+ max_date = pm_data.map(&:end).max
15
+
16
+ x = D3.scale_linear.domain([min_date, max_date]).range([100,width-90])
17
+ y = D3.scale_linear.domain([0, pm_data.size+1]).range([0, 580])
18
+ c = D3.scale_ordinal.range(D3.scheme_category_20)
19
+
20
+ graph_area = svg.append("g")
21
+ .attr("transform", "translate(60, 20)")
22
+
23
+ graph_area.append("g")
24
+ .select_all("rect")
25
+ .data(pm_data).enter
26
+ .append("rect")
27
+ .attr("x"){|d| x.(d.start) }
28
+ .attr("y"){|d,i| y.(i) }
29
+ .attr("width"){|d| x.(d.end) - x.(d.start) }
30
+ .attr("height"){|d,i| 0.8 * (y.(i+1) - y.(i)) }
31
+ .attr("fill"){|d| c.(d.party)}
32
+
33
+ graph_area.append("g")
34
+ .select_all("text")
35
+ .data(pm_data).enter
36
+ .append("text")
37
+ .text{|d| d.name}
38
+ .attr("x"){|d| x.(d.start) - 4 }
39
+ .attr("y"){|d,i| y.(i+0.5) }
40
+ .attr("text-anchor", "end")
41
+ .style("font-size", "12px")
42
+
43
+ graph_area.append("g")
44
+ .select_all("text")
45
+ .data(pm_data).enter
46
+ .append("text")
47
+ .text{|d| d.party }
48
+ .attr("x"){|d| x.(d.start) + 4 }
49
+ .attr("y"){|d,i| y.(i+0.5) }
50
+ .attr("text-anchor", "begin")
51
+ .style("font-size", "12px")
52
+
53
+ axis_bottom = D3.axis_bottom(x)
54
+ .tick_format(D3.time_format("%B %Y"))
55
+ graph_area.append("g").attr("transform", "translate(0, 560)").call(axis_bottom)
56
+ end
57
+ end
58
+
59
+ # manual mount of component, usually you would use the react_component view helper for example
60
+ React.render(React.create_element(PolishPMsComponent, data: PolishPMs), `document.body.querySelector("#visualization")`)
@@ -0,0 +1,44 @@
1
+ require "react/test/utils" # just for mounting manually here, please ignore
2
+ require "data/star_trek_voyager"
3
+
4
+ class StarTrekVoyagerComponent < Hyperloop::D3::Component
5
+ render_with_selection('DIV') do |selection, voyager_data|
6
+ svg = selection.append("svg")
7
+ .attr("height", "600px")
8
+ .attr("width", "100%")
9
+ width = svg.style("width").to_i
10
+
11
+ x = D3.scale_linear.domain([0, voyager_data.size-1]).range([40, width-20])
12
+ y = D3.scale_linear.domain(voyager_data.map(&:rating).minmax).range([550, 50])
13
+ c = D3.scale_ordinal.range(D3.scheme_category_10)
14
+
15
+ (1..7).each do |season|
16
+ episodes = voyager_data.select{|episode| episode.season == season }
17
+ avg = D3.mean(episodes.map(&:rating))
18
+ svg.append("line")
19
+ .attr("x1", x.(episodes.map(&:number).min))
20
+ .attr("x2", x.(episodes.map(&:number).max))
21
+ .attr("y1", y.(avg))
22
+ .attr("y2", y.(avg))
23
+ .attr("stroke", c.(season))
24
+ .attr("stroke-width", 2)
25
+ .attr("opacity", 0.4)
26
+ end
27
+
28
+ voyager_data.each do |episode|
29
+ svg.append("circle")
30
+ .attr("cx", x.(episode.number))
31
+ .attr("cy", y.(episode.rating))
32
+ .attr("r", 4)
33
+ .attr("fill", c.(episode.season))
34
+ .attr("opacity", 0.6)
35
+ end
36
+
37
+ axis = D3.axis_left(y)
38
+ svg.append("g").attr("transform","translate(30, 0)")
39
+ .call(axis)
40
+ end
41
+ end
42
+
43
+ # manual mount of component, usually you would use the react_component view helper for example
44
+ React.render(React.create_element(StarTrekVoyagerComponent, data: StarTrekVoyager), `document.body.querySelector("#visualization")`)
@@ -0,0 +1,69 @@
1
+ require "react/test/utils" # just for mounting manually here, please ignore
2
+ require "data/weather_in_london"
3
+
4
+ class WeatherInLondonComponent
5
+ include Hyperloop::D3::Mixin
6
+
7
+ render_with_selection('DIV') do |selection, data|
8
+ row = selection.append("div").attr("class", "row")
9
+ min_temp = data.map(&:min).min
10
+ max_temp = data.map(&:max).max
11
+
12
+ x = D3.scale_linear.domain([1,31]).range([30, 190])
13
+ y = D3.scale_linear.domain([min_temp, max_temp]).range([180, 20])
14
+
15
+ (1..12).each do |month|
16
+ header = D3.time_format("%B").(Time.parse("2016-#{month}-01"))
17
+ panel = row.append("div").attr("class", "col-xs-6 col-sm-4")
18
+ panel.append("h3").text(header)
19
+ svg = panel.append("svg")
20
+ .attr("height", "200px")
21
+ .attr("width", "200px")
22
+
23
+ svg.append("rect")
24
+ .attr("x", 20)
25
+ .attr("y", 10)
26
+ .attr("width", 180)
27
+ .attr("height", 180)
28
+ .attr("fill", "lightgrey")
29
+
30
+ m_data = data.select{|row| row.month == month}
31
+
32
+ max_temp = D3.line
33
+ .x{|d| x.(d.day) }
34
+ .y{|d| y.(d.max) }
35
+ .curve(D3.curve_natural)
36
+ svg.append("path")
37
+ .attr("d", max_temp.(m_data))
38
+ .attr("stroke", "red")
39
+ .attr("stroke-width", "2px")
40
+ .attr("fill", "none")
41
+
42
+ mean_temp = D3.line
43
+ .x{|d| x.(d.day) }
44
+ .y{|d| y.(d.mean) }
45
+ .curve(D3.curve_natural)
46
+ svg.append("path")
47
+ .attr("d", mean_temp.(m_data))
48
+ .attr("stroke", "black")
49
+ .attr("stroke-width", "2px")
50
+ .attr("fill", "none")
51
+
52
+ min_temp = D3.line
53
+ .x{|d| x.(d.day) }
54
+ .y{|d| y.(d.min) }
55
+ .curve(D3.curve_natural)
56
+ svg.append("path")
57
+ .attr("d", min_temp.(m_data))
58
+ .attr("stroke", "blue")
59
+ .attr("stroke-width", "2px")
60
+ .attr("fill", "none")
61
+
62
+ axis_left = D3.axis_left(y).tick_size(2)
63
+ svg.append("g").attr("transform", "translate(20,0)").call(axis_left)
64
+ end
65
+ end
66
+ end
67
+
68
+ # manual mount of component, usually you would use the react_component view helper for example
69
+ React.render(React.create_element(WeatherInLondonComponent, data: WeatherInLondon), `document.body.querySelector("#visualization")`)
@@ -0,0 +1,15 @@
1
+ /*
2
+ * This is a manifest file that'll be compiled into application.css, which will include all the files
3
+ * listed below.
4
+ *
5
+ * Any CSS and SCSS file within this directory, lib/assets/stylesheets, or any plugin's
6
+ * vendor/assets/stylesheets directory can be referenced here using a relative path.
7
+ *
8
+ * You're free to add application-wide styles to this file and they'll appear at the bottom of the
9
+ * compiled file so the styles you add here take precedence over styles defined in any other CSS/SCSS
10
+ * files in this directory. Styles in this file should be added after the last require_* statement.
11
+ * It is generally better to create a new file per style scope.
12
+ *
13
+ *= require_tree .
14
+ *= require_self
15
+ */
@@ -0,0 +1,4 @@
1
+ module ApplicationCable
2
+ class Channel < ActionCable::Channel::Base
3
+ end
4
+ end
@@ -0,0 +1,4 @@
1
+ module ApplicationCable
2
+ class Connection < ActionCable::Connection::Base
3
+ end
4
+ end
@@ -0,0 +1,27 @@
1
+ class ApplicationController < ActionController::Base
2
+ protect_from_forgery with: :exception
3
+
4
+ @@visualizations = {
5
+ elections_2016: "Elections 2016",
6
+ london_population: "London Population",
7
+ london_population_area: "London Population - Area Chart",
8
+ olympics_2016_medals: "Olympics 2016 Medals",
9
+ iphones: "iPhones",
10
+ polish_pms: "Polish Prime Ministers",
11
+ man_vs_horse: "Man versus Horse Marathon",
12
+ paradox: "Paradox Interactive Games",
13
+ weather_in_london: "Weather in London",
14
+ harry_potter: "Harry Potter Books",
15
+ mtg_modern_creatures: "MTG: Creatures in Modern",
16
+ mtg_modern_colors: "MTG: Spell Cards in Modern",
17
+ star_trek_voyager: "Star Trek: Voyager",
18
+ }
19
+
20
+ def index
21
+ @visualizations = @@visualizations
22
+ end
23
+
24
+ def visualization
25
+ @visualizations = @@visualizations
26
+ end
27
+ end
File without changes
@@ -0,0 +1,2 @@
1
+ module ApplicationHelper
2
+ end
@@ -0,0 +1,2 @@
1
+ class ApplicationJob < ActiveJob::Base
2
+ end
@@ -0,0 +1,4 @@
1
+ class ApplicationMailer < ActionMailer::Base
2
+ default from: 'from@example.com'
3
+ layout 'mailer'
4
+ end
@@ -0,0 +1,3 @@
1
+ class ApplicationRecord < ActiveRecord::Base
2
+ self.abstract_class = true
3
+ end
File without changes
@@ -0,0 +1,18 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <meta charset="utf-8">
5
+ <title>Demos</title>
6
+ <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-alpha.5/css/bootstrap.min.css" integrity="sha384-AysaV+vQoT3kOAXZkl02PThvDr8HYKPZhNT5h/CXfBThSRXQ6jW5DO2ekP5ViFdi" crossorigin="anonymous">
7
+ </head>
8
+ <body>
9
+ <div class="container">
10
+ <h1>Hyper-D3 Demos</h1>
11
+ <ul>
12
+ <% @visualizations.sort.each do |script, title| %>
13
+ <li><%= link_to title, "/visualizations/#{script}" %></li>
14
+ <% end %>
15
+ </ul>
16
+ </div>
17
+ </body>
18
+ </html>
@@ -0,0 +1,28 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <meta charset="utf-8">
5
+ <title><%= @visualizations[params[:id].to_sym] %></title>
6
+ <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-alpha.5/css/bootstrap.min.css" integrity="sha384-AysaV+vQoT3kOAXZkl02PThvDr8HYKPZhNT5h/CXfBThSRXQ6jW5DO2ekP5ViFdi" crossorigin="anonymous">
7
+ <link href='//cdnjs.cloudflare.com/ajax/libs/highlight.js/9.8.0/styles/default.min.css' rel='stylesheet'/>
8
+ <script src='//cdnjs.cloudflare.com/ajax/libs/highlight.js/9.8.0/highlight.min.js'></script>
9
+ <%= javascript_include_tag 'application' %>
10
+ <script>hljs.initHighlightingOnLoad();</script>
11
+ </head>
12
+ <body>
13
+ <div class="container">
14
+ <h1><%= @visualizations[params[:id].to_sym] %></h1>
15
+ <div id="visualization"></div>
16
+ <div id="code">
17
+ <h1>Code</h1>
18
+ <pre><code><%=
19
+ open("#{__dir__}/../../assets/javascripts/#{params[:id]}.rb").read
20
+ %></code></pre>
21
+ </div>
22
+ <script src="../assets/<%= params[:id] %>.js"></script>
23
+ <script>
24
+ window.onload = function() { Opal.load("<%= params[:id] %>"); }
25
+ </script>
26
+ </div>
27
+ </body>
28
+ </html>
@@ -0,0 +1,13 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <title>TestApp</title>
5
+ <%= csrf_meta_tags %>
6
+
7
+ <%= stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track': 'reload' %>
8
+ </head>
9
+
10
+ <body>
11
+ <%= yield %>
12
+ </body>
13
+ </html>
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env ruby
2
+ ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../../Gemfile', __FILE__)
3
+ load Gem.bin_path('bundler', 'bundle')
@@ -0,0 +1,4 @@
1
+ #!/usr/bin/env ruby
2
+ APP_PATH = File.expand_path('../config/application', __dir__)
3
+ require_relative '../config/boot'
4
+ require 'rails/commands'
@@ -0,0 +1,4 @@
1
+ #!/usr/bin/env ruby
2
+ require_relative '../config/boot'
3
+ require 'rake'
4
+ Rake.application.run
@@ -0,0 +1,38 @@
1
+ #!/usr/bin/env ruby
2
+ require 'pathname'
3
+ require 'fileutils'
4
+ include FileUtils
5
+
6
+ # path to your application root.
7
+ APP_ROOT = Pathname.new File.expand_path('../../', __FILE__)
8
+
9
+ def system!(*args)
10
+ system(*args) || abort("\n== Command #{args} failed ==")
11
+ end
12
+
13
+ chdir APP_ROOT do
14
+ # This script is a starting point to setup your application.
15
+ # Add necessary setup steps to this file.
16
+
17
+ puts '== Installing dependencies =='
18
+ system! 'gem install bundler --conservative'
19
+ system('bundle check') || system!('bundle install')
20
+
21
+ # Install JavaScript dependencies if using Yarn
22
+ # system('bin/yarn')
23
+
24
+
25
+ # puts "\n== Copying sample files =="
26
+ # unless File.exist?('config/database.yml')
27
+ # cp 'config/database.yml.sample', 'config/database.yml'
28
+ # end
29
+
30
+ puts "\n== Preparing database =="
31
+ system! 'bin/rails db:setup'
32
+
33
+ puts "\n== Removing old logs and tempfiles =="
34
+ system! 'bin/rails log:clear tmp:clear'
35
+
36
+ puts "\n== Restarting application server =="
37
+ system! 'bin/rails restart'
38
+ end