wukong 3.0.0.pre → 3.0.0.pre2

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 (476) hide show
  1. data/.gitignore +46 -33
  2. data/.gitmodules +3 -0
  3. data/.rspec +1 -1
  4. data/.travis.yml +8 -1
  5. data/.yardopts +0 -13
  6. data/Guardfile +4 -6
  7. data/{LICENSE.textile → LICENSE.md} +43 -55
  8. data/README-old.md +422 -0
  9. data/README.md +279 -418
  10. data/Rakefile +21 -5
  11. data/TODO.md +6 -6
  12. data/bin/wu-clean-encoding +31 -0
  13. data/bin/wu-lign +2 -2
  14. data/bin/wu-local +69 -0
  15. data/bin/wu-server +70 -0
  16. data/examples/Gemfile +38 -0
  17. data/examples/README.md +9 -0
  18. data/examples/dataflow/apache_log_line.rb +64 -25
  19. data/examples/dataflow/fibonacci_series.rb +101 -0
  20. data/examples/dataflow/parse_apache_logs.rb +37 -7
  21. data/examples/{dataflow.rb → dataflow/scraper_macro_flow.rb} +0 -0
  22. data/examples/dataflow/simple.rb +4 -4
  23. data/examples/geo.rb +4 -0
  24. data/examples/geo/geo_grids.numbers +0 -0
  25. data/examples/geo/geolocated.rb +331 -0
  26. data/examples/geo/quadtile.rb +69 -0
  27. data/examples/geo/spec/geolocated_spec.rb +247 -0
  28. data/examples/geo/tile_fetcher.rb +77 -0
  29. data/examples/graph/minimum_spanning_tree.rb +61 -61
  30. data/examples/jabberwocky.txt +36 -0
  31. data/examples/models/wikipedia.rb +20 -0
  32. data/examples/munging/Gemfile +8 -0
  33. data/examples/munging/airline_flights/airline.rb +57 -0
  34. data/examples/munging/airline_flights/airline_flights.rake +83 -0
  35. data/{lib/wukong/settings.rb → examples/munging/airline_flights/airplane.rb} +0 -0
  36. data/examples/munging/airline_flights/airport.rb +211 -0
  37. data/examples/munging/airline_flights/airport_id_unification.rb +129 -0
  38. data/examples/munging/airline_flights/airport_ok_chars.rb +4 -0
  39. data/examples/munging/airline_flights/flight.rb +156 -0
  40. data/examples/munging/airline_flights/models.rb +4 -0
  41. data/examples/munging/airline_flights/parse.rb +26 -0
  42. data/examples/munging/airline_flights/reconcile_airports.rb +142 -0
  43. data/examples/munging/airline_flights/route.rb +35 -0
  44. data/examples/munging/airline_flights/tasks.rake +83 -0
  45. data/examples/munging/airline_flights/timezone_fixup.rb +62 -0
  46. data/examples/munging/airline_flights/topcities.rb +167 -0
  47. data/examples/munging/airports/40_wbans.txt +40 -0
  48. data/examples/munging/airports/filter_weather_reports.rb +37 -0
  49. data/examples/munging/airports/join.pig +31 -0
  50. data/examples/munging/airports/to_tsv.rb +33 -0
  51. data/examples/munging/airports/usa_wbans.pig +19 -0
  52. data/examples/munging/airports/usa_wbans.txt +2157 -0
  53. data/examples/munging/airports/wbans.pig +19 -0
  54. data/examples/munging/airports/wbans.txt +2310 -0
  55. data/examples/munging/geo/geo_json.rb +54 -0
  56. data/examples/munging/geo/geo_models.rb +69 -0
  57. data/examples/munging/geo/geonames_models.rb +78 -0
  58. data/examples/munging/geo/iso_codes.rb +172 -0
  59. data/examples/munging/geo/reconcile_countries.rb +124 -0
  60. data/examples/munging/geo/tasks.rake +71 -0
  61. data/examples/munging/rake_helper.rb +62 -0
  62. data/examples/munging/weather/.gitignore +1 -0
  63. data/examples/munging/weather/Gemfile +4 -0
  64. data/examples/munging/weather/Rakefile +28 -0
  65. data/examples/munging/weather/extract_ish.rb +13 -0
  66. data/examples/munging/weather/models/weather.rb +119 -0
  67. data/examples/munging/weather/utils/noaa_downloader.rb +46 -0
  68. data/examples/munging/wikipedia/README.md +34 -0
  69. data/examples/munging/wikipedia/Rakefile +193 -0
  70. data/examples/munging/wikipedia/articles/extract_articles-parsed.rb +79 -0
  71. data/examples/munging/wikipedia/articles/extract_articles-templated.rb +136 -0
  72. data/examples/munging/wikipedia/articles/textualize_articles.rb +54 -0
  73. data/examples/munging/wikipedia/articles/verify_structure.rb +43 -0
  74. data/examples/munging/wikipedia/articles/wp2txt-LICENSE.txt +22 -0
  75. data/examples/munging/wikipedia/articles/wp2txt_article.rb +259 -0
  76. data/examples/munging/wikipedia/articles/wp2txt_utils.rb +452 -0
  77. data/examples/munging/wikipedia/dbpedia/dbpedia_common.rb +4 -0
  78. data/examples/munging/wikipedia/dbpedia/dbpedia_extract_geocoordinates.rb +78 -0
  79. data/examples/munging/wikipedia/dbpedia/extract_links.rb +193 -0
  80. data/examples/munging/wikipedia/dbpedia/sameas_extractor.rb +20 -0
  81. data/examples/munging/wikipedia/n1_subuniverse/n1_nodes.pig +18 -0
  82. data/examples/munging/wikipedia/page_metadata/extract_page_metadata.rb +21 -0
  83. data/examples/munging/wikipedia/page_metadata/extract_page_metadata.rb.old +27 -0
  84. data/examples/munging/wikipedia/pagelinks/augment_pagelinks.pig +29 -0
  85. data/examples/munging/wikipedia/pagelinks/extract_pagelinks.rb +14 -0
  86. data/examples/munging/wikipedia/pagelinks/extract_pagelinks.rb.old +25 -0
  87. data/examples/munging/wikipedia/pagelinks/undirect_pagelinks.pig +29 -0
  88. data/examples/munging/wikipedia/pageviews/augment_pageviews.pig +32 -0
  89. data/examples/munging/wikipedia/pageviews/extract_pageviews.rb +85 -0
  90. data/examples/munging/wikipedia/pig_style_guide.md +25 -0
  91. data/examples/munging/wikipedia/redirects/redirects_page_metadata.pig +19 -0
  92. data/examples/munging/wikipedia/subuniverse/sub_articles.pig +23 -0
  93. data/examples/munging/wikipedia/subuniverse/sub_page_metadata.pig +24 -0
  94. data/examples/munging/wikipedia/subuniverse/sub_pagelinks_from.pig +22 -0
  95. data/examples/munging/wikipedia/subuniverse/sub_pagelinks_into.pig +22 -0
  96. data/examples/munging/wikipedia/subuniverse/sub_pagelinks_within.pig +26 -0
  97. data/examples/munging/wikipedia/subuniverse/sub_pageviews.pig +29 -0
  98. data/examples/munging/wikipedia/subuniverse/sub_undirected_pagelinks_within.pig +24 -0
  99. data/examples/munging/wikipedia/utils/get_namespaces.rb +86 -0
  100. data/examples/munging/wikipedia/utils/munging_utils.rb +68 -0
  101. data/examples/munging/wikipedia/utils/namespaces.json +1 -0
  102. data/examples/rake_helper.rb +85 -0
  103. data/examples/server_logs/geo_ip_mapping/munge_geolite.rb +82 -0
  104. data/examples/server_logs/logline.rb +95 -0
  105. data/examples/server_logs/models.rb +66 -0
  106. data/examples/server_logs/page_counts.pig +48 -0
  107. data/examples/server_logs/server_logs-01-parse-script.rb +13 -0
  108. data/examples/server_logs/server_logs-02-histograms-full.rb +33 -0
  109. data/examples/server_logs/server_logs-02-histograms-mapper.rb +14 -0
  110. data/{old/examples/server_logs/breadcrumbs.rb → examples/server_logs/server_logs-03-breadcrumbs-full.rb} +26 -30
  111. data/examples/server_logs/server_logs-04-page_page_edges-full.rb +40 -0
  112. data/examples/string_reverser.rb +26 -0
  113. data/examples/text/pig_latin.rb +2 -2
  114. data/examples/text/regional_flavor/README.md +14 -0
  115. data/examples/text/regional_flavor/article_wordbags.pig +39 -0
  116. data/examples/text/regional_flavor/j01-article_wordbags.rb +4 -0
  117. data/examples/text/regional_flavor/simple_pig_script.pig +27 -0
  118. data/examples/word_count/accumulator.rb +26 -0
  119. data/examples/word_count/tokenizer.rb +13 -0
  120. data/examples/word_count/word_count.rb +6 -0
  121. data/examples/workflow/cherry_pie.dot +97 -0
  122. data/examples/workflow/cherry_pie.png +0 -0
  123. data/examples/workflow/cherry_pie.rb +61 -26
  124. data/lib/hanuman.rb +34 -7
  125. data/lib/hanuman/graph.rb +55 -31
  126. data/lib/hanuman/graphvizzer.rb +199 -178
  127. data/lib/hanuman/graphvizzer/gv_models.rb +161 -0
  128. data/lib/hanuman/graphvizzer/gv_presenter.rb +97 -0
  129. data/lib/hanuman/link.rb +35 -0
  130. data/lib/hanuman/registry.rb +46 -0
  131. data/lib/hanuman/stage.rb +76 -32
  132. data/lib/wukong.rb +23 -24
  133. data/lib/wukong/boot.rb +87 -0
  134. data/lib/wukong/configuration.rb +8 -0
  135. data/lib/wukong/dataflow.rb +45 -78
  136. data/lib/wukong/driver.rb +99 -0
  137. data/lib/wukong/emitter.rb +22 -0
  138. data/lib/wukong/model/faker.rb +24 -24
  139. data/lib/wukong/model/flatpack_parser/flat.rb +60 -0
  140. data/lib/wukong/model/flatpack_parser/flatpack.rb +4 -0
  141. data/lib/wukong/model/flatpack_parser/lang.rb +46 -0
  142. data/lib/wukong/model/flatpack_parser/parser.rb +55 -0
  143. data/lib/wukong/model/flatpack_parser/tokens.rb +130 -0
  144. data/lib/wukong/processor.rb +60 -114
  145. data/lib/wukong/spec_helpers.rb +81 -0
  146. data/lib/wukong/spec_helpers/integration_driver.rb +144 -0
  147. data/lib/wukong/spec_helpers/integration_driver_matchers.rb +219 -0
  148. data/lib/wukong/spec_helpers/processor_helpers.rb +95 -0
  149. data/lib/wukong/spec_helpers/processor_methods.rb +108 -0
  150. data/lib/wukong/spec_helpers/shared_examples.rb +15 -0
  151. data/lib/wukong/spec_helpers/spec_driver.rb +28 -0
  152. data/lib/wukong/spec_helpers/spec_driver_matchers.rb +195 -0
  153. data/lib/wukong/version.rb +2 -1
  154. data/lib/wukong/widget/filters.rb +311 -0
  155. data/lib/wukong/widget/processors.rb +156 -0
  156. data/lib/wukong/widget/reducers.rb +7 -0
  157. data/lib/wukong/widget/reducers/accumulator.rb +73 -0
  158. data/lib/wukong/widget/reducers/bin.rb +318 -0
  159. data/lib/wukong/widget/reducers/count.rb +61 -0
  160. data/lib/wukong/widget/reducers/group.rb +85 -0
  161. data/lib/wukong/widget/reducers/group_concat.rb +70 -0
  162. data/lib/wukong/widget/reducers/moments.rb +72 -0
  163. data/lib/wukong/widget/reducers/sort.rb +130 -0
  164. data/lib/wukong/widget/serializers.rb +287 -0
  165. data/lib/wukong/widget/sink.rb +10 -52
  166. data/lib/wukong/widget/source.rb +7 -113
  167. data/lib/wukong/widget/utils.rb +46 -0
  168. data/lib/wukong/widgets.rb +6 -0
  169. data/spec/examples/dataflow/fibonacci_series_spec.rb +18 -0
  170. data/spec/examples/dataflow/parsing_spec.rb +12 -11
  171. data/spec/examples/dataflow/simple_spec.rb +32 -6
  172. data/spec/examples/dataflow/telegram_spec.rb +36 -36
  173. data/spec/examples/graph/minimum_spanning_tree_spec.rb +30 -31
  174. data/spec/examples/munging/airline_flights/identifiers_spec.rb +16 -0
  175. data/spec/examples/munging/airline_flights_spec.rb +202 -0
  176. data/spec/examples/text/pig_latin_spec.rb +13 -16
  177. data/spec/examples/workflow/cherry_pie_spec.rb +34 -4
  178. data/spec/hanuman/graph_spec.rb +27 -2
  179. data/spec/hanuman/hanuman_spec.rb +10 -0
  180. data/spec/hanuman/registry_spec.rb +123 -0
  181. data/spec/hanuman/stage_spec.rb +61 -7
  182. data/spec/spec_helper.rb +29 -19
  183. data/spec/support/hanuman_test_helpers.rb +14 -12
  184. data/spec/support/shared_context_for_reducers.rb +37 -0
  185. data/spec/support/shared_examples_for_builders.rb +101 -0
  186. data/spec/support/shared_examples_for_shortcuts.rb +57 -0
  187. data/spec/support/wukong_test_helpers.rb +37 -11
  188. data/spec/wukong/dataflow_spec.rb +77 -55
  189. data/spec/wukong/local_runner_spec.rb +24 -24
  190. data/spec/wukong/model/faker_spec.rb +132 -131
  191. data/spec/wukong/runner_spec.rb +8 -8
  192. data/spec/wukong/widget/filters_spec.rb +61 -0
  193. data/spec/wukong/widget/processors_spec.rb +126 -0
  194. data/spec/wukong/widget/reducers/bin_spec.rb +92 -0
  195. data/spec/wukong/widget/reducers/count_spec.rb +11 -0
  196. data/spec/wukong/widget/reducers/group_spec.rb +20 -0
  197. data/spec/wukong/widget/reducers/moments_spec.rb +36 -0
  198. data/spec/wukong/widget/reducers/sort_spec.rb +26 -0
  199. data/spec/wukong/widget/serializers_spec.rb +92 -0
  200. data/spec/wukong/widget/sink_spec.rb +15 -15
  201. data/spec/wukong/widget/source_spec.rb +65 -41
  202. data/spec/wukong/wukong_spec.rb +10 -0
  203. data/wukong.gemspec +17 -10
  204. metadata +359 -335
  205. data/.document +0 -5
  206. data/VERSION +0 -1
  207. data/bin/hdp-bin +0 -44
  208. data/bin/hdp-bzip +0 -23
  209. data/bin/hdp-cat +0 -3
  210. data/bin/hdp-catd +0 -3
  211. data/bin/hdp-cp +0 -3
  212. data/bin/hdp-du +0 -86
  213. data/bin/hdp-get +0 -3
  214. data/bin/hdp-kill +0 -3
  215. data/bin/hdp-kill-task +0 -3
  216. data/bin/hdp-ls +0 -11
  217. data/bin/hdp-mkdir +0 -2
  218. data/bin/hdp-mkdirp +0 -12
  219. data/bin/hdp-mv +0 -3
  220. data/bin/hdp-parts_to_keys.rb +0 -77
  221. data/bin/hdp-ps +0 -3
  222. data/bin/hdp-put +0 -3
  223. data/bin/hdp-rm +0 -32
  224. data/bin/hdp-sort +0 -40
  225. data/bin/hdp-stream +0 -40
  226. data/bin/hdp-stream-flat +0 -22
  227. data/bin/hdp-stream2 +0 -39
  228. data/bin/hdp-sync +0 -17
  229. data/bin/hdp-wc +0 -67
  230. data/bin/wu-flow +0 -10
  231. data/bin/wu-map +0 -17
  232. data/bin/wu-red +0 -17
  233. data/bin/wukong +0 -17
  234. data/data/CREDITS.md +0 -355
  235. data/data/graph/airfares.tsv +0 -2174
  236. data/data/text/gift_of_the_magi.txt +0 -225
  237. data/data/text/jabberwocky.txt +0 -36
  238. data/data/text/rectification_of_names.txt +0 -33
  239. data/data/twitter/a_atsigns_b.tsv +0 -64
  240. data/data/twitter/a_follows_b.tsv +0 -53
  241. data/data/twitter/tweet.tsv +0 -167
  242. data/data/twitter/twitter_user.tsv +0 -55
  243. data/data/wikipedia/dbpedia-sentences.tsv +0 -1000
  244. data/docpages/INSTALL.textile +0 -92
  245. data/docpages/LICENSE.textile +0 -107
  246. data/docpages/README-elastic_map_reduce.textile +0 -377
  247. data/docpages/README-performance.textile +0 -90
  248. data/docpages/README-wulign.textile +0 -65
  249. data/docpages/UsingWukong-part1-get_ready.textile +0 -17
  250. data/docpages/UsingWukong-part2-ThinkingBigData.textile +0 -75
  251. data/docpages/UsingWukong-part3-parsing.textile +0 -138
  252. data/docpages/_config.yml +0 -39
  253. data/docpages/avro/avro_notes.textile +0 -56
  254. data/docpages/avro/performance.textile +0 -36
  255. data/docpages/avro/tethering.textile +0 -19
  256. data/docpages/bigdata-tips.textile +0 -143
  257. data/docpages/code/api_response_example.txt +0 -20
  258. data/docpages/code/parser_skeleton.rb +0 -38
  259. data/docpages/diagrams/MapReduceDiagram.graffle +0 -0
  260. data/docpages/favicon.ico +0 -0
  261. data/docpages/gem.css +0 -16
  262. data/docpages/hadoop-tips.textile +0 -83
  263. data/docpages/index.textile +0 -92
  264. data/docpages/intro.textile +0 -8
  265. data/docpages/moreinfo.textile +0 -174
  266. data/docpages/news.html +0 -24
  267. data/docpages/pig/PigLatinExpressionsList.txt +0 -122
  268. data/docpages/pig/PigLatinReferenceManual.txt +0 -1640
  269. data/docpages/pig/commandline_params.txt +0 -26
  270. data/docpages/pig/cookbook.html +0 -481
  271. data/docpages/pig/images/hadoop-logo.jpg +0 -0
  272. data/docpages/pig/images/instruction_arrow.png +0 -0
  273. data/docpages/pig/images/pig-logo.gif +0 -0
  274. data/docpages/pig/piglatin_ref1.html +0 -1103
  275. data/docpages/pig/piglatin_ref2.html +0 -14340
  276. data/docpages/pig/setup.html +0 -505
  277. data/docpages/pig/skin/basic.css +0 -166
  278. data/docpages/pig/skin/breadcrumbs.js +0 -237
  279. data/docpages/pig/skin/fontsize.js +0 -166
  280. data/docpages/pig/skin/getBlank.js +0 -40
  281. data/docpages/pig/skin/getMenu.js +0 -45
  282. data/docpages/pig/skin/images/chapter.gif +0 -0
  283. data/docpages/pig/skin/images/chapter_open.gif +0 -0
  284. data/docpages/pig/skin/images/current.gif +0 -0
  285. data/docpages/pig/skin/images/external-link.gif +0 -0
  286. data/docpages/pig/skin/images/header_white_line.gif +0 -0
  287. data/docpages/pig/skin/images/page.gif +0 -0
  288. data/docpages/pig/skin/images/pdfdoc.gif +0 -0
  289. data/docpages/pig/skin/images/rc-b-l-15-1body-2menu-3menu.png +0 -0
  290. data/docpages/pig/skin/images/rc-b-r-15-1body-2menu-3menu.png +0 -0
  291. data/docpages/pig/skin/images/rc-b-r-5-1header-2tab-selected-3tab-selected.png +0 -0
  292. data/docpages/pig/skin/images/rc-t-l-5-1header-2searchbox-3searchbox.png +0 -0
  293. data/docpages/pig/skin/images/rc-t-l-5-1header-2tab-selected-3tab-selected.png +0 -0
  294. data/docpages/pig/skin/images/rc-t-l-5-1header-2tab-unselected-3tab-unselected.png +0 -0
  295. data/docpages/pig/skin/images/rc-t-r-15-1body-2menu-3menu.png +0 -0
  296. data/docpages/pig/skin/images/rc-t-r-5-1header-2searchbox-3searchbox.png +0 -0
  297. data/docpages/pig/skin/images/rc-t-r-5-1header-2tab-selected-3tab-selected.png +0 -0
  298. data/docpages/pig/skin/images/rc-t-r-5-1header-2tab-unselected-3tab-unselected.png +0 -0
  299. data/docpages/pig/skin/print.css +0 -54
  300. data/docpages/pig/skin/profile.css +0 -181
  301. data/docpages/pig/skin/screen.css +0 -587
  302. data/docpages/pig/tutorial.html +0 -1059
  303. data/docpages/pig/udf.html +0 -1509
  304. data/docpages/tutorial.textile +0 -283
  305. data/docpages/usage.textile +0 -195
  306. data/docpages/wutils.textile +0 -263
  307. data/examples/dataflow/complex.rb +0 -11
  308. data/examples/dataflow/donuts.rb +0 -13
  309. data/examples/tiny_count/jabberwocky_output.tsv +0 -92
  310. data/examples/word_count.rb +0 -48
  311. data/examples/workflow/fiddle.rb +0 -24
  312. data/lib/away/escapement.rb +0 -129
  313. data/lib/away/exe.rb +0 -11
  314. data/lib/away/experimental.rb +0 -5
  315. data/lib/away/from_file.rb +0 -52
  316. data/lib/away/job.rb +0 -56
  317. data/lib/away/job/rake_compat.rb +0 -17
  318. data/lib/away/registry.rb +0 -79
  319. data/lib/away/runner.rb +0 -276
  320. data/lib/away/runner/execute.rb +0 -121
  321. data/lib/away/script.rb +0 -161
  322. data/lib/away/script/hadoop_command.rb +0 -240
  323. data/lib/away/source/file_list_source.rb +0 -15
  324. data/lib/away/source/looper.rb +0 -18
  325. data/lib/away/task.rb +0 -219
  326. data/lib/hanuman/action.rb +0 -21
  327. data/lib/hanuman/chain.rb +0 -4
  328. data/lib/hanuman/graphviz.rb +0 -74
  329. data/lib/hanuman/resource.rb +0 -6
  330. data/lib/hanuman/slot.rb +0 -87
  331. data/lib/hanuman/slottable.rb +0 -220
  332. data/lib/wukong/bad_record.rb +0 -15
  333. data/lib/wukong/event.rb +0 -44
  334. data/lib/wukong/local_runner.rb +0 -55
  335. data/lib/wukong/mapred.rb +0 -3
  336. data/lib/wukong/universe.rb +0 -48
  337. data/lib/wukong/widget/filter.rb +0 -81
  338. data/lib/wukong/widget/gibberish.rb +0 -123
  339. data/lib/wukong/widget/monitor.rb +0 -26
  340. data/lib/wukong/widget/reducer.rb +0 -66
  341. data/lib/wukong/widget/stringifier.rb +0 -50
  342. data/lib/wukong/workflow.rb +0 -22
  343. data/lib/wukong/workflow/command.rb +0 -42
  344. data/old/config/emr-example.yaml +0 -48
  345. data/old/examples/README.txt +0 -17
  346. data/old/examples/contrib/jeans/README.markdown +0 -165
  347. data/old/examples/contrib/jeans/data/normalized_sizes +0 -3
  348. data/old/examples/contrib/jeans/data/orders.tsv +0 -1302
  349. data/old/examples/contrib/jeans/data/sizes +0 -3
  350. data/old/examples/contrib/jeans/normalize.rb +0 -20
  351. data/old/examples/contrib/jeans/sizes.rb +0 -55
  352. data/old/examples/corpus/bnc_word_freq.rb +0 -44
  353. data/old/examples/corpus/bucket_counter.rb +0 -47
  354. data/old/examples/corpus/dbpedia_abstract_to_sentences.rb +0 -86
  355. data/old/examples/corpus/sentence_bigrams.rb +0 -53
  356. data/old/examples/corpus/sentence_coocurrence.rb +0 -66
  357. data/old/examples/corpus/stopwords.rb +0 -138
  358. data/old/examples/corpus/words_to_bigrams.rb +0 -53
  359. data/old/examples/emr/README.textile +0 -110
  360. data/old/examples/emr/dot_wukong_dir/credentials.json +0 -7
  361. data/old/examples/emr/dot_wukong_dir/emr.yaml +0 -69
  362. data/old/examples/emr/dot_wukong_dir/emr_bootstrap.sh +0 -33
  363. data/old/examples/emr/elastic_mapreduce_example.rb +0 -28
  364. data/old/examples/network_graph/adjacency_list.rb +0 -74
  365. data/old/examples/network_graph/breadth_first_search.rb +0 -72
  366. data/old/examples/network_graph/gen_2paths.rb +0 -68
  367. data/old/examples/network_graph/gen_multi_edge.rb +0 -112
  368. data/old/examples/network_graph/gen_symmetric_links.rb +0 -64
  369. data/old/examples/pagerank/README.textile +0 -6
  370. data/old/examples/pagerank/gen_initial_pagerank_graph.pig +0 -57
  371. data/old/examples/pagerank/pagerank.rb +0 -72
  372. data/old/examples/pagerank/pagerank_initialize.rb +0 -42
  373. data/old/examples/pagerank/run_pagerank.sh +0 -21
  374. data/old/examples/sample_records.rb +0 -33
  375. data/old/examples/server_logs/apache_log_parser.rb +0 -15
  376. data/old/examples/server_logs/nook.rb +0 -48
  377. data/old/examples/server_logs/nook/faraday_dummy_adapter.rb +0 -94
  378. data/old/examples/server_logs/user_agent.rb +0 -40
  379. data/old/examples/simple_word_count.rb +0 -82
  380. data/old/examples/size.rb +0 -61
  381. data/old/examples/stats/avg_value_frequency.rb +0 -86
  382. data/old/examples/stats/binning_percentile_estimator.rb +0 -140
  383. data/old/examples/stats/data/avg_value_frequency.tsv +0 -3
  384. data/old/examples/stats/rank_and_bin.rb +0 -173
  385. data/old/examples/stupidly_simple_filter.rb +0 -40
  386. data/old/examples/word_count.rb +0 -75
  387. data/old/graph/graphviz_builder.rb +0 -580
  388. data/old/graph_easy/Attributes.pm +0 -4181
  389. data/old/graph_easy/Graphviz.pm +0 -2232
  390. data/old/wukong.rb +0 -18
  391. data/old/wukong/and_pig.rb +0 -38
  392. data/old/wukong/bad_record.rb +0 -18
  393. data/old/wukong/datatypes.rb +0 -24
  394. data/old/wukong/datatypes/enum.rb +0 -127
  395. data/old/wukong/datatypes/fake_types.rb +0 -17
  396. data/old/wukong/decorator.rb +0 -28
  397. data/old/wukong/encoding/asciize.rb +0 -108
  398. data/old/wukong/extensions.rb +0 -16
  399. data/old/wukong/extensions/array.rb +0 -18
  400. data/old/wukong/extensions/blank.rb +0 -93
  401. data/old/wukong/extensions/class.rb +0 -189
  402. data/old/wukong/extensions/date_time.rb +0 -53
  403. data/old/wukong/extensions/emittable.rb +0 -69
  404. data/old/wukong/extensions/enumerable.rb +0 -79
  405. data/old/wukong/extensions/hash.rb +0 -167
  406. data/old/wukong/extensions/hash_keys.rb +0 -16
  407. data/old/wukong/extensions/hash_like.rb +0 -150
  408. data/old/wukong/extensions/hashlike_class.rb +0 -47
  409. data/old/wukong/extensions/module.rb +0 -2
  410. data/old/wukong/extensions/pathname.rb +0 -27
  411. data/old/wukong/extensions/string.rb +0 -65
  412. data/old/wukong/extensions/struct.rb +0 -17
  413. data/old/wukong/extensions/symbol.rb +0 -11
  414. data/old/wukong/filename_pattern.rb +0 -74
  415. data/old/wukong/helper.rb +0 -7
  416. data/old/wukong/helper/stopwords.rb +0 -195
  417. data/old/wukong/helper/tokenize.rb +0 -35
  418. data/old/wukong/logger.rb +0 -38
  419. data/old/wukong/periodic_monitor.rb +0 -72
  420. data/old/wukong/schema.rb +0 -269
  421. data/old/wukong/script.rb +0 -286
  422. data/old/wukong/script/avro_command.rb +0 -5
  423. data/old/wukong/script/cassandra_loader_script.rb +0 -40
  424. data/old/wukong/script/emr_command.rb +0 -168
  425. data/old/wukong/script/hadoop_command.rb +0 -237
  426. data/old/wukong/script/local_command.rb +0 -41
  427. data/old/wukong/store.rb +0 -10
  428. data/old/wukong/store/base.rb +0 -27
  429. data/old/wukong/store/cassandra.rb +0 -10
  430. data/old/wukong/store/cassandra/streaming.rb +0 -75
  431. data/old/wukong/store/cassandra/struct_loader.rb +0 -21
  432. data/old/wukong/store/cassandra_model.rb +0 -91
  433. data/old/wukong/store/chh_chunked_flat_file_store.rb +0 -37
  434. data/old/wukong/store/chunked_flat_file_store.rb +0 -48
  435. data/old/wukong/store/conditional_store.rb +0 -57
  436. data/old/wukong/store/factory.rb +0 -8
  437. data/old/wukong/store/flat_file_store.rb +0 -89
  438. data/old/wukong/store/key_store.rb +0 -51
  439. data/old/wukong/store/null_store.rb +0 -15
  440. data/old/wukong/store/read_thru_store.rb +0 -22
  441. data/old/wukong/store/tokyo_tdb_key_store.rb +0 -33
  442. data/old/wukong/store/tyrant_rdb_key_store.rb +0 -57
  443. data/old/wukong/store/tyrant_tdb_key_store.rb +0 -20
  444. data/old/wukong/streamer.rb +0 -30
  445. data/old/wukong/streamer/accumulating_reducer.rb +0 -83
  446. data/old/wukong/streamer/base.rb +0 -126
  447. data/old/wukong/streamer/counting_reducer.rb +0 -25
  448. data/old/wukong/streamer/filter.rb +0 -20
  449. data/old/wukong/streamer/instance_streamer.rb +0 -15
  450. data/old/wukong/streamer/json_streamer.rb +0 -21
  451. data/old/wukong/streamer/line_streamer.rb +0 -12
  452. data/old/wukong/streamer/list_reducer.rb +0 -31
  453. data/old/wukong/streamer/rank_and_bin_reducer.rb +0 -145
  454. data/old/wukong/streamer/record_streamer.rb +0 -14
  455. data/old/wukong/streamer/reducer.rb +0 -11
  456. data/old/wukong/streamer/set_reducer.rb +0 -14
  457. data/old/wukong/streamer/struct_streamer.rb +0 -48
  458. data/old/wukong/streamer/summing_reducer.rb +0 -29
  459. data/old/wukong/streamer/uniq_by_last_reducer.rb +0 -51
  460. data/old/wukong/typed_struct.rb +0 -12
  461. data/spec/away/encoding_spec.rb +0 -32
  462. data/spec/away/exe_spec.rb +0 -20
  463. data/spec/away/flow_spec.rb +0 -82
  464. data/spec/away/graph_spec.rb +0 -6
  465. data/spec/away/job_spec.rb +0 -15
  466. data/spec/away/rake_compat_spec.rb +0 -9
  467. data/spec/away/script_spec.rb +0 -81
  468. data/spec/hanuman/graphviz_spec.rb +0 -29
  469. data/spec/hanuman/slot_spec.rb +0 -2
  470. data/spec/support/examples_helper.rb +0 -10
  471. data/spec/support/streamer_test_helpers.rb +0 -6
  472. data/spec/support/wukong_widget_helpers.rb +0 -66
  473. data/spec/wukong/processor_spec.rb +0 -109
  474. data/spec/wukong/widget/filter_spec.rb +0 -99
  475. data/spec/wukong/widget/stringifier_spec.rb +0 -51
  476. data/spec/wukong/workflow/command_spec.rb +0 -5
