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,9 +1,36 @@
1
+ require 'gorillib/some'
2
+ require 'gorillib/model'
3
+ require 'tsort'
1
4
 
2
- require 'gorillib/builder'
5
+ require 'hanuman/registry'
6
+ require 'hanuman/link'
7
+ require 'hanuman/stage'
8
+ require 'hanuman/graph'
3
9
 
4
- require 'hanuman/stage' # base object for building blocks
5
- require 'hanuman/slot' # ports for inputs and outputs of stages
6
- require 'hanuman/slottable' # modules that equip stages with input and output slots
7
- require 'hanuman/action' # represents a transformation of resources
8
- require 'hanuman/resource' # represents a resource
9
- require 'hanuman/graph' # coordinates wukong stages
10
+ module Hanuman
11
+ module Shortcuts
12
+
13
+ def builder_shortcut(builder_type, label, *args, &blk)
14
+ if GlobalRegistry.registered?(label)
15
+ builder = GlobalRegistry.retrieve(label)
16
+ else
17
+ builder = builder_type.receive(label: label)
18
+ end
19
+ GlobalRegistry.decorate_with_registry(builder) if builder.is_a?(GraphBuilder)
20
+ builder.define(*args, &blk)
21
+ end
22
+
23
+ def add_shortcut_method_for(method_name, builder_type)
24
+ self.define_singleton_method(method_name){ |label, *args, &blk| builder_shortcut(builder_type, label, *args, &blk) }
25
+ end
26
+
27
+ def registry() Hanuman::GlobalRegistry ; end
28
+
29
+ end
30
+
31
+ extend Hanuman::Shortcuts
32
+
33
+ add_shortcut_method_for(:stage, StageBuilder)
34
+ add_shortcut_method_for(:graph, GraphBuilder)
35
+
36
+ end
@@ -1,51 +1,75 @@
1
1
  module Hanuman
2
+ class Graph < Stage
3
+ include TSort
2
4
 
3
- class Graph < Action
4
- collection :stages, Hanuman::Stage, :doc => 'the sequence of stages on this graph', :key_method => :name
5
- field :edges, Hash, :doc => 'connections among all stages on the graph', :default => {}
6
- include Hanuman::IsOwnInputSlot
7
- include Hanuman::IsOwnOutputSlot
5
+ field :stages, Hash, :default => {}
6
+ field :links, Array, :default => []
7
+
8
+ def tsort_each_node(&blk)
9
+ stages.keys.each(&blk)
10
+ end
8
11
 
9
- def next_name_for(stage, basename=nil)
10
- "#{basename || stage.class.handle}_#{stages.size}"
12
+ def tsort_each_child(node, &blk)
13
+ links.select{ |link| link.into == node }.map(&:from).each(&blk)
11
14
  end
12
15
 
13
- def add_stage(stage)
14
- stage.write_attribute(:name, next_name_for(stage)) if stage.name.nil?
15
- stage.write_attribute(:owner, self)
16
- stages << stage
17
- stage
16
+ def directed_sort() self.tsort ; end
17
+ end
18
+
19
+ class GraphBuilder < StageBuilder
20
+ include TSort
21
+
22
+ field :stages, Hash, :default => {}
23
+ field :links, Array, :default => []
24
+
25
+ def define(&blk)
26
+ graph = for_class || define_class(label)
27
+ self.instance_eval(&blk) if block_given?
28
+ extract_links!
29
+ graph.register
18
30
  end
19
31
 
20
- def connect(from_slot, into_slot)
21
- from_slot = lookup(from_slot)
22
- into_slot = lookup(into_slot)
23
- actual_from_slot = from_slot.set_output(into_slot)
24
- actual_into_slot = into_slot.set_input( from_slot)
25
- #
26
- edges[actual_from_slot] = actual_into_slot
27
- [from_slot, into_slot]
32
+ def build(options = {})
33
+ attrs = serialize
34
+ stages = attrs.delete(:stages).inject({}){ |hsh, (name, builder)| hsh[name] = builder.build(options) ; hsh }
35
+ for_class.receive attrs.merge(stages: stages)
28
36
  end
29
37
 
30
- def lookup(ref)
31
- ref.is_a?(Symbol) ? resource(ref) : ref
38
+ def namespace() Hanuman::Graph ; end
39
+
40
+ def handle_dsl_arguments_for(stage, *args, &blk)
41
+ options = args.extract_options!
42
+ stage.merge!(options)
43
+ stage
32
44
  end
33
45
 
34
- def tree(options={})
35
- super.merge( :stages => stages.to_a.map{|stage| stage.tree(options) } )
46
+ def extract_links!
47
+ stages.each_pair{ |name, builder| links << builder.links }
48
+ links.flatten!
49
+ end
50
+
51
+ def serialize
52
+ attrs = attributes
53
+ args = attrs.delete(:args)
54
+ attrs.delete(:for_class)
55
+ attrs.merge(args)
36
56
  end
37
57
 
38
- def graph(name, &block)
39
- stage(name, :_type => Hanuman::Graph, &block)
58
+ def tsort_each_node(&blk)
59
+ stages.keys.each(&blk)
40
60
  end
41
61
 
42
- def action(name, &block)
43
- stage(name, :_type => Hanuman::Action, &block)
62
+ def tsort_each_child(node, &blk)
63
+ links.select{ |link| link.into == node }.map(&:from).each(&blk)
44
64
  end
45
65
 
46
- def resource(name, &block)
47
- stage(name, :_type => Hanuman::Resource, &block)
66
+ def directed_sort() self.tsort ; end
67
+
68
+ def clone
69
+ cloned_attrs = Hash[ serialize.select{ |key, val| key != :stages }.map{ |key, val| dup_key = key.dup rescue key ; dup_val = val.dup rescue val ; [ dup_key, dup_val ] } ]
70
+ cloned_links = links.map{ |link| link.dup }
71
+ cloned_stages = Hash[ stages.map{ |stage| stage.clone } ]
72
+ self.class.receive(cloned_attrs.merge(links: cloned_links).merge(stages: cloned_stages).merge(for_class: for_class))
48
73
  end
49
74
  end
50
-
51
75
  end
@@ -1,185 +1,206 @@
1
+ require 'graphviz'
2
+
1
3
  module Hanuman
2
- module Graphvizzer
3
- include Gorillib::Builder
4
-
5
- class Item
6
- include Gorillib::Builder
7
- alias_method :configurate, :receive!
8
-
9
- field :name, Symbol
10
- field :label, String, :default => ->{ name }
11
- field :owner, Item
12
-
13
- def initialize(attrs={}, &block)
14
- receive!(attrs, &block)
15
- end
16
-
17
- def depth
18
- owner.depth + 1
19
- end
20
-
21
- def indent(adj=0)
22
- " " * (depth + adj)
23
- end
24
-
25
- def quote(str)
26
- return str if str.to_s.include?('"')
27
- %Q{"#{str}"}
28
- end
29
-
30
- def line(str, attrs={}, term=';')
31
- if attrs.empty?
32
- attr_strs = ''
33
- else
34
- width = 40 - indent.length
35
- str = "%-#{width}s" % str
36
- attr_strs = attrs.map{|attr, val| attrib(attr, val) }
37
- attr_strs = "[ #{attr_strs.join(",")} ]"
38
- end
39
- [indent, str, attr_strs, term].join
40
- end
41
-
42
- def attrib(attr, val)
43
- "#{attr} = #{val}"
44
- end
45
-
46
- def brace(str)
47
- "#{indent}#{str} {"
48
- end
49
- def close_brace
50
- "#{indent}}"
51
- end
52
-
53
- def pad_with_attributes(text, attrs=nil)
54
- width = 40 - (2 * graph.depth)
55
- if attrs then
56
- attr_strs = attrs.map{|attr, val| attribute_str(attr, val) }
57
- "%-#{width}s [ %s ]" % [text, attr_strs.join(',')]
58
- else
59
- text
60
- end
61
- end
62
- end
63
-
64
- class Node < Item
65
- field :inslots, Array, :default => []
66
- field :outslots, Array, :default => []
67
- field :shape, Symbol, :default => :Mrecord
68
-
69
- def graph_attribs
70
- {
71
- :shape => shape,
72
- :label => quote(shape =~ /record/ ? structured_label : label),
73
- # :fixedsize => true, :width => "1.0",
74
- }
75
- end
76
-
77
- def inslots_str
78
- inslots.map{|slot| "<#{slot}>#{slot[0..0]}"}.join("|")
79
- end
80
-
81
- def outslots_str
82
- outslots.map{|slot| "<out_#{slot}>#{slot[0..0]}"}.join("|")
83
- end
84
-
85
- def label
86
- super.to_s.gsub(/_\d+$/, '').gsub(/[_\.]+/, "\\n")
87
- end
88
-
89
- def structured_label
90
- str = "{"
91
- str << "{" << inslots_str << "}|" unless inslots.empty?
92
- str << label
93
- str << "|{" << outslots_str << "}" unless outslots.empty?
94
- str << "}"
95
- end
96
-
97
- def to_s
98
- str = []
99
- str << line(quote(name), graph_attribs)
100
- str.join("\n")
101
- end
102
- end
4
+ class Graphvizzer
103
5
 
104
- class Edge < Item
105
- magic :from, String
106
- magic :into, String
107
-
108
- def to_s
109
- str = ""
110
- str << quote(from)
111
- str << " -> "
112
- str << quote(into)
113
- line(str)
114
- end
6
+ attr_accessor :hanuman_graph, :visual
7
+
8
+ def initialize(hanuman_graph)
9
+ @hanuman_graph = hanuman_graph
10
+ @visual = GraphViz.new(@hanuman_graph.label, :type => :digraph)
115
11
  end
116
12
 
117
- class Graph < Item
118
- field :items, Array, :default => []
119
- field :edges, Array, :default => []
120
-
121
- def graph(name, attrs={})
122
- obj = Graph.new(attrs.merge(:name => name, :owner => self))
123
- items << obj
124
- yield(obj) if block_given?
125
- obj
126
- end
127
-
128
- def node(name, attrs={})
129
- obj = Node.new(attrs.merge(:name => name, :owner => self))
130
- items << obj
131
- yield(obj) if block_given?
132
- obj
133
- end
134
-
135
- def edge(from, into, from_slot=nil, into_slot=nil)
136
- obj = Edge.new(
137
- :name => name, :owner => self,
138
- :from => from, :into => into,
139
- :from_slot => from_slot, :into_slot => into_slot)
140
- edges << obj
141
- yield(obj) if block_given?
142
- obj
143
- end
144
-
145
- def to_s
146
- str = []
147
- str << brace("subgraph #{quote("cluster_#{name}")}")
148
- str << line(attrib(" label", quote(label)))
149
- items.each do |item|
150
- str << item.to_s
151
- end
152
- edges.each do |edge|
153
- str << edge.to_s
154
- end
155
- str << close_brace
156
- str.join("\n")
157
- end
158
- end
159
-
160
- class Universe < Graph
161
- field :orient, Symbol, :doc => 'one of :TB, :BT, :LR, :RL', :default => :TB
162
- field :engine, Symbol, :default => :dot
163
-
164
- def to_s
165
- str = []
166
- str << brace("digraph #{name}")
167
- str << line(" rankdir = #{orient}")
168
- items.each do |item|
169
- str << item.to_s
170
- end
171
- str << close_brace
172
- str.join("\n")
173
- end
174
-
175
- def depth() 0; end
176
-
177
- def save(path, type=nil)
178
- File.open "#{path}.dot", "w" do |f|
179
- f.puts self.to_s
180
- end
181
- system "#{engine} -T#{type} #{path}.dot > #{path}.#{type}" if type
182
- end
13
+ def create
14
+ hanuman_graph.directed_sort.each{ |stage| visual.add_nodes(stage.to_s) }
15
+ hanuman_graph.links.each{ |link| visual.add_edges(link.from.to_s, link.into.to_s) }
16
+ visual.output(:png => 'test.png')
183
17
  end
18
+
184
19
  end
185
20
  end
21
+
22
+ # module Hanuman
23
+ # module Graphvizzer
24
+ # include Gorillib::Builder
25
+
26
+ # class Item
27
+ # include Gorillib::Builder
28
+ # alias_method :configurate, :receive!
29
+
30
+ # field :name, Symbol
31
+ # field :label, String, :default => ->{ name }
32
+ # field :owner, Item
33
+
34
+ # def initialize(attrs={}, &block)
35
+ # receive!(attrs, &block)
36
+ # end
37
+
38
+ # def depth
39
+ # owner.depth + 1
40
+ # end
41
+
42
+ # def indent(adj=0)
43
+ # " " * (depth + adj)
44
+ # end
45
+
46
+ # def quote(str)
47
+ # return str if str.to_s.include?('"')
48
+ # %Q{"#{str}"}
49
+ # end
50
+
51
+ # def line(str, attrs={}, term=';')
52
+ # if attrs.empty?
53
+ # attr_strs = ''
54
+ # else
55
+ # width = 40 - indent.length
56
+ # str = "%-#{width}s" % str
57
+ # attr_strs = attrs.map{|attr, val| attrib(attr, val) }
58
+ # attr_strs = "[ #{attr_strs.join(",")} ]"
59
+ # end
60
+ # [indent, str, attr_strs, term].join
61
+ # end
62
+
63
+ # def attrib(attr, val)
64
+ # "#{attr} = #{val}"
65
+ # end
66
+
67
+ # def brace(str)
68
+ # "#{indent}#{str} {"
69
+ # end
70
+ # def close_brace
71
+ # "#{indent}}"
72
+ # end
73
+
74
+ # def pad_with_attributes(text, attrs=nil)
75
+ # width = 40 - (2 * graph.depth)
76
+ # if attrs then
77
+ # attr_strs = attrs.map{|attr, val| attribute_str(attr, val) }
78
+ # "%-#{width}s [ %s ]" % [text, attr_strs.join(',')]
79
+ # else
80
+ # text
81
+ # end
82
+ # end
83
+ # end
84
+
85
+ # class Node < Item
86
+ # field :inslots, Array, :default => []
87
+ # field :outslots, Array, :default => []
88
+ # field :shape, Symbol, :default => :Mrecord
89
+
90
+ # def graph_attribs
91
+ # {
92
+ # :shape => shape,
93
+ # :label => quote(shape =~ /record/ ? structured_label : label),
94
+ # # :fixedsize => true, :width => "1.0",
95
+ # }
96
+ # end
97
+
98
+ # def inslots_str
99
+ # inslots.map{|slot| "<#{slot}>#{slot[0..0]}"}.join("|")
100
+ # end
101
+
102
+ # def outslots_str
103
+ # outslots.map{|slot| "<out_#{slot}>#{slot[0..0]}"}.join("|")
104
+ # end
105
+
106
+ # def label
107
+ # super.to_s.gsub(/_\d+$/, '').gsub(/[_\.]+/, "\\n")
108
+ # end
109
+
110
+ # def structured_label
111
+ # str = "{"
112
+ # str << "{" << inslots_str << "}|" unless inslots.empty?
113
+ # str << label
114
+ # str << "|{" << outslots_str << "}" unless outslots.empty?
115
+ # str << "}"
116
+ # end
117
+
118
+ # def to_s
119
+ # str = []
120
+ # str << line(quote(name), graph_attribs)
121
+ # str.join("\n")
122
+ # end
123
+ # end
124
+
125
+ # class Edge < Item
126
+ # magic :from, String
127
+ # magic :into, String
128
+
129
+ # def to_s
130
+ # str = ""
131
+ # str << quote(from)
132
+ # str << " -> "
133
+ # str << quote(into)
134
+ # line(str)
135
+ # end
136
+ # end
137
+
138
+ # class Graph < Item
139
+ # field :items, Array, :default => []
140
+ # field :edges, Array, :default => []
141
+
142
+ # def graph(name, attrs={})
143
+ # obj = Graph.new(attrs.merge(:name => name, :owner => self))
144
+ # items << obj
145
+ # yield(obj) if block_given?
146
+ # obj
147
+ # end
148
+
149
+ # def node(name, attrs={})
150
+ # obj = Node.new(attrs.merge(:name => name, :owner => self))
151
+ # items << obj
152
+ # yield(obj) if block_given?
153
+ # obj
154
+ # end
155
+
156
+ # def edge(from, into, from_slot=nil, into_slot=nil)
157
+ # obj = Edge.new(
158
+ # :name => name, :owner => self,
159
+ # :from => from, :into => into,
160
+ # :from_slot => from_slot, :into_slot => into_slot)
161
+ # edges << obj
162
+ # yield(obj) if block_given?
163
+ # obj
164
+ # end
165
+
166
+ # def to_s
167
+ # str = []
168
+ # str << brace("subgraph #{quote("cluster_#{name}")}")
169
+ # str << line(attrib(" label", quote(label)))
170
+ # items.each do |item|
171
+ # str << item.to_s
172
+ # end
173
+ # edges.each do |edge|
174
+ # str << edge.to_s
175
+ # end
176
+ # str << close_brace
177
+ # str.join("\n")
178
+ # end
179
+ # end
180
+
181
+ # class Universe < Graph
182
+ # field :orient, Symbol, :doc => 'one of :TB, :BT, :LR, :RL', :default => :TB
183
+ # field :engine, Symbol, :default => :dot
184
+
185
+ # def to_s
186
+ # str = []
187
+ # str << brace("digraph #{name}")
188
+ # str << line(" rankdir = #{orient}")
189
+ # items.each do |item|
190
+ # str << item.to_s
191
+ # end
192
+ # str << close_brace
193
+ # str.join("\n")
194
+ # end
195
+
196
+ # def depth() 0; end
197
+
198
+ # def save(path, type=nil)
199
+ # File.open "#{path}.dot", "w" do |f|
200
+ # f.puts self.to_s
201
+ # end
202
+ # system "#{engine} -T#{type} #{path}.dot > #{path}.#{type}" if type
203
+ # end
204
+ # end
205
+ # end
206
+ # end