derailed-ziya 2.0.8 → 2.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (263) hide show
  1. data/Manifest.txt +240 -432
  2. data/README.txt +104 -97
  3. data/Rakefile +3 -2
  4. data/bin/ziyafy +33 -10
  5. data/examples/charts/basic_chart.rb +47 -0
  6. data/{charts → examples/charts/public/charts}/AC_RunActiveContent.js +0 -0
  7. data/{charts → examples/charts/public/charts}/charts.swf +0 -0
  8. data/{charts → examples/charts/public/charts}/charts_library/ar3d.swf +0 -0
  9. data/{charts → examples/charts/public/charts}/charts_library/arno.swf +0 -0
  10. data/{charts → examples/charts/public/charts}/charts_library/ars3.swf +0 -0
  11. data/{charts → examples/charts/public/charts}/charts_library/arst.swf +0 -0
  12. data/{charts → examples/charts/public/charts}/charts_library/brfl.swf +0 -0
  13. data/{charts → examples/charts/public/charts}/charts_library/brno.swf +0 -0
  14. data/{charts → examples/charts/public/charts}/charts_library/brst.swf +0 -0
  15. data/{charts → examples/charts/public/charts}/charts_library/buno.swf +0 -0
  16. data/{charts → examples/charts/public/charts}/charts_library/cl3d.swf +0 -0
  17. data/{charts → examples/charts/public/charts}/charts_library/clfl.swf +0 -0
  18. data/{charts → examples/charts/public/charts}/charts_library/clim.swf +0 -0
  19. data/{charts → examples/charts/public/charts}/charts_library/clno.swf +0 -0
  20. data/{charts → examples/charts/public/charts}/charts_library/clp3.swf +0 -0
  21. data/{charts → examples/charts/public/charts}/charts_library/cls3.swf +0 -0
  22. data/{charts → examples/charts/public/charts}/charts_library/clst.swf +0 -0
  23. data/{charts → examples/charts/public/charts}/charts_library/cnno.swf +0 -0
  24. data/{charts → examples/charts/public/charts}/charts_library/dono.swf +0 -0
  25. data/{charts → examples/charts/public/charts}/charts_library/lnno.swf +0 -0
  26. data/{charts → examples/charts/public/charts}/charts_library/mxno.swf +0 -0
  27. data/{charts → examples/charts/public/charts}/charts_library/pi3d.swf +0 -0
  28. data/{charts → examples/charts/public/charts}/charts_library/piim.swf +0 -0
  29. data/{charts → examples/charts/public/charts}/charts_library/pino.swf +0 -0
  30. data/{charts → examples/charts/public/charts}/charts_library/pono.swf +0 -0
  31. data/{charts → examples/charts/public/charts}/charts_library/scno.swf +0 -0
  32. data/{charts → examples/charts/public/charts}/full_screen.swf +0 -0
  33. data/{charts → examples/charts/public/charts}/scripts/output_jpg.php +0 -0
  34. data/{charts → examples/charts/public/charts}/sliders/black.swf +0 -0
  35. data/{charts → examples/charts/public/charts}/sliders/preview_handle_1.swf +0 -0
  36. data/{charts → examples/charts/public/charts}/sliders/preview_handle_2.swf +0 -0
  37. data/examples/charts/public/charts/themes/cool_theme/column_chart.yml +150 -0
  38. data/{charts → examples/charts/public/charts}/themes/readme.txt +0 -0
  39. data/examples/charts/views/index.erb +12 -0
  40. data/examples/maps/basic_map.rb +72 -0
  41. data/examples/maps/helpers/map_helper.rb +15 -0
  42. data/examples/maps/models/confidential_herpes_report.rb +78 -0
  43. data/examples/maps/public/javascripts/jquery-1.3.2.js +4376 -0
  44. data/examples/maps/public/map.xml +336 -0
  45. data/examples/maps/public/maps/js/Exception.js +45 -0
  46. data/examples/maps/public/maps/js/FlashProxy.js +72 -0
  47. data/examples/maps/public/maps/js/FlashSerializer.js +165 -0
  48. data/examples/maps/public/maps/js/FlashTag.js +111 -0
  49. data/examples/maps/public/maps/js/JavaScriptFlashGateway.js +455 -0
  50. data/examples/maps/public/maps/js/JavaScriptFlashGateway.swf +0 -0
  51. data/examples/maps/public/maps/map_library/australia.swf +0 -0
  52. data/examples/maps/public/maps/map_library/belgium.swf +0 -0
  53. data/examples/maps/public/maps/map_library/brazil.swf +0 -0
  54. data/examples/maps/public/maps/map_library/canada.swf +0 -0
  55. data/examples/maps/public/maps/map_library/europe.swf +0 -0
  56. data/examples/maps/public/maps/map_library/france.swf +0 -0
  57. data/examples/maps/public/maps/map_library/germany.swf +0 -0
  58. data/examples/maps/public/maps/map_library/italy.swf +0 -0
  59. data/examples/maps/public/maps/map_library/mexico.swf +0 -0
  60. data/examples/maps/public/maps/map_library/sweden.swf +0 -0
  61. data/examples/maps/public/maps/map_library/uk_ireland.swf +0 -0
  62. data/examples/maps/public/maps/map_library/us.swf +0 -0
  63. data/examples/maps/public/maps/map_library/us_canada.swf +0 -0
  64. data/examples/maps/public/maps/map_library/world.swf +0 -0
  65. data/examples/maps/public/maps/themes/default/base_map.yml +27 -0
  66. data/examples/maps/public/maps/themes/default/us_map.yml +20 -0
  67. data/examples/maps/public/maps/themes/default/us_map_2.yml +17 -0
  68. data/examples/maps/public/maps/themes/readme.txt +13 -0
  69. data/examples/maps/public/stylesheets/map.css +16 -0
  70. data/examples/maps/views/index.erb +26 -0
  71. data/examples/maps/views/layout.erb +21 -0
  72. data/lib/ziya/charts/base.rb +15 -14
  73. data/lib/ziya/{components → charts/support}/area.rb +2 -2
  74. data/lib/ziya/{components → charts/support}/axis_category.rb +1 -1
  75. data/lib/ziya/{components → charts/support}/axis_ticks.rb +1 -1
  76. data/lib/ziya/{components → charts/support}/axis_value.rb +1 -1
  77. data/lib/ziya/{components → charts/support}/base.rb +9 -21
  78. data/lib/ziya/{components → charts/support}/bevel.rb +1 -1
  79. data/lib/ziya/{components → charts/support}/blur.rb +1 -1
  80. data/lib/ziya/{components → charts/support}/button.rb +1 -1
  81. data/lib/ziya/{components → charts/support}/chart_border.rb +1 -1
  82. data/lib/ziya/{components → charts/support}/chart_grid_h.rb +1 -1
  83. data/lib/ziya/{components → charts/support}/chart_grid_v.rb +1 -1
  84. data/lib/ziya/{components → charts/support}/chart_guide.rb +1 -1
  85. data/lib/ziya/{components → charts/support}/chart_label.rb +1 -1
  86. data/lib/ziya/{components → charts/support}/chart_note.rb +1 -1
  87. data/lib/ziya/{components → charts/support}/chart_pref.rb +1 -1
  88. data/lib/ziya/{components → charts/support}/chart_rect.rb +1 -1
  89. data/lib/ziya/{components → charts/support}/chart_transition.rb +1 -1
  90. data/lib/ziya/{components → charts/support}/circle.rb +1 -1
  91. data/lib/ziya/{components → charts/support}/context_menu.rb +1 -3
  92. data/lib/ziya/{components → charts/support}/draw.rb +31 -8
  93. data/lib/ziya/{components → charts/support}/draw_base.rb +1 -1
  94. data/lib/ziya/{components → charts/support}/filter.rb +1 -1
  95. data/lib/ziya/{components → charts/support}/flash_to_javascript.rb +1 -3
  96. data/lib/ziya/{components → charts/support}/glow.rb +1 -1
  97. data/lib/ziya/{components → charts/support}/image.rb +1 -1
  98. data/lib/ziya/{components → charts/support}/legend.rb +1 -1
  99. data/lib/ziya/{components → charts/support}/line.rb +1 -1
  100. data/lib/ziya/{components → charts/support}/link.rb +1 -1
  101. data/lib/ziya/{components → charts/support}/link_data.rb +1 -1
  102. data/lib/ziya/{components → charts/support}/rect.rb +1 -1
  103. data/lib/ziya/{components → charts/support}/scroll.rb +1 -3
  104. data/lib/ziya/{components → charts/support}/series.rb +1 -3
  105. data/lib/ziya/{components → charts/support}/series_color.rb +1 -1
  106. data/lib/ziya/{components → charts/support}/series_explode.rb +1 -1
  107. data/lib/ziya/{components → charts/support}/shadow.rb +1 -1
  108. data/lib/ziya/{components → charts/support}/text.rb +9 -1
  109. data/lib/ziya/{components → charts/support}/tooltip.rb +1 -1
  110. data/lib/ziya/{components → charts/support}/update.rb +1 -1
  111. data/lib/ziya/core_ext/string.rb +31 -0
  112. data/lib/ziya/gauges/base.rb +17 -12
  113. data/lib/ziya/gauges/support/base.rb +4 -12
  114. data/lib/ziya/gauges/support/radial_numbers.rb +1 -1
  115. data/lib/ziya/html_helpers/base.rb +91 -0
  116. data/lib/ziya/html_helpers/charts.rb +200 -0
  117. data/lib/ziya/html_helpers/gauges.rb +90 -0
  118. data/lib/ziya/html_helpers/maps.rb +74 -0
  119. data/lib/ziya/html_helpers.rb +1 -0
  120. data/lib/ziya/maps/australia.rb +9 -0
  121. data/lib/ziya/maps/base.rb +409 -0
  122. data/lib/ziya/maps/belgium.rb +7 -0
  123. data/lib/ziya/maps/brazil.rb +7 -0
  124. data/lib/ziya/maps/canada.rb +7 -0
  125. data/lib/ziya/maps/europe.rb +7 -0
  126. data/lib/ziya/maps/france.rb +7 -0
  127. data/lib/ziya/maps/geocode.rb +18 -0
  128. data/lib/ziya/maps/germany.rb +7 -0
  129. data/lib/ziya/maps/italy.rb +7 -0
  130. data/lib/ziya/maps/mexico.rb +7 -0
  131. data/lib/ziya/maps/support/arc.rb +7 -0
  132. data/lib/ziya/maps/support/arc_color.rb +7 -0
  133. data/lib/ziya/maps/support/arc_range.rb +7 -0
  134. data/lib/ziya/maps/support/background_color.rb +7 -0
  135. data/lib/ziya/maps/support/base.rb +34 -0
  136. data/lib/ziya/maps/support/default_color.rb +7 -0
  137. data/lib/ziya/maps/support/default_point.rb +7 -0
  138. data/lib/ziya/maps/support/first_zoom.rb +7 -0
  139. data/lib/ziya/maps/support/heat_range.rb +35 -0
  140. data/lib/ziya/maps/support/hover.rb +7 -0
  141. data/lib/ziya/maps/support/line.rb +7 -0
  142. data/lib/ziya/maps/support/line_color.rb +7 -0
  143. data/lib/ziya/maps/support/line_range.rb +7 -0
  144. data/lib/ziya/maps/support/outline_color.rb +7 -0
  145. data/lib/ziya/maps/support/point.rb +8 -0
  146. data/lib/ziya/maps/support/point_range.rb +7 -0
  147. data/lib/ziya/maps/support/range.rb +31 -0
  148. data/lib/ziya/maps/support/ranges.rb +18 -0
  149. data/lib/ziya/maps/support/region.rb +7 -0
  150. data/lib/ziya/maps/support/scale_points.rb +7 -0
  151. data/lib/ziya/maps/support/show_name.rb +7 -0
  152. data/lib/ziya/maps/support/state.rb +7 -0
  153. data/lib/ziya/maps/support/state_info_icon.rb +7 -0
  154. data/lib/ziya/maps/support/zoom_mode.rb +7 -0
  155. data/lib/ziya/maps/support/zoom_out_button.rb +7 -0
  156. data/lib/ziya/maps/support/zoom_out_scale.rb +7 -0
  157. data/lib/ziya/maps/sweden.rb +7 -0
  158. data/lib/ziya/maps/uk.rb +7 -0
  159. data/lib/ziya/maps/us.rb +7 -0
  160. data/lib/ziya/maps/world.rb +7 -0
  161. data/lib/ziya/version.rb +3 -3
  162. data/lib/ziya/yaml_helpers/base.rb +20 -0
  163. data/lib/ziya/yaml_helpers/charts.rb +49 -0
  164. data/lib/ziya/yaml_helpers/gauges.rb +33 -0
  165. data/lib/ziya/yaml_helpers/maps.rb +17 -0
  166. data/lib/ziya/yaml_helpers.rb +1 -0
  167. data/lib/ziya.rb +20 -11
  168. data/resources/charts/AC_RunActiveContent.js +292 -0
  169. data/resources/charts/charts.swf +0 -0
  170. data/resources/charts/charts_library/ar3d.swf +0 -0
  171. data/resources/charts/charts_library/arno.swf +0 -0
  172. data/resources/charts/charts_library/ars3.swf +0 -0
  173. data/resources/charts/charts_library/arst.swf +0 -0
  174. data/resources/charts/charts_library/brfl.swf +0 -0
  175. data/resources/charts/charts_library/brno.swf +0 -0
  176. data/resources/charts/charts_library/brst.swf +0 -0
  177. data/resources/charts/charts_library/buno.swf +0 -0
  178. data/resources/charts/charts_library/cl3d.swf +0 -0
  179. data/resources/charts/charts_library/clfl.swf +0 -0
  180. data/resources/charts/charts_library/clim.swf +0 -0
  181. data/resources/charts/charts_library/clno.swf +0 -0
  182. data/resources/charts/charts_library/clp3.swf +0 -0
  183. data/resources/charts/charts_library/cls3.swf +0 -0
  184. data/resources/charts/charts_library/clst.swf +0 -0
  185. data/resources/charts/charts_library/cnno.swf +0 -0
  186. data/resources/charts/charts_library/dono.swf +0 -0
  187. data/resources/charts/charts_library/lnno.swf +0 -0
  188. data/resources/charts/charts_library/mxno.swf +0 -0
  189. data/resources/charts/charts_library/pi3d.swf +0 -0
  190. data/resources/charts/charts_library/piim.swf +0 -0
  191. data/resources/charts/charts_library/pino.swf +0 -0
  192. data/resources/charts/charts_library/pono.swf +0 -0
  193. data/resources/charts/charts_library/scno.swf +0 -0
  194. data/resources/charts/full_screen.swf +0 -0
  195. data/resources/charts/scripts/output_jpg.php +23 -0
  196. data/resources/charts/sliders/black.swf +0 -0
  197. data/resources/charts/sliders/preview_handle_1.swf +0 -0
  198. data/resources/charts/sliders/preview_handle_2.swf +0 -0
  199. data/resources/charts/themes/readme.txt +13 -0
  200. data/{gauges → resources/gauges}/designs/circle.yml +0 -0
  201. data/{gauges → resources/gauges}/designs/signal.yml +0 -0
  202. data/{gauges → resources/gauges}/designs/thermo.yml +0 -0
  203. data/{gauges → resources/gauges}/designs/title.yml +0 -0
  204. data/{gauges → resources/gauges}/gauge.swf +0 -0
  205. data/resources/maps/js/Exception.js +45 -0
  206. data/resources/maps/js/FlashProxy.js +72 -0
  207. data/resources/maps/js/FlashSerializer.js +165 -0
  208. data/resources/maps/js/FlashTag.js +111 -0
  209. data/resources/maps/js/JavaScriptFlashGateway.js +455 -0
  210. data/resources/maps/js/JavaScriptFlashGateway.swf +0 -0
  211. data/resources/maps/map_library/australia.swf +0 -0
  212. data/resources/maps/map_library/belgium.swf +0 -0
  213. data/resources/maps/map_library/brazil.swf +0 -0
  214. data/resources/maps/map_library/canada.swf +0 -0
  215. data/resources/maps/map_library/europe.swf +0 -0
  216. data/resources/maps/map_library/france.swf +0 -0
  217. data/resources/maps/map_library/germany.swf +0 -0
  218. data/resources/maps/map_library/italy.swf +0 -0
  219. data/resources/maps/map_library/mexico.swf +0 -0
  220. data/resources/maps/map_library/sweden.swf +0 -0
  221. data/resources/maps/map_library/uk_ireland.swf +0 -0
  222. data/resources/maps/map_library/us.swf +0 -0
  223. data/resources/maps/map_library/us_canada.swf +0 -0
  224. data/resources/maps/map_library/world.swf +0 -0
  225. data/resources/maps/themes/readme.txt +13 -0
  226. data/spec/charts/base_spec.rb +2 -2
  227. data/spec/charts/chart_type_spec.rb +3 -4
  228. data/spec/{components → charts/support}/area_spec.rb +8 -8
  229. data/spec/charts/support/draw_spec.rb +41 -0
  230. data/spec/{components → charts/support}/filter_spec.rb +6 -6
  231. data/spec/{components → charts/support}/link_spec.rb +6 -6
  232. data/spec/{components → charts/support}/series.rb +4 -4
  233. data/spec/{components → charts/support}/series_color_spec.rb +4 -4
  234. data/spec/{components → charts/support}/series_explode.rb +4 -4
  235. data/spec/{components → charts/support}/series_explode_spec.rb +4 -4
  236. data/spec/core_ext/string_spec.rb +40 -0
  237. data/spec/gauges/base_spec.rb +1 -1
  238. data/spec/html_helpers/base_spec.rb +50 -0
  239. data/spec/html_helpers/charts_spec.rb +23 -0
  240. data/spec/html_helpers/gauges_spec.rb +16 -0
  241. data/spec/html_helpers/maps_spec.rb +20 -0
  242. data/spec/maps/base_spec.rb +82 -0
  243. data/spec/maps/support/default_color_spec.rb +29 -0
  244. data/spec/maps/support/heat_range_spec.rb +29 -0
  245. data/spec/maps/us_spec.rb +12 -0
  246. data/spec/maps/world_spec.rb +18 -0
  247. data/spec/spec_helper.rb +5 -4
  248. data/spec/themes/maps/base_map.yml +81 -0
  249. data/spec/themes/maps/us_map.yml +6 -0
  250. data/spec/themes/maps/world_map.yml +6 -0
  251. data/spec/themes/maps/world_ov_map.yml +6 -0
  252. data/spec/{helpers/base_helper_spec.rb → yaml_helpers/charts_spec.rb} +10 -13
  253. data/spec/yaml_helpers/gauges_spec.rb +15 -0
  254. data/spec/ziya_helper_spec.rb +118 -116
  255. data/tasks/gem.rake +1 -1
  256. data/tasks/setup.rb +1 -1
  257. data/ziya.gemspec +39 -0
  258. metadata +259 -438
  259. data/lib/ziya/helpers/base_helper.rb +0 -91
  260. data/lib/ziya/utils/text.rb +0 -39
  261. data/lib/ziya/ziya_helper.rb +0 -362
  262. data/spec/components/draw_spec.rb +0 -37
  263. data/spec/utils/text_spec.rb +0 -33
@@ -3,7 +3,7 @@
3
3
  #
4
4
  # Author:: Fernand Galiana
5
5
  # -----------------------------------------------------------------------------
6
- module Ziya::Components
6
+ module Ziya::Charts::Support
7
7
  # Specifies the shadow filter to be applied to some component ie chart_rect, axis_value, etc...
8
8
  # See http://www.maani.us/xml_charts/index.php?menu=Reference&submenu=filter
9
9
  # for additional documentation, examples and futher detail.
@@ -4,7 +4,7 @@
4
4
  # Author:: Fernand Galiana
5
5
  # Date:: Dec 15th, 2006
6
6
  # -----------------------------------------------------------------------------
7
- module Ziya::Components
7
+ module Ziya::Charts::Support
8
8
  # Text component to draw text on the chart. Must be set up within the draw
9
9
  # component.
10
10
  # See http://www.maani.us/xml_charts/index.php?menu=Reference&submenu=draw
@@ -13,5 +13,13 @@ module Ziya::Components
13
13
  has_attribute :layer, :transition, :delay, :duration, :x, :y, :width,
14
14
  :height, :h_align, :v_align, :rotation, :font, :bold, :size,
15
15
  :color, :alpha, :shadow, :bevel, :glow, :blur, :text
16
+
17
+ # -------------------------------------------------------------------------
18
+ # Dump has_attribute into xml element
19
+ def flatten( xml )
20
+ opts = options.clone
21
+ text = opts.delete( :text )
22
+ xml.text( opts ) { |x| x.text!( text.to_s ) }
23
+ end
16
24
  end
17
25
  end
@@ -6,7 +6,7 @@
6
6
  #
7
7
  # Author:: Fernand Galiana
8
8
  # -----------------------------------------------------------------------------
9
- module Ziya::Components
9
+ module Ziya::Charts::Support
10
10
  # Specifies the label for the chart element actual value. This can be setup to
11
11
  # be fixed or as a tooltip
12
12
  # See http://www.maani.us/xml_charts/index.php?menu=Reference&submenu=tooltip
@@ -4,7 +4,7 @@
4
4
  #
5
5
  # Author:: Fernand Galiana
6
6
  # -----------------------------------------------------------------------------
7
- module Ziya::Components
7
+ module Ziya::Charts::Support
8
8
  # Updates the chart at intervals, without reloading the web page. This makes it possible
9
9
  # to display charts with live data, change the chart's look over time for emphasis, or
10
10
  # create a slideshow from different charts.
@@ -0,0 +1,31 @@
1
+ # -----------------------------------------------------------------------------
2
+ # Various text utils. Yes indeed lifted from Inflector.
3
+ #
4
+ # Author:: Fernand Galiana
5
+ # Date:: Dec 15th, 2006
6
+ # -----------------------------------------------------------------------------
7
+ class String
8
+ # Pulled from the Rails Inflector class and modified slightly to fit our needs.
9
+ def camelize_it()
10
+ self.gsub(/\/(.?)/) { "::" + $1.upcase }.gsub(/(^|_)(.)/) { $2.upcase }
11
+ end
12
+
13
+ # Same as Rails Inflector but eliminating inflector dependency
14
+ def underscore
15
+ self.to_s.gsub(/::/, '/').
16
+ gsub(/([A-Z]+)([A-Z][a-z])/,'\1_\2').
17
+ gsub(/([a-z\d])([A-Z])/,'\1_\2').
18
+ tr("-", "_").
19
+ downcase
20
+ end
21
+
22
+ # Pulled from the Rails Inflector class and modified slightly to fit our needs.
23
+ def classify
24
+ self.sub(/.*\./, '').camelize_it
25
+ end
26
+
27
+ # strip out module name and return bare class name
28
+ def demodulize
29
+ self.gsub( /^.*::/, '' )
30
+ end
31
+ end
@@ -1,6 +1,11 @@
1
+ require 'ziya/yaml_helpers/gauges'
2
+ require 'ziya/html_helpers/gauges'
3
+ require 'erb'
4
+ require 'cgi'
5
+
1
6
  module Ziya::Gauges
2
7
  class Base
3
- include Ziya::Helpers::BaseHelper
8
+ include Ziya::YamlHelpers::Gauges, Ziya::HtmlHelpers::Gauges
4
9
 
5
10
  attr_accessor :license, :design_id
6
11
  attr_reader :type, :components
@@ -12,7 +17,7 @@ module Ziya::Gauges
12
17
 
13
18
  # load up associated helper
14
19
  loaded = load_helper( Ziya.helpers_dir ) if Ziya.helpers_dir
15
- Ziya.logger.warn( ">>> ZiYa -- no helper for gauge `#{design_id}" ) unless loaded
20
+ Ziya.logger.debug( ">>> ZiYa -- no helper for gauge `#{design_id}" ) unless loaded
16
21
 
17
22
  # init defaults
18
23
  @options = default_options
@@ -64,7 +69,7 @@ module Ziya::Gauges
64
69
 
65
70
  # retrieve bundled design directory
66
71
  def bundled_designs_dir
67
- Ziya.path( %w[gauges designs] )
72
+ Ziya.path( %w[resources gauges designs] )
68
73
  end
69
74
 
70
75
  # -----------------------------------------------------------------------
@@ -74,7 +79,7 @@ module Ziya::Gauges
74
79
  unless helper_file =~ /^(#{design_id}_helper).rb$/ or helper_file =~ /^(base_helper).rb$/
75
80
  next
76
81
  end
77
- Ziya.logger.info( ">>> ZiYa loading custom helper `#{$1}" )
82
+ Ziya.logger.debug( ">>> ZiYa loading custom helper `#{$1}" )
78
83
  # BOZO !! This will only work in rails ??
79
84
  if defined? RAILS_ROOT
80
85
  require_dependency File.join(helper_dir, $1)
@@ -118,7 +123,7 @@ module Ziya::Gauges
118
123
  elsif std_design
119
124
  design = std_design
120
125
  end
121
- # Ziya.logger.debug "!!!! Design\n#{design.to_yaml}"
126
+ # Ziya.logger.info "!!!! Design #{design_id} -- \n#{design.to_yaml}"
122
127
  # flatten components to xml
123
128
  design.components.each do |name, value|
124
129
  # Ziya.logger.debug "Processing #{name}"
@@ -148,23 +153,23 @@ module Ziya::Gauges
148
153
  # -----------------------------------------------------------------------
149
154
  # Load yaml file associated with class if any
150
155
  def inflate( clazz, designs_dir, design )
151
- class_name = underscore( demodulize( clazz.to_s ) )
156
+ class_name = clazz.to_s.demodulize.underscore
152
157
  begin
153
158
  file_name = "#{designs_dir}/#{design}.yml"
154
159
  Ziya.logger.debug ">>> ZiYa attempt to load design file '#{file_name}"
155
160
  return nil unless File.exists?( file_name )
156
161
  yml = IO.read( file_name )
157
- # Ziya.logger.debug ">>> Unprocessed yaml...\n#{yml}\n"
162
+ # Ziya.logger.info ">>> Unprocessed yaml...\n#{yml}\n"
158
163
  processed = erb_render( yml )
159
- # Ziya.logger.debug ">>> Processed yaml...\n#{processed}"
164
+ # Ziya.logger.info ">>> Processed yaml...\n#{processed}"
160
165
  load = YAML::load( processed )
161
- Ziya.logger.info ">>> ZiYa successfully loaded design file `#{file_name}"
166
+ Ziya.logger.debug ">>> ZiYa successfully loaded design file `#{file_name}"
162
167
  return load
163
168
  rescue SystemCallError => boom
164
- Ziya.logger.error boom
169
+ Ziya.logger.debug boom
165
170
  rescue => bang
166
- Ziya.logger.error ">>> ZiYa -- Error encountered loading design file `#{file_name} -- #{bang}"
167
- bang.backtrace.each { |l| Ziya.logger.error( l ) }
171
+ Ziya.logger.info ">>> ZiYa -- Error encountered loading design file `#{file_name} -- #{bang}"
172
+ bang.backtrace[0..3].each { |l| Ziya.logger.debug( l ) }
168
173
  end
169
174
  nil
170
175
  end
@@ -1,32 +1,24 @@
1
1
  module Ziya::Gauges::Support
2
- class Base < Ziya::Components::Base
3
- include Ziya::Helpers::BaseHelper
2
+ class Base < Ziya::Charts::Support::Base
3
+ include Ziya::YamlHelpers::Gauges
4
4
 
5
5
  # -----------------------------------------------------------------------
6
6
  # converts component to yaml style component for yaml parser consumption
7
7
  def to_comp_yaml( name, indent_multiplier=1 )
8
8
  buff = []
9
9
  tab = indent( indent_multiplier )
10
- buff << "#{dial( demodulize( self.class.name ), name )}"
10
+ buff << "#{dial( self.class.name.demodulize, name )}"
11
11
  options.each_pair do |k,v|
12
12
  if v.is_a? YAML::Omap
13
13
  buff << "#{tab}#{indent}#{dials}"
14
14
  v.each do |name, comp|
15
- buff << "#{tab}#{indent(2)}#{dial( demodulize(comp.class.name), name )}"
15
+ buff << "#{tab}#{indent(2)}#{dial( comp.class.name.demodulize, name )}"
16
16
  comp.options.each_pair { |k,v| buff << "#{tab}#{indent(4)}#{k}: #{v}"}
17
17
  end
18
18
  else
19
19
  buff << "#{tab}#{indent(1)}#{k}: #{v}" if options[k] and !options[k].to_s.empty?
20
20
  end
21
21
  end
22
-
23
- # if ( self.respond_to? :dials )
24
- # buff << "#{tab}dials:"
25
- # for dial in dials do
26
- # buff << "#{tab}#{dial( demodulize( dial.class.name ) )}"
27
- # dial.options.each_pair { |k,v| buff << "#{tab}#{tab}#{k}: #{v}"}
28
- # end
29
- # end
30
22
  buff.join( "\n" )
31
23
  end
32
24
  end
@@ -12,7 +12,7 @@ module Ziya::Gauges::Support
12
12
  has_attribute :start_num, :end_num,
13
13
  :font, :size, :bold, :width, :height, :align
14
14
 
15
- # overrides flatten to generate a series of radial tick marksß
15
+ # overrides flatten to generate a series of radial tick marks
16
16
  def flatten( xml )
17
17
  number = start_num
18
18
  i = start_angle
@@ -0,0 +1,91 @@
1
+ require 'ziya/core_ext/string'
2
+
3
+ module Ziya
4
+ module HtmlHelpers
5
+ module Base
6
+
7
+ def mime() "application/x-shockwave-flash"; end
8
+ def plugin_url() "http://www.macromedia.com/go/getflashplayer"; end
9
+
10
+ # Set the wmode to opaque if a bgcolor is specified. If not set to
11
+ # transparent mode unless user overrides it
12
+ def setup_wmode( options )
13
+ if options[:bgcolor]
14
+ options[:wmode] = "opaque" unless options[:wmode]
15
+ else
16
+ options[:wmode] = "transparent" unless options[:wmode]
17
+ options[:bgcolor] = "#FFFFFF"
18
+ end
19
+ end
20
+
21
+ # Check args for size option in the format wXy (Submitted by Sam Livingston-Gray)
22
+ def setup_movie_size( options )
23
+ if options[:size] =~ /(\d+)x(\d+)/
24
+ options[:width] = $1
25
+ options[:height] = $2
26
+ options.delete :size
27
+ end
28
+ end
29
+
30
+ # escape url
31
+ def escape_url( url )
32
+ url ? CGI.escape( url.gsub( /&amp;/, '&' ) ) : url
33
+ end
34
+
35
+ # # All this stolen form rails to make Ziya work with other fmks....
36
+ def tag(name, options = nil, open = false, escape = true)
37
+ "<#{name}#{tag_options(options, escape) if options}" + (open ? ">" : " />")
38
+ end
39
+
40
+ def escape_once(html)
41
+ html.to_s.gsub(/[\"><]|&(?!([a-zA-Z]+|(#\d+));)/) { |special| escape_chars[special] }
42
+ end
43
+
44
+ def tag_options(options, escape = true)
45
+ unless !options or options.empty?
46
+ attrs = []
47
+ if escape
48
+ options.each do |key, value|
49
+ next unless value
50
+ key = key.to_s
51
+ value = escape_once(value)
52
+ attrs << %(#{key}="#{value}")
53
+ end
54
+ else
55
+ attrs = options.map { |key, value| %(#{key}="#{value}") }
56
+ end
57
+ " #{attrs.sort * ' '}" unless attrs.empty?
58
+ end
59
+ end
60
+ #
61
+ # def content_tag(name, content_or_options_with_block = nil, options = nil, escape = true, &block)
62
+ # if block_given?
63
+ # options = content_or_options_with_block if content_or_options_with_block.is_a?(Hash)
64
+ # content = capture_block(&block)
65
+ # content_tag = content_tag_string(name, content, options, escape)
66
+ # block_is_within_action_view?(block) ? concat(content_tag, block.binding) : content_tag
67
+ # else
68
+ # content = content_or_options_with_block
69
+ # content_tag_string(name, content, options, escape)
70
+ # end
71
+ # end
72
+ #
73
+ # def capture_block( *args, &block )
74
+ # block.call(*args)
75
+ # end
76
+ #
77
+ # def content_tag_string(name, content, options, escape = true)
78
+ # tag_options = tag_options(options, escape) if options
79
+ # "<#{name}#{tag_options}>#{content}</#{name}>"
80
+ # end
81
+ #
82
+ # def block_is_within_action_view?(block)
83
+ # eval("defined? _erbout", block.binding)
84
+ # end
85
+ #
86
+ def escape_chars
87
+ { '&' => '&amp;', '"' => '&quot;', '>' => '&gt;', '<' => '&lt;' }
88
+ end
89
+ end
90
+ end
91
+ end
@@ -0,0 +1,200 @@
1
+ # Generates necessary html flash tag to support ZiYa
2
+ #
3
+ # TODO -- Rewrite to use content tag block instead...
4
+ #
5
+ # Author: Fernand Galiana
6
+
7
+ module Ziya::HtmlHelpers::Charts
8
+ include Ziya::HtmlHelpers::Base
9
+
10
+ # generates a javascript tag to include the js script to create object and
11
+ # embed tags
12
+ def ziya_javascript_include_tag( opts={} )
13
+ options = { :swf_path => chart_path,
14
+ :major_vers => 9,
15
+ :minor_vers => 0,
16
+ :req_vers => 45 }.merge!( opts )
17
+
18
+ js = <<-JS
19
+ <script language="javascript" type="text/javascript">
20
+ AC_FL_RunContent = 0;
21
+ DetectFlashVer = 0;
22
+ </script>
23
+ <script src="#{options[:swf_path]}/AC_RunActiveContent.js" language="javascript"></script>
24
+ <script language="javascript" type="text/javascript">
25
+ var requiredMajorVersion = #{options[:major_vers]};
26
+ var requiredMinorVersion = #{options[:minor_vers]};
27
+ var requiredRevision = #{options[:req_vers]};
28
+ </script>
29
+ JS
30
+ end
31
+
32
+ def default_chart_options
33
+ {
34
+ :width => "400",
35
+ :height => "300",
36
+ :bgcolor => "ffffff",
37
+ :wmode => "opaque",
38
+ :menu => true,
39
+ :full_screen => true,
40
+ :align => "l",
41
+ :salign => "tl",
42
+ :scale => "noscale",
43
+ :use_cache => false,
44
+ :timeout => nil,
45
+ :retry => 2,
46
+ :use_stage => false,
47
+ :id => "ziya_chart",
48
+ :swf_path => chart_path,
49
+ :asset_url => chart_path
50
+ }
51
+ end
52
+
53
+ # generates necessary object and embed tags to display a flash movie on various
54
+ # browsers using javascript
55
+ def ziya_chart_js( url, chart_options={} )
56
+ options = default_chart_options.merge( chart_options )
57
+
58
+ # Setup options for opaque mode
59
+ setup_wmode( options )
60
+
61
+ # setup width and height
62
+ setup_movie_size( options )
63
+
64
+ flash_vars = url ? charts_swf : charts_swf_base
65
+ xml_swf_path = flash_vars % [options[:swf_path], escape_url(url)]
66
+ xml_swf_path << "&chart_id=#{options[:id]}"
67
+ xml_swf_path << "&timestamp=#{Time.now.to_i}" if options[:cache] == false
68
+ xml_swf_path << "&timeout=#{options[:timeout]}&retry=#{options[:retry]}" if options[:timeout]
69
+ xml_swf_path << "&stage_width=#{options[:width]}&stage_height=#{options[:height]}" if options[:use_stage] == true
70
+
71
+ js = <<-JS
72
+ <script language="javascript" type="text/javascript">
73
+ if (AC_FL_RunContent == 0 || DetectFlashVer == 0) {
74
+ alert( "This page requires AC_RunActiveContent.js." );
75
+ }
76
+ else {
77
+ var hasRightVersion = DetectFlashVer(requiredMajorVersion, requiredMinorVersion, requiredRevision);
78
+ if( hasRightVersion ) {
79
+ AC_FL_RunContent(
80
+ 'codebase' , 'http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,45,0',
81
+ 'width' , '#{options[:width]}',
82
+ 'height' , '#{options[:height]}',
83
+ 'scale' , '#{options[:scale]}',
84
+ 'salign' , '#{options[:salign]}',
85
+ 'bgcolor' , '#{options[:bgcolor]}',
86
+ 'wmode' , '#{options[:wmode]}',
87
+ 'movie' , '#{options[:swf_path]}/charts',
88
+ 'src' , '#{options[:swf_path]}/charts',
89
+ 'FlashVars' , '#{xml_swf_path}',
90
+ 'id' , '#{options[:id]}',
91
+ 'name' , '#{options[:id]}',
92
+ 'menu' , '#{options[:menu]}',
93
+ 'allowFullScreen' , '#{options[:full_screen]}',
94
+ 'allowScriptAccess','sameDomain',
95
+ 'quality' , 'high',
96
+ 'align' , '#{options[:align]}',
97
+ 'pluginspage' , 'http://www.macromedia.com/go/getflashplayer',
98
+ 'play' , 'true',
99
+ 'devicefont' , 'false'
100
+ );
101
+ }
102
+ else {
103
+ var alternateContent = 'This content requires the Adobe Flash Player. '
104
+ + '<u><a href=http://www.macromedia.com/go/getflash/>Get Flash</a></u>.';
105
+ document.write(alternateContent);
106
+ }
107
+ }
108
+ </script>
109
+ JS
110
+ end
111
+
112
+ # generates neccessary html tags to display a chart.
113
+ def ziya_chart( url, chart_options = {} )
114
+ options = default_chart_options.merge( chart_options )
115
+
116
+ flash_vars = url ? charts_swf : charts_swf_base
117
+ _ziya_chart( url, flash_vars, "charts.swf", options )
118
+ end
119
+
120
+ # genereates composite chart urls
121
+ def gen_composite_path( swf_chart_dir, url, chart_id=null )
122
+ buff = ""
123
+ if url
124
+ buff = composite_url % [swf_chart_dir, swf_chart_dir, escape_url( url )]
125
+ else
126
+ buff = composite_base_url % [swf_chart_dir, "/charts" ]
127
+ end
128
+ buff << "&chart_id=#{chart_id}" if chart_id
129
+ buff
130
+ end
131
+
132
+ # =========================================================================
133
+ # private
134
+
135
+ # Const accessors...
136
+ def composite_base_url() "%s/charts.swf?library_path=%s/charts_library" end
137
+ def composite_url() "#{composite_base_url}&xml_source=%s" end
138
+ def charts_swf_base() "library_path=%s/charts_library"; end
139
+ def charts_swf() "#{charts_swf_base}&xml_source=%s"; end
140
+ def chart_path() "/charts"; end
141
+ def class_id() "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" end
142
+ def codebase() "http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,45,0"; end
143
+
144
+ # generates swf path
145
+ def gen_swf_path( path_directive, swf_dir, url )
146
+ path_directive % [swf_dir, escape_url( url )]
147
+ end
148
+
149
+ # generated the object and embed tag necessary for the flash movie
150
+ def _ziya_chart( url, swf_path, swf_file, options )
151
+ # Setup options for opaque mode
152
+ setup_wmode( options )
153
+
154
+ # setup width and height
155
+ setup_movie_size( options )
156
+
157
+ color_param = tag( 'param', {:name => 'bgcolor', :value => options[:bgcolor]}, true )
158
+ color_param += tag( 'param', {:name => "wmode", :value => options[:wmode]}, true )
159
+
160
+ xml_swf_path = gen_swf_path( swf_path, options[:swf_path], url )
161
+ xml_swf_path << "&amp;timestamp=#{Time.now.to_i}" if options[:cache] == false
162
+ xml_swf_path << "&amp;timeout=#{options[:timeout]}" if options[:timeout]
163
+ xml_swf_path << "&amp;stage_width=#{options[:width]}&amp;stage_height=#{options[:height]}" if options[:use_stage] == true
164
+
165
+ tags = <<-TAGS
166
+ <object codebase="#{codebase}" classid="#{class_id}" id="#{options[:id]}" height="#{options[:height]}" width="#{options[:width]}">
167
+ <param name="scale" value="noscale"/>
168
+ <param name="salign" value="#{options[:salign]}"/>
169
+ <param name="bgcolor" value="#{options[:bgcolor]}"/>
170
+ <param name="wmode" value="#{options[:wmode]}"/>
171
+ <param name="movie" value="#{options[:asset_url]}/#{swf_file}"/>
172
+ <param name="Flashvars" value="#{xml_swf_path}&amp;chart_id=#{options[:id]}"/>
173
+ <param name="menu" value="true"/>
174
+ <param name="allowFullScreen" value="true"/>
175
+ <param name="allowScriptAccess" value="#{options[:script_access]}"/>
176
+ <param name="quality" value="high"/>
177
+ <param name="play" value="true"/>
178
+ <param name="devicefont" value="false"/>
179
+ <embed scale="noscale"
180
+ allowfullscreen = "true"
181
+ allowscriptaccess = "#{options[:script_access]}"
182
+ bgcolor = "#{options[:bgcolor]}"
183
+ devicefont = "false"
184
+ flashvars = "#{xml_swf_path}&amp;chart_id=#{options[:id]}"
185
+ menu = "true"
186
+ name = "#{options[:id]}"
187
+ play = "true"
188
+ pluginspage = "#{plugin_url}"
189
+ quality = "high"
190
+ salign = "#{options[:salign]}"
191
+ src = "#{options[:asset_url]}/#{swf_file}"
192
+ type = "#{mime}"
193
+ wmode = "#{options[:wmode]}"
194
+ align = "#{options[:align]}"
195
+ height = "#{options[:height]}"
196
+ width = "#{options[:width]}"/>
197
+ </object>
198
+ TAGS
199
+ end
200
+ end
@@ -0,0 +1,90 @@
1
+ # Generates necessary html flash tag to support ZiYa
2
+ #
3
+ # TODO -- Rewrite to use content tag block instead...
4
+ #
5
+ # Author: Fernand Galiana
6
+
7
+ module Ziya::HtmlHelpers::Gauges
8
+ include Ziya::HtmlHelpers::Base
9
+
10
+ # generates necessary html tags to display a gauge.
11
+ def ziya_gauge( url, gauge_options={} )
12
+ options = default_gauge_options.merge( gauge_options )
13
+ _ziya_gauge( url, gauges_swf, options )
14
+ end
15
+
16
+ # =========================================================================
17
+ # private
18
+
19
+ # Const accessors...
20
+ def gauges_swf() "%s/gauge.swf?xml_source=%s"; end
21
+ def gauge_path() "/gauges"; end
22
+ def class_id() "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" end
23
+ def codebase() "http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,45,0"; end
24
+
25
+ def default_gauge_options
26
+ { :width => "200",
27
+ :height => "200",
28
+ :align => "middle",
29
+ :scale => "noscale",
30
+ :script_access => "sameDomain",
31
+ :salign => "",
32
+ :class => "",
33
+ :class_id => "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",
34
+ :id => "ziya_gauge",
35
+ :swf_path => gauge_path,
36
+ :use_cache => false,
37
+ :timeout => false,
38
+ :retry => 2,
39
+ :use_stage => false }
40
+ end
41
+
42
+ def _ziya_gauge( url, swf_path, options )
43
+ # Setup options for opaque mode
44
+ setup_wmode( options )
45
+
46
+ # setup width and height
47
+ setup_movie_size( options )
48
+
49
+ color_param = tag( 'param', {:name => 'bgcolor', :value => options[:bgcolor]}, true )
50
+ color_param += tag( 'param', {:name => "wmode", :value => options[:wmode]}, true )
51
+
52
+ xml_swf_path = swf_path % [options[:swf_path], url]
53
+ xml_swf_path << "&amp;timestamp=#{Time.now.to_i}" if options[:use_cache] == true
54
+ xml_swf_path << "&amp;timeout=#{options[:timeout]}&amp;retry=#{options[:retry]}" if options[:timeout] == true
55
+ xml_swf_path << "&amp;stage_width=#{options[:width]}&amp;stage_height=#{options[:height]}" if options[:use_stage] == true
56
+ tags = <<-TAGS
57
+ <object codebase="#{codebase}" classid="#{options[:class_id]}" id="#{options[:id]}" height="#{options[:height]}" width="#{options[:width]}">
58
+ <param name="scale" value="noscale"/>
59
+ <param name="align" value="#{options[:align]}"/>
60
+ <param name="bgcolor" value="#{options[:bgcolor]}"/>
61
+ <param name="wmode" value="#{options[:wmode]}"/>
62
+ <param name="movie" value="#{xml_swf_path}"/>
63
+ <param name="menu" value="true"/>
64
+ <param name="allowFullScreen" value="true"/>
65
+ <param name="allowScriptAccess" value="#{options[:script_access]}"/>
66
+ <param name="quality" value="high"/>
67
+ <param name="play" value="true"/>
68
+ <param name="devicefont" value="false"/>
69
+ <embed scale="noscale"
70
+ allowfullscreen="true"
71
+ allowscriptaccess="#{options[:script_access]}"
72
+ bgcolor="#{options[:bgcolor]}"
73
+ devicefont="false"
74
+ src="#{xml_swf_path}"
75
+ menu="true"
76
+ name="#{options[:id]}"
77
+ play="true"
78
+ pluginspage="#{plugin_url}"
79
+ quality="high"
80
+ salign="#{options[:salign]}"
81
+ src="#{xml_swf_path}"
82
+ type="#{mime}"
83
+ wmode="#{options[:wmode]}"
84
+ salign="#{options[:salign]}"
85
+ height="#{options[:height]}"
86
+ width="#{options[:width]}">
87
+ </object>
88
+ TAGS
89
+ end
90
+ end
@@ -0,0 +1,74 @@
1
+ module Ziya::HtmlHelpers::Maps
2
+ include Ziya::HtmlHelpers::Base
3
+
4
+ def maps_swf_base() "/maps"; end
5
+ def maps_swf() "#{maps_swf_base}?data_file=%s"; end
6
+
7
+ # default options
8
+ def default_map_options
9
+ {
10
+ :width => "400",
11
+ :height => "300",
12
+ :map_type => :world,
13
+ :id => "ziya_map",
14
+ :code_base => "http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=7,0,0,0",
15
+ :align => "top",
16
+ :quality => "high",
17
+ :wmode => "opaque",
18
+ :class_id => "clsid:d27cdb6e-ae6d-11cf-96b8-444553540000",
19
+ :swf_path => "/maps/map_library",
20
+ :use_cache => false
21
+ }
22
+ end
23
+
24
+ # generates swf path
25
+ def gen_sw_path( path, swf_file, url )
26
+ path_directive = "#{path}/%s?data_file=%s"
27
+ path_directive % [swf_file, escape_url( url )]
28
+ end
29
+
30
+ # generates necessary tags for map support
31
+ def ziya_map( url, map_options={} )
32
+ options = default_map_options.merge( map_options )
33
+ _ziya_map( url, "#{options[:map_type]}.swf", options )
34
+ end
35
+
36
+ # generates actual html tags
37
+ def _ziya_map( url, swf_file, options )
38
+ # Setup options for opaque mode
39
+ setup_wmode( options )
40
+
41
+ # setup width and height
42
+ setup_movie_size( options )
43
+
44
+ color_param = tag( 'param', {:name => 'bgcolor', :value => options[:bgcolor]}, true )
45
+ color_param += tag( 'param', {:name => "wmode", :value => options[:wmode]}, true )
46
+
47
+ xml_swf_path = gen_sw_path( options[:swf_path], swf_file, url )
48
+ xml_swf_path << "&amp;timestamp=#{Time.now.to_i}" if options[:cache]
49
+
50
+ tags = <<-TAGS
51
+ <object codebase="#{options[:codebase]}" classid="#{options[:class_id]}" id="#{options[:id]}" height="#{options[:height]}" width="#{options[:width]}">
52
+ <param name="align" value="#{options[:align]}"/>
53
+ <param name="Flashvars" value="lcId=#{options[:id]}"/>
54
+ <param name="bgcolor" value="#{options[:bgcolor]}"/>
55
+ <param name="wmode" value="#{options[:wmode]}"/>
56
+ <param name="movie" value="#{xml_swf_path}"/>
57
+ <param name="quality" value="#{options[:quality]}"/>
58
+ <embed scale="noscale"
59
+ flashvars = "lcId=#{options[:id]}"
60
+ bgcolor = "#{options[:bgcolor]}"
61
+ src = "#{xml_swf_path}"
62
+ name = "#{options[:id]}"
63
+ pluginspage = "#{plugin_url}"
64
+ quality = "high"
65
+ type = "#{mime}"
66
+ wmode = "#{options[:wmode]}"
67
+ align = "#{options[:align]}"
68
+ height = "#{options[:height]}"
69
+ width = "#{options[:width]}"/>
70
+ </object>
71
+ TAGS
72
+
73
+ end
74
+ end
@@ -0,0 +1 @@
1
+ Ziya.require_all_libs_relative_to __FILE__, "html_helpers"