@@ -1,12 +1,66 @@
1
1
  require 'spec_helper'
2
- require 'hanuman'
3
2
 
4
- describe :stages, :slot_specs => true, :helpers => true do
3
+ describe Hanuman::Stage, :hanuman => true do
5
4
 
6
- describe Hanuman::Stage do
7
- it{ should respond_to(:setup) }
8
- it{ should respond_to(:stop) }
9
- it{ should respond_to(:notify) }
10
- it{ should respond_to(:report) }
5
+ before(:each) do
6
+ @orig_reg = Hanuman.registry.show
7
+ Hanuman.registry.clear!
8
+ end
9
+
10
+ after(:each) do
11
+ Hanuman.registry.clear!
12
+ Hanuman.registry.merge!(@orig_reg)
13
+ end
14
+
15
+ context 'a class inheriting from Hanuman::Stage' do
16
+
17
+ klass = Object.const_set('Gambit', Class.new(Hanuman::Stage))
18
+ subject{ klass }
19
+
20
+ it 'creates its own label' do
21
+ subject.label.should == :gambit
22
+ end
23
+
24
+ it 'creates its own builder' do
25
+ subject.builder.should be_instance_of(Hanuman::StageBuilder)
26
+ subject.builder.for_class.should == subject
27
+ end
28
+
29
+ it 'can register its definition' do
30
+ expect{ subject.register }.to change{ Hanuman.registry.retrieve(:gambit) }.from(nil).to(subject.builder)
31
+ end
32
+
33
+ it 'can register itself under a different label' do
34
+ expect{ subject.register(:wolverine) }.to change{ Hanuman.registry.retrieve(:wolverine) }.from(nil)
35
+ Hanuman.registry.retrieve(:wolverine).label.should == :wolverine
36
+ Hanuman.registry.should_not be_registered(:gambit)
37
+ end
38
+ end
39
+ end
40
+
41
+ describe Hanuman::StageBuilder, :hanuman => true do
42
+
43
+ it_behaves_like 'a Stage::Builder'
44
+
45
+ its(:namespace){ should be(Hanuman::Stage) }
46
+
47
+ context '#define' do
48
+ let(:test_klass){ Object.const_set('Jubilee', Class.new(subject.namespace)) }
49
+ let(:block_arg) { ->(){ def shoot_fireworks!() ; end } }
50
+ after(:each) { Object.send(:remove_const, 'Jubilee') }
51
+
52
+ context 'with a block' do
53
+ it 'defines the class which evaluates the block' do
54
+ subject.for_class = test_klass
55
+ test_klass.should_receive(:class_eval).with(&block_arg)
56
+ subject.define(&block_arg)
57
+ end
58
+ end
59
+ end
60
+
61
+ context '#serialize' do
62
+ it 'does not serialize its :links attribute' do
63
+ subject.serialize.should_not include(:links)
64
+ end
11
65
  end
12
66
  end
@@ -1,29 +1,39 @@
1
- require 'bundler' ; Bundler.require(:default, :development)
1
+ require 'bundler' ; Bundler.setup(:default, :development, :test)
2
2
 
3
- SimpleCov.start do
4
- add_filter '/gorillib/'
5
- add_filter '/away/'
6
- add_group 'Hanuman', '/hanuman/'
3
+ if ENV['WUKONG_COV']
4
+ require 'simplecov'
5
+
6
+ SimpleCov.start do
7
+ add_filter '/gorillib/'
8
+ add_filter '/away/'
9
+ add_group 'Hanuman', '/hanuman/'
10
+ end
7
11
  end
8
12
 
9
13
  require 'wukong'
10
- require 'gorillib/model'
11
- require 'gorillib/pathname'
12
- require 'gorillib/type/extended'
13
- require 'wukong/model/faker'
14
+ require 'wukong/spec_helpers'
15
+ require_relative './support/shared_examples_for_builders'
16
+ require_relative './support/shared_examples_for_shortcuts'
17
+ require_relative './support/shared_context_for_reducers'
18
+
19
+ # require 'gorillib/pathname'
20
+ # require 'gorillib/type/extended'
21
+ # require 'wukong/model/faker'
14
22
 
15
- Pathname.register_path(:wukong_root, File.expand_path('..', File.dirname(__FILE__)))
16
- Pathname.register_path(:examples, :wukong_root, 'examples')
17
- Pathname.register_path(:tmp, :wukong_root, 'tmp')
18
- Pathname.register_path(:data, :wukong_root, 'data')
19
- Pathname.path_to(:tmp).mkpath
23
+ # Pathname.register_path(:wukong_root, File.expand_path('..', File.dirname(__FILE__)))
24
+ # Pathname.register_path(:examples, :wukong_root, 'examples')
25
+ # Pathname.register_path(:tmp, :wukong_root, 'tmp')
26
+ # Pathname.register_path(:data, :wukong_root, 'data')
27
+ # Pathname.path_to(:tmp).mkpath
20
28
 
21
- Dir[ Pathname.path_to('spec', 'support', '*.rb') ].each{ |f| require f }
29
+ # Dir[ Pathname.path_to('spec', 'support', '*.rb') ].each{|f| require f }
22
30
 
23
- result = `dot -V 2>&1` rescue nil
24
- GRAPHVIZ = ($?.exitstatus == 0) && (result =~ /dot - graphviz version/)
25
- puts 'Some specs require graphviz to run -- brew/apt install graphviz, it is pretty awesome' unless GRAPHVIZ
31
+ # result = `dot -V 2>&1` rescue nil
32
+ # GRAPHVIZ = ($?.exitstatus == 0) && (result =~ /dot - graphviz version/)
33
+ # puts 'Some specs require graphviz to run -- brew/apt install graphviz, it is pretty awesome' unless GRAPHVIZ
26
34
 
27
35
  RSpec.configure do |config|
28
- include WukongTestHelpers
36
+ config.mock_with :rspec
37
+ include Wukong::SpecHelpers
38
+ # config.treat_symbols_as_metadata_keys_with_true_values = true
29
39
  end
@@ -5,7 +5,7 @@ shared_context 'hanuman', :helpers => true do
5
5
 
6
6
  let :example_graph do
7
7
  Hanuman::Graph.new(:name => :scraper) do
8
- action(:listener) << resource(:scrape_requests) << resource(:more_requests)
8
+ action(:listener) << product(:scrape_requests) << product(:more_requests)
9
9
  action(:parser).input(:listener)
10
10
  action(:models).input(:parser)
11
11
  end
@@ -16,7 +16,7 @@ end
16
16
  shared_examples_for 'it can be linked into' do
17
17
  let(:mock_slot){ mock('mock slot') }
18
18
  before do
19
- mock_dataflow.stub(:connect).with(mock_slot, subject).and_return([mock_slot, subject])
19
+ mock_dataflow.stub(:connect).with(mock_slot, :default, subject, :default).and_return([mock_slot, subject])
20
20
  subject.write_attribute(:owner, mock_dataflow)
21
21
  end
22
22
 
@@ -32,7 +32,7 @@ shared_examples_for 'it can be linked into' do
32
32
 
33
33
  context '#from' do
34
34
  it 'asks its owner to register an edge from self into given stage' do
35
- mock_dataflow.should_receive(:connect).with(mock_slot, subject)
35
+ mock_dataflow.should_receive(:connect).with(mock_slot, :default, subject, :default)
36
36
  subject.from mock_slot
37
37
  end
38
38
  it 'returns the stage itself, for chaining' do
@@ -40,13 +40,15 @@ shared_examples_for 'it can be linked into' do
40
40
  end
41
41
  end
42
42
 
43
- context 'set_output' do
44
- it 'returns the actual receivoutg slot' do
45
- subject.set_output(mock_stage).should equal(subject)
43
+ context 'set_sink' do
44
+ it 'returns the actual receiving slot' do
45
+ # subject.set_sink(:default, mock_stage).should equal(subject)
46
+ subject.set_sink(mock_stage).should equal(subject)
46
47
  end
47
48
  it 'sets the output attribute' do
48
49
  subject.should_receive(:write_attribute).with(:output, mock_stage)
49
- subject.set_output(mock_stage)
50
+ # subject.set_sink(:default, mock_stage)
51
+ subject.set_sink(mock_stage)
50
52
  end
51
53
  end
52
54
  end
@@ -54,13 +56,13 @@ end
54
56
  shared_examples_for 'it can be linked from' do
55
57
  let(:mock_slot){ mock('mock slot') }
56
58
  before do
57
- mock_dataflow.stub(:connect).with(subject, mock_slot).and_return([subject, mock_slot])
59
+ mock_dataflow.stub(:connect).with(subject, :default, mock_slot, :default).and_return([subject, mock_slot])
58
60
  subject.write_attribute(:owner, mock_dataflow)
59
61
  end
60
62
 
61
63
  context '#>' do
62
64
  it 'asks its owner to register an edge into self from given stage' do
63
- mock_dataflow.should_receive(:connect).with(subject, mock_slot)
65
+ mock_dataflow.should_receive(:connect).with(subject, :default, mock_slot, :default)
64
66
  subject.into mock_slot
65
67
  end
66
68
  it 'returns the output stage' do
@@ -70,7 +72,7 @@ shared_examples_for 'it can be linked from' do
70
72
 
71
73
  context '#into' do
72
74
  it 'asks its owner to register an edge into self from given stage' do
73
- mock_dataflow.should_receive(:connect).with(subject, mock_slot)
75
+ mock_dataflow.should_receive(:connect).with(subject, :default, mock_slot, :default)
74
76
  subject.into mock_slot
75
77
  end
76
78
  it 'returns the stage itself, for chaining' do
@@ -80,11 +82,11 @@ shared_examples_for 'it can be linked from' do
80
82
 
81
83
  context 'set_input' do
82
84
  it 'returns the actual receiving slot' do
83
- subject.set_input(mock_stage).should equal(subject)
85
+ subject.set_source(mock_stage).should equal(subject)
84
86
  end
85
87
  it 'sets the input attribute' do
86
88
  subject.should_receive(:write_attribute).with(:input, mock_stage)
87
- subject.set_input(mock_stage)
89
+ subject.set_source(mock_stage)
88
90
  end
89
91
  end
90
92
  end
@@ -0,0 +1,37 @@
1
+ shared_context "reducers" do
2
+
3
+ let(:strings) { %w[apple banana apple cookie] }
4
+ let(:nums) { %w[7 7 0 10 3 5 7 6 3 7 3 5 3 1 9 8 3 9 4 2 6 10 9 0 7 7 9 5 2 0 4 9 9 5 9 6 10 2 0 8 4 0 0 1 7 9 5 6 3 0] }
5
+ let(:json) do
6
+ [
7
+ '{"data":{}}',
8
+ '{"data":{"n":1,"inner":"snap"},"outer":"apple"}',
9
+ '{"data":{"n":100,"inner":"crackle"},"outer":"banana"}',
10
+ '{"data":{"n":5,"inner":"crackle"},"outer":"apple"}',
11
+ '{"data":{"n":10,"inner":"pop"},"outer":"cookie"}',
12
+ '{"data":{}}'
13
+ ]
14
+ end
15
+
16
+ let(:json_sorted_n) do
17
+ json.map { |j| MultiJson.load(j) }.sort_by { |o| o['data']['n'].to_i }.map { |o| MultiJson.dump(o) }
18
+ end
19
+
20
+ let(:json_sorted_outer) do
21
+ json.map { |j| MultiJson.load(j) }.sort_by { |o| o['outer'] || '' }.map { |o| MultiJson.dump(o) }
22
+ end
23
+
24
+ let(:tsv) do
25
+ [
26
+ "\tb\t",
27
+ "apple\tsnap\t1",
28
+ "banana\tcrackle\t100",
29
+ "apple\tcrackle\t5",
30
+ "cookie\tpop\t10",
31
+ "b"
32
+ ]
33
+ end
34
+
35
+ let(:tsv_sorted) { tsv.sort_by { |t| t.split("\t")[2].to_i } }
36
+
37
+ end
@@ -0,0 +1,101 @@
1
+ shared_examples_for 'a Stage::Builder' do
2
+ before(:each){ Hanuman::GlobalRegistry.clear! }
3
+
4
+ context '.receive' do
5
+ it 'extra arguments are stored in the :args attribute' do
6
+ subject = described_class.receive(uncanny: 'x-men')
7
+ subject.args.should == { uncanny: 'x-men' }
8
+ end
9
+ end
10
+
11
+ context '#define' do
12
+ let(:test_klass){ Object.const_get('WhiteQueen') }
13
+
14
+ around(:each) do |example|
15
+ Object.const_set('WhiteQueen', Class.new(subject.namespace))
16
+ example.run
17
+ Object.send(:remove_const, 'WhiteQueen')
18
+ end
19
+
20
+ it 'returns a Hanuman::Stage class definition' do
21
+ subject.label = :white_queen
22
+ subject.define.superclass.should be(subject.namespace)
23
+ end
24
+
25
+ it 'registers the defined class' do
26
+ subject.for_class = test_klass
27
+ test_klass.should_receive(:register)
28
+ subject.define
29
+ end
30
+
31
+ context 'without :for_class attribute set' do
32
+ it 'does not create a class definition' do
33
+ subject.for_class = test_klass
34
+ subject.should_not_receive(:define_class)
35
+ subject.define
36
+ end
37
+ end
38
+
39
+ context 'with :for_class attribute set' do
40
+ it 'creates a class definition' do
41
+ subject.label = :white_queen
42
+ subject.should_receive(:define_class).with(:white_queen).and_return(test_klass)
43
+ subject.define
44
+ end
45
+ end
46
+ end
47
+
48
+ context '#define_class' do
49
+ around(:each) do |example|
50
+ subject.namespace.const_set('ProfessorX', Class.new(subject.namespace))
51
+ example.run
52
+ subject.namespace.send(:remove_const, 'ProfessorX')
53
+ end
54
+
55
+ context 'already defined within the namespace' do
56
+ it 'does not define the class again' do
57
+ subject.namespace.should_not_receive(:const_set)
58
+ subject.define_class(:professor_x)
59
+ end
60
+ end
61
+
62
+ context 'not defined within the namespace' do
63
+ let(:defined_class){ double :magneto, :set_builder => true }
64
+
65
+ it 'defines the class' do
66
+ subject.namespace.should_receive(:const_set).with('Magneto', an_instance_of(Class)).and_return(defined_class)
67
+ subject.define_class(:magneto)
68
+ end
69
+ end
70
+
71
+ context 'builder attribute' do
72
+ let(:test_klass) { subject.namespace.const_get('ProfessorX') }
73
+
74
+ it 'sets the defined class builder attribute' do
75
+ test_klass.should_receive(:set_builder).with(subject)
76
+ subject.define_class(:professor_x)
77
+ end
78
+ end
79
+ end
80
+
81
+ context '#serialize' do
82
+ it 'serializes into a hash' do
83
+ subject.serialize.should include(:label)
84
+ subject.serialize.should_not include(:args, :for_class)
85
+ end
86
+ end
87
+
88
+ context '#into' do
89
+ subject { described_class.receive(label: :pyro) }
90
+ let(:other_stage){ described_class.receive(label: :iceman) }
91
+
92
+ it 'returns the linked into stage for chaining' do
93
+ subject.into(other_stage).should be(other_stage)
94
+ end
95
+
96
+ it 'links two stages together with a simple link' do
97
+ subject.into(other_stage)
98
+ subject.links.should be_any{ |link| link.from == :pyro and link.into == :iceman }
99
+ end
100
+ end
101
+ end
@@ -0,0 +1,57 @@
1
+ shared_examples_for Hanuman::Shortcuts do
2
+
3
+ before(:each) do
4
+ @orig_reg = subject.registry.show
5
+ subject.registry.clear!
6
+ end
7
+
8
+ after(:each) do
9
+ subject.registry.clear!
10
+ subject.registry.merge!(@orig_reg)
11
+ end
12
+
13
+ context '.registry' do
14
+ it 'returns the registry' do
15
+ subject.registry.should == Hanuman::GlobalRegistry
16
+ end
17
+ end
18
+
19
+ context '.add_shortcut_method_for' do
20
+ let(:shortcut){ :banshee }
21
+ it 'add shortcut methods for creating builders' do
22
+ expect{ subject.add_shortcut_method_for(shortcut, Hanuman::StageBuilder) }.to change{ subject.respond_to? shortcut }.from(false).to(true)
23
+ end
24
+ end
25
+
26
+ context '.builder_shortcut' do
27
+ context 'with an existing definition' do
28
+ let(:existing_definition){ Hanuman::StageBuilder.receive(label: :sunfire) }
29
+
30
+ it 'returns the existing definition from the registry' do
31
+ subject.registry.create(:sunfire, existing_definition)
32
+ subject.registry.should_receive(:retrieve).with(:sunfire).and_return(existing_definition)
33
+ subject.builder_shortcut(Hanuman::StageBuilder, :sunfire)
34
+ end
35
+ end
36
+
37
+ context 'with a nonexisting definition' do
38
+ let(:mock_builder_type){ double :builder_type }
39
+ let(:mock_builder) { double :builder }
40
+ let(:block_arg) { ->(){ def absorb() 'radiation' ; end } }
41
+
42
+ it 'creates a new definition using the supplied builder_type' do
43
+ mock_builder_type.should_receive(:receive).with(label: :sunfire).and_return mock_builder
44
+ mock_builder.should_receive(:define).with(&block_arg)
45
+ subject.builder_shortcut(mock_builder_type, :sunfire, &block_arg)
46
+ end
47
+ end
48
+
49
+ context 'graph builder decoration' do
50
+ it 'decorates the builder with registry methods if the builder is a GraphBuilder' do
51
+ Hanuman::GlobalRegistry.should_receive(:decorate_with_registry).with an_instance_of(Hanuman::GraphBuilder)
52
+ subject.builder_shortcut(Hanuman::GraphBuilder, :sunfire)
53
+ end
54
+ end
55
+ end
56
+
57
+ end
@@ -8,17 +8,17 @@ shared_context 'wukong', :helpers => true do
8
8
  RSpec::Matchers.define("be_#{handle}_ish"){ match{|actual| actual.should =~ regexp } }
9
9
  end
10
10
 
11
- let(:mock_val ){ mock('mock val') }
12
- let(:mock_record){ mock('mock record') }
13
- let(:mock_stage ){ m = mock('mock stage') ; m }
14
- let(:mock_processor){ m = mock ; m.stub(:name => 'mock processor', :attributes => { :a => :b }) ; m }
15
-
16
- let(:test_source){ Wukong::Integers.new(:name => :integers, :size => 100) }
17
- let(:test_sink){ Wukong::Sink::ArraySink.new(:name => :test_sink) }
18
- let(:test_processor_class){ Wukong::AsIs }
19
- let(:test_processor){ test_processor_class.new }
20
- let(:test_filter){ Wukong::Widget::RegexpFilter.new(:re => /^m/) }
21
- let(:test_dataflow){ Wukong.dataflow(:test_dataflow) }
11
+ let(:mock_val) { mock('mock val') }
12
+ let(:mock_record) { mock('mock record') }
13
+ let(:mock_stage) { mock('mock stage') }
14
+ let(:mock_processor){ mock('mock processor') }
15
+
16
+ let(:test_source) { Wukong::Integers.new(:name => :integers, :qty => 100) }
17
+ let(:test_sink) { Wukong::Sink::ArraySink.new(:name => :test_sink) }
18
+ let(:test_processor_class){ Wukong::AsIs }
19
+ let(:test_processor) { test_processor_class.new }
20
+ let(:test_filter) { Wukong::Widget::RegexpFilter.new(:re => /^m/) }
21
+ let(:test_dataflow) { Wukong.dataflow(:test_dataflow) }
22
22
  end
23
23
 
24
24
 
@@ -41,3 +41,29 @@ module WukongTestHelpers
41
41
  end
42
42
 
43
43
  end
44
+
45
+ RSpec::Core::DSL.module_eval do
46
+ def describe_example_script(example_name, source_file, attrs={}, &block)
47
+ return unless attrs[:only]
48
+ load Pathname.path_to(:examples, source_file)
49
+ describe "Example: #{example_name}", attrs.merge(:examples_spec => true, :helpers => true) do
50
+ let(:example_name){ example_name }
51
+ instance_eval(&block)
52
+ end
53
+ rescue StandardError => err
54
+ warn "Broken example #{example_name} with script #{source_file} (#{attrs})"
55
+ warn err
56
+ warn err.backtrace.join("\n")
57
+ end
58
+
59
+ def it_generates_graphviz
60
+ it 'generates a graphviz picture', :if => GRAPHVIZ do
61
+ require 'hanuman/graphvizzer/gv_presenter'
62
+ #
63
+ basename = Pathname.path_to(:tmp, example_name.to_s)
64
+ Wukong.to_graphviz.save(basename, 'png')
65
+ yield "#{basename}.dot" if block_given?
66
+ end
67
+ end
68
+
69
+ end