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.
- data/.gitignore +46 -33
- data/.gitmodules +3 -0
- data/.rspec +1 -1
- data/.travis.yml +8 -1
- data/.yardopts +0 -13
- data/Guardfile +4 -6
- data/{LICENSE.textile → LICENSE.md} +43 -55
- data/README-old.md +422 -0
- data/README.md +279 -418
- data/Rakefile +21 -5
- data/TODO.md +6 -6
- data/bin/wu-clean-encoding +31 -0
- data/bin/wu-lign +2 -2
- data/bin/wu-local +69 -0
- data/bin/wu-server +70 -0
- data/examples/Gemfile +38 -0
- data/examples/README.md +9 -0
- data/examples/dataflow/apache_log_line.rb +64 -25
- data/examples/dataflow/fibonacci_series.rb +101 -0
- data/examples/dataflow/parse_apache_logs.rb +37 -7
- data/examples/{dataflow.rb → dataflow/scraper_macro_flow.rb} +0 -0
- data/examples/dataflow/simple.rb +4 -4
- data/examples/geo.rb +4 -0
- data/examples/geo/geo_grids.numbers +0 -0
- data/examples/geo/geolocated.rb +331 -0
- data/examples/geo/quadtile.rb +69 -0
- data/examples/geo/spec/geolocated_spec.rb +247 -0
- data/examples/geo/tile_fetcher.rb +77 -0
- data/examples/graph/minimum_spanning_tree.rb +61 -61
- data/examples/jabberwocky.txt +36 -0
- data/examples/models/wikipedia.rb +20 -0
- data/examples/munging/Gemfile +8 -0
- data/examples/munging/airline_flights/airline.rb +57 -0
- data/examples/munging/airline_flights/airline_flights.rake +83 -0
- data/{lib/wukong/settings.rb → examples/munging/airline_flights/airplane.rb} +0 -0
- data/examples/munging/airline_flights/airport.rb +211 -0
- data/examples/munging/airline_flights/airport_id_unification.rb +129 -0
- data/examples/munging/airline_flights/airport_ok_chars.rb +4 -0
- data/examples/munging/airline_flights/flight.rb +156 -0
- data/examples/munging/airline_flights/models.rb +4 -0
- data/examples/munging/airline_flights/parse.rb +26 -0
- data/examples/munging/airline_flights/reconcile_airports.rb +142 -0
- data/examples/munging/airline_flights/route.rb +35 -0
- data/examples/munging/airline_flights/tasks.rake +83 -0
- data/examples/munging/airline_flights/timezone_fixup.rb +62 -0
- data/examples/munging/airline_flights/topcities.rb +167 -0
- data/examples/munging/airports/40_wbans.txt +40 -0
- data/examples/munging/airports/filter_weather_reports.rb +37 -0
- data/examples/munging/airports/join.pig +31 -0
- data/examples/munging/airports/to_tsv.rb +33 -0
- data/examples/munging/airports/usa_wbans.pig +19 -0
- data/examples/munging/airports/usa_wbans.txt +2157 -0
- data/examples/munging/airports/wbans.pig +19 -0
- data/examples/munging/airports/wbans.txt +2310 -0
- data/examples/munging/geo/geo_json.rb +54 -0
- data/examples/munging/geo/geo_models.rb +69 -0
- data/examples/munging/geo/geonames_models.rb +78 -0
- data/examples/munging/geo/iso_codes.rb +172 -0
- data/examples/munging/geo/reconcile_countries.rb +124 -0
- data/examples/munging/geo/tasks.rake +71 -0
- data/examples/munging/rake_helper.rb +62 -0
- data/examples/munging/weather/.gitignore +1 -0
- data/examples/munging/weather/Gemfile +4 -0
- data/examples/munging/weather/Rakefile +28 -0
- data/examples/munging/weather/extract_ish.rb +13 -0
- data/examples/munging/weather/models/weather.rb +119 -0
- data/examples/munging/weather/utils/noaa_downloader.rb +46 -0
- data/examples/munging/wikipedia/README.md +34 -0
- data/examples/munging/wikipedia/Rakefile +193 -0
- data/examples/munging/wikipedia/articles/extract_articles-parsed.rb +79 -0
- data/examples/munging/wikipedia/articles/extract_articles-templated.rb +136 -0
- data/examples/munging/wikipedia/articles/textualize_articles.rb +54 -0
- data/examples/munging/wikipedia/articles/verify_structure.rb +43 -0
- data/examples/munging/wikipedia/articles/wp2txt-LICENSE.txt +22 -0
- data/examples/munging/wikipedia/articles/wp2txt_article.rb +259 -0
- data/examples/munging/wikipedia/articles/wp2txt_utils.rb +452 -0
- data/examples/munging/wikipedia/dbpedia/dbpedia_common.rb +4 -0
- data/examples/munging/wikipedia/dbpedia/dbpedia_extract_geocoordinates.rb +78 -0
- data/examples/munging/wikipedia/dbpedia/extract_links.rb +193 -0
- data/examples/munging/wikipedia/dbpedia/sameas_extractor.rb +20 -0
- data/examples/munging/wikipedia/n1_subuniverse/n1_nodes.pig +18 -0
- data/examples/munging/wikipedia/page_metadata/extract_page_metadata.rb +21 -0
- data/examples/munging/wikipedia/page_metadata/extract_page_metadata.rb.old +27 -0
- data/examples/munging/wikipedia/pagelinks/augment_pagelinks.pig +29 -0
- data/examples/munging/wikipedia/pagelinks/extract_pagelinks.rb +14 -0
- data/examples/munging/wikipedia/pagelinks/extract_pagelinks.rb.old +25 -0
- data/examples/munging/wikipedia/pagelinks/undirect_pagelinks.pig +29 -0
- data/examples/munging/wikipedia/pageviews/augment_pageviews.pig +32 -0
- data/examples/munging/wikipedia/pageviews/extract_pageviews.rb +85 -0
- data/examples/munging/wikipedia/pig_style_guide.md +25 -0
- data/examples/munging/wikipedia/redirects/redirects_page_metadata.pig +19 -0
- data/examples/munging/wikipedia/subuniverse/sub_articles.pig +23 -0
- data/examples/munging/wikipedia/subuniverse/sub_page_metadata.pig +24 -0
- data/examples/munging/wikipedia/subuniverse/sub_pagelinks_from.pig +22 -0
- data/examples/munging/wikipedia/subuniverse/sub_pagelinks_into.pig +22 -0
- data/examples/munging/wikipedia/subuniverse/sub_pagelinks_within.pig +26 -0
- data/examples/munging/wikipedia/subuniverse/sub_pageviews.pig +29 -0
- data/examples/munging/wikipedia/subuniverse/sub_undirected_pagelinks_within.pig +24 -0
- data/examples/munging/wikipedia/utils/get_namespaces.rb +86 -0
- data/examples/munging/wikipedia/utils/munging_utils.rb +68 -0
- data/examples/munging/wikipedia/utils/namespaces.json +1 -0
- data/examples/rake_helper.rb +85 -0
- data/examples/server_logs/geo_ip_mapping/munge_geolite.rb +82 -0
- data/examples/server_logs/logline.rb +95 -0
- data/examples/server_logs/models.rb +66 -0
- data/examples/server_logs/page_counts.pig +48 -0
- data/examples/server_logs/server_logs-01-parse-script.rb +13 -0
- data/examples/server_logs/server_logs-02-histograms-full.rb +33 -0
- data/examples/server_logs/server_logs-02-histograms-mapper.rb +14 -0
- data/{old/examples/server_logs/breadcrumbs.rb → examples/server_logs/server_logs-03-breadcrumbs-full.rb} +26 -30
- data/examples/server_logs/server_logs-04-page_page_edges-full.rb +40 -0
- data/examples/string_reverser.rb +26 -0
- data/examples/text/pig_latin.rb +2 -2
- data/examples/text/regional_flavor/README.md +14 -0
- data/examples/text/regional_flavor/article_wordbags.pig +39 -0
- data/examples/text/regional_flavor/j01-article_wordbags.rb +4 -0
- data/examples/text/regional_flavor/simple_pig_script.pig +27 -0
- data/examples/word_count/accumulator.rb +26 -0
- data/examples/word_count/tokenizer.rb +13 -0
- data/examples/word_count/word_count.rb +6 -0
- data/examples/workflow/cherry_pie.dot +97 -0
- data/examples/workflow/cherry_pie.png +0 -0
- data/examples/workflow/cherry_pie.rb +61 -26
- data/lib/hanuman.rb +34 -7
- data/lib/hanuman/graph.rb +55 -31
- data/lib/hanuman/graphvizzer.rb +199 -178
- data/lib/hanuman/graphvizzer/gv_models.rb +161 -0
- data/lib/hanuman/graphvizzer/gv_presenter.rb +97 -0
- data/lib/hanuman/link.rb +35 -0
- data/lib/hanuman/registry.rb +46 -0
- data/lib/hanuman/stage.rb +76 -32
- data/lib/wukong.rb +23 -24
- data/lib/wukong/boot.rb +87 -0
- data/lib/wukong/configuration.rb +8 -0
- data/lib/wukong/dataflow.rb +45 -78
- data/lib/wukong/driver.rb +99 -0
- data/lib/wukong/emitter.rb +22 -0
- data/lib/wukong/model/faker.rb +24 -24
- data/lib/wukong/model/flatpack_parser/flat.rb +60 -0
- data/lib/wukong/model/flatpack_parser/flatpack.rb +4 -0
- data/lib/wukong/model/flatpack_parser/lang.rb +46 -0
- data/lib/wukong/model/flatpack_parser/parser.rb +55 -0
- data/lib/wukong/model/flatpack_parser/tokens.rb +130 -0
- data/lib/wukong/processor.rb +60 -114
- data/lib/wukong/spec_helpers.rb +81 -0
- data/lib/wukong/spec_helpers/integration_driver.rb +144 -0
- data/lib/wukong/spec_helpers/integration_driver_matchers.rb +219 -0
- data/lib/wukong/spec_helpers/processor_helpers.rb +95 -0
- data/lib/wukong/spec_helpers/processor_methods.rb +108 -0
- data/lib/wukong/spec_helpers/shared_examples.rb +15 -0
- data/lib/wukong/spec_helpers/spec_driver.rb +28 -0
- data/lib/wukong/spec_helpers/spec_driver_matchers.rb +195 -0
- data/lib/wukong/version.rb +2 -1
- data/lib/wukong/widget/filters.rb +311 -0
- data/lib/wukong/widget/processors.rb +156 -0
- data/lib/wukong/widget/reducers.rb +7 -0
- data/lib/wukong/widget/reducers/accumulator.rb +73 -0
- data/lib/wukong/widget/reducers/bin.rb +318 -0
- data/lib/wukong/widget/reducers/count.rb +61 -0
- data/lib/wukong/widget/reducers/group.rb +85 -0
- data/lib/wukong/widget/reducers/group_concat.rb +70 -0
- data/lib/wukong/widget/reducers/moments.rb +72 -0
- data/lib/wukong/widget/reducers/sort.rb +130 -0
- data/lib/wukong/widget/serializers.rb +287 -0
- data/lib/wukong/widget/sink.rb +10 -52
- data/lib/wukong/widget/source.rb +7 -113
- data/lib/wukong/widget/utils.rb +46 -0
- data/lib/wukong/widgets.rb +6 -0
- data/spec/examples/dataflow/fibonacci_series_spec.rb +18 -0
- data/spec/examples/dataflow/parsing_spec.rb +12 -11
- data/spec/examples/dataflow/simple_spec.rb +32 -6
- data/spec/examples/dataflow/telegram_spec.rb +36 -36
- data/spec/examples/graph/minimum_spanning_tree_spec.rb +30 -31
- data/spec/examples/munging/airline_flights/identifiers_spec.rb +16 -0
- data/spec/examples/munging/airline_flights_spec.rb +202 -0
- data/spec/examples/text/pig_latin_spec.rb +13 -16
- data/spec/examples/workflow/cherry_pie_spec.rb +34 -4
- data/spec/hanuman/graph_spec.rb +27 -2
- data/spec/hanuman/hanuman_spec.rb +10 -0
- data/spec/hanuman/registry_spec.rb +123 -0
- data/spec/hanuman/stage_spec.rb +61 -7
- data/spec/spec_helper.rb +29 -19
- data/spec/support/hanuman_test_helpers.rb +14 -12
- data/spec/support/shared_context_for_reducers.rb +37 -0
- data/spec/support/shared_examples_for_builders.rb +101 -0
- data/spec/support/shared_examples_for_shortcuts.rb +57 -0
- data/spec/support/wukong_test_helpers.rb +37 -11
- data/spec/wukong/dataflow_spec.rb +77 -55
- data/spec/wukong/local_runner_spec.rb +24 -24
- data/spec/wukong/model/faker_spec.rb +132 -131
- data/spec/wukong/runner_spec.rb +8 -8
- data/spec/wukong/widget/filters_spec.rb +61 -0
- data/spec/wukong/widget/processors_spec.rb +126 -0
- data/spec/wukong/widget/reducers/bin_spec.rb +92 -0
- data/spec/wukong/widget/reducers/count_spec.rb +11 -0
- data/spec/wukong/widget/reducers/group_spec.rb +20 -0
- data/spec/wukong/widget/reducers/moments_spec.rb +36 -0
- data/spec/wukong/widget/reducers/sort_spec.rb +26 -0
- data/spec/wukong/widget/serializers_spec.rb +92 -0
- data/spec/wukong/widget/sink_spec.rb +15 -15
- data/spec/wukong/widget/source_spec.rb +65 -41
- data/spec/wukong/wukong_spec.rb +10 -0
- data/wukong.gemspec +17 -10
- metadata +359 -335
- data/.document +0 -5
- data/VERSION +0 -1
- data/bin/hdp-bin +0 -44
- data/bin/hdp-bzip +0 -23
- data/bin/hdp-cat +0 -3
- data/bin/hdp-catd +0 -3
- data/bin/hdp-cp +0 -3
- data/bin/hdp-du +0 -86
- data/bin/hdp-get +0 -3
- data/bin/hdp-kill +0 -3
- data/bin/hdp-kill-task +0 -3
- data/bin/hdp-ls +0 -11
- data/bin/hdp-mkdir +0 -2
- data/bin/hdp-mkdirp +0 -12
- data/bin/hdp-mv +0 -3
- data/bin/hdp-parts_to_keys.rb +0 -77
- data/bin/hdp-ps +0 -3
- data/bin/hdp-put +0 -3
- data/bin/hdp-rm +0 -32
- data/bin/hdp-sort +0 -40
- data/bin/hdp-stream +0 -40
- data/bin/hdp-stream-flat +0 -22
- data/bin/hdp-stream2 +0 -39
- data/bin/hdp-sync +0 -17
- data/bin/hdp-wc +0 -67
- data/bin/wu-flow +0 -10
- data/bin/wu-map +0 -17
- data/bin/wu-red +0 -17
- data/bin/wukong +0 -17
- data/data/CREDITS.md +0 -355
- data/data/graph/airfares.tsv +0 -2174
- data/data/text/gift_of_the_magi.txt +0 -225
- data/data/text/jabberwocky.txt +0 -36
- data/data/text/rectification_of_names.txt +0 -33
- data/data/twitter/a_atsigns_b.tsv +0 -64
- data/data/twitter/a_follows_b.tsv +0 -53
- data/data/twitter/tweet.tsv +0 -167
- data/data/twitter/twitter_user.tsv +0 -55
- data/data/wikipedia/dbpedia-sentences.tsv +0 -1000
- data/docpages/INSTALL.textile +0 -92
- data/docpages/LICENSE.textile +0 -107
- data/docpages/README-elastic_map_reduce.textile +0 -377
- data/docpages/README-performance.textile +0 -90
- data/docpages/README-wulign.textile +0 -65
- data/docpages/UsingWukong-part1-get_ready.textile +0 -17
- data/docpages/UsingWukong-part2-ThinkingBigData.textile +0 -75
- data/docpages/UsingWukong-part3-parsing.textile +0 -138
- data/docpages/_config.yml +0 -39
- data/docpages/avro/avro_notes.textile +0 -56
- data/docpages/avro/performance.textile +0 -36
- data/docpages/avro/tethering.textile +0 -19
- data/docpages/bigdata-tips.textile +0 -143
- data/docpages/code/api_response_example.txt +0 -20
- data/docpages/code/parser_skeleton.rb +0 -38
- data/docpages/diagrams/MapReduceDiagram.graffle +0 -0
- data/docpages/favicon.ico +0 -0
- data/docpages/gem.css +0 -16
- data/docpages/hadoop-tips.textile +0 -83
- data/docpages/index.textile +0 -92
- data/docpages/intro.textile +0 -8
- data/docpages/moreinfo.textile +0 -174
- data/docpages/news.html +0 -24
- data/docpages/pig/PigLatinExpressionsList.txt +0 -122
- data/docpages/pig/PigLatinReferenceManual.txt +0 -1640
- data/docpages/pig/commandline_params.txt +0 -26
- data/docpages/pig/cookbook.html +0 -481
- data/docpages/pig/images/hadoop-logo.jpg +0 -0
- data/docpages/pig/images/instruction_arrow.png +0 -0
- data/docpages/pig/images/pig-logo.gif +0 -0
- data/docpages/pig/piglatin_ref1.html +0 -1103
- data/docpages/pig/piglatin_ref2.html +0 -14340
- data/docpages/pig/setup.html +0 -505
- data/docpages/pig/skin/basic.css +0 -166
- data/docpages/pig/skin/breadcrumbs.js +0 -237
- data/docpages/pig/skin/fontsize.js +0 -166
- data/docpages/pig/skin/getBlank.js +0 -40
- data/docpages/pig/skin/getMenu.js +0 -45
- data/docpages/pig/skin/images/chapter.gif +0 -0
- data/docpages/pig/skin/images/chapter_open.gif +0 -0
- data/docpages/pig/skin/images/current.gif +0 -0
- data/docpages/pig/skin/images/external-link.gif +0 -0
- data/docpages/pig/skin/images/header_white_line.gif +0 -0
- data/docpages/pig/skin/images/page.gif +0 -0
- data/docpages/pig/skin/images/pdfdoc.gif +0 -0
- data/docpages/pig/skin/images/rc-b-l-15-1body-2menu-3menu.png +0 -0
- data/docpages/pig/skin/images/rc-b-r-15-1body-2menu-3menu.png +0 -0
- data/docpages/pig/skin/images/rc-b-r-5-1header-2tab-selected-3tab-selected.png +0 -0
- data/docpages/pig/skin/images/rc-t-l-5-1header-2searchbox-3searchbox.png +0 -0
- data/docpages/pig/skin/images/rc-t-l-5-1header-2tab-selected-3tab-selected.png +0 -0
- data/docpages/pig/skin/images/rc-t-l-5-1header-2tab-unselected-3tab-unselected.png +0 -0
- data/docpages/pig/skin/images/rc-t-r-15-1body-2menu-3menu.png +0 -0
- data/docpages/pig/skin/images/rc-t-r-5-1header-2searchbox-3searchbox.png +0 -0
- data/docpages/pig/skin/images/rc-t-r-5-1header-2tab-selected-3tab-selected.png +0 -0
- data/docpages/pig/skin/images/rc-t-r-5-1header-2tab-unselected-3tab-unselected.png +0 -0
- data/docpages/pig/skin/print.css +0 -54
- data/docpages/pig/skin/profile.css +0 -181
- data/docpages/pig/skin/screen.css +0 -587
- data/docpages/pig/tutorial.html +0 -1059
- data/docpages/pig/udf.html +0 -1509
- data/docpages/tutorial.textile +0 -283
- data/docpages/usage.textile +0 -195
- data/docpages/wutils.textile +0 -263
- data/examples/dataflow/complex.rb +0 -11
- data/examples/dataflow/donuts.rb +0 -13
- data/examples/tiny_count/jabberwocky_output.tsv +0 -92
- data/examples/word_count.rb +0 -48
- data/examples/workflow/fiddle.rb +0 -24
- data/lib/away/escapement.rb +0 -129
- data/lib/away/exe.rb +0 -11
- data/lib/away/experimental.rb +0 -5
- data/lib/away/from_file.rb +0 -52
- data/lib/away/job.rb +0 -56
- data/lib/away/job/rake_compat.rb +0 -17
- data/lib/away/registry.rb +0 -79
- data/lib/away/runner.rb +0 -276
- data/lib/away/runner/execute.rb +0 -121
- data/lib/away/script.rb +0 -161
- data/lib/away/script/hadoop_command.rb +0 -240
- data/lib/away/source/file_list_source.rb +0 -15
- data/lib/away/source/looper.rb +0 -18
- data/lib/away/task.rb +0 -219
- data/lib/hanuman/action.rb +0 -21
- data/lib/hanuman/chain.rb +0 -4
- data/lib/hanuman/graphviz.rb +0 -74
- data/lib/hanuman/resource.rb +0 -6
- data/lib/hanuman/slot.rb +0 -87
- data/lib/hanuman/slottable.rb +0 -220
- data/lib/wukong/bad_record.rb +0 -15
- data/lib/wukong/event.rb +0 -44
- data/lib/wukong/local_runner.rb +0 -55
- data/lib/wukong/mapred.rb +0 -3
- data/lib/wukong/universe.rb +0 -48
- data/lib/wukong/widget/filter.rb +0 -81
- data/lib/wukong/widget/gibberish.rb +0 -123
- data/lib/wukong/widget/monitor.rb +0 -26
- data/lib/wukong/widget/reducer.rb +0 -66
- data/lib/wukong/widget/stringifier.rb +0 -50
- data/lib/wukong/workflow.rb +0 -22
- data/lib/wukong/workflow/command.rb +0 -42
- data/old/config/emr-example.yaml +0 -48
- data/old/examples/README.txt +0 -17
- data/old/examples/contrib/jeans/README.markdown +0 -165
- data/old/examples/contrib/jeans/data/normalized_sizes +0 -3
- data/old/examples/contrib/jeans/data/orders.tsv +0 -1302
- data/old/examples/contrib/jeans/data/sizes +0 -3
- data/old/examples/contrib/jeans/normalize.rb +0 -20
- data/old/examples/contrib/jeans/sizes.rb +0 -55
- data/old/examples/corpus/bnc_word_freq.rb +0 -44
- data/old/examples/corpus/bucket_counter.rb +0 -47
- data/old/examples/corpus/dbpedia_abstract_to_sentences.rb +0 -86
- data/old/examples/corpus/sentence_bigrams.rb +0 -53
- data/old/examples/corpus/sentence_coocurrence.rb +0 -66
- data/old/examples/corpus/stopwords.rb +0 -138
- data/old/examples/corpus/words_to_bigrams.rb +0 -53
- data/old/examples/emr/README.textile +0 -110
- data/old/examples/emr/dot_wukong_dir/credentials.json +0 -7
- data/old/examples/emr/dot_wukong_dir/emr.yaml +0 -69
- data/old/examples/emr/dot_wukong_dir/emr_bootstrap.sh +0 -33
- data/old/examples/emr/elastic_mapreduce_example.rb +0 -28
- data/old/examples/network_graph/adjacency_list.rb +0 -74
- data/old/examples/network_graph/breadth_first_search.rb +0 -72
- data/old/examples/network_graph/gen_2paths.rb +0 -68
- data/old/examples/network_graph/gen_multi_edge.rb +0 -112
- data/old/examples/network_graph/gen_symmetric_links.rb +0 -64
- data/old/examples/pagerank/README.textile +0 -6
- data/old/examples/pagerank/gen_initial_pagerank_graph.pig +0 -57
- data/old/examples/pagerank/pagerank.rb +0 -72
- data/old/examples/pagerank/pagerank_initialize.rb +0 -42
- data/old/examples/pagerank/run_pagerank.sh +0 -21
- data/old/examples/sample_records.rb +0 -33
- data/old/examples/server_logs/apache_log_parser.rb +0 -15
- data/old/examples/server_logs/nook.rb +0 -48
- data/old/examples/server_logs/nook/faraday_dummy_adapter.rb +0 -94
- data/old/examples/server_logs/user_agent.rb +0 -40
- data/old/examples/simple_word_count.rb +0 -82
- data/old/examples/size.rb +0 -61
- data/old/examples/stats/avg_value_frequency.rb +0 -86
- data/old/examples/stats/binning_percentile_estimator.rb +0 -140
- data/old/examples/stats/data/avg_value_frequency.tsv +0 -3
- data/old/examples/stats/rank_and_bin.rb +0 -173
- data/old/examples/stupidly_simple_filter.rb +0 -40
- data/old/examples/word_count.rb +0 -75
- data/old/graph/graphviz_builder.rb +0 -580
- data/old/graph_easy/Attributes.pm +0 -4181
- data/old/graph_easy/Graphviz.pm +0 -2232
- data/old/wukong.rb +0 -18
- data/old/wukong/and_pig.rb +0 -38
- data/old/wukong/bad_record.rb +0 -18
- data/old/wukong/datatypes.rb +0 -24
- data/old/wukong/datatypes/enum.rb +0 -127
- data/old/wukong/datatypes/fake_types.rb +0 -17
- data/old/wukong/decorator.rb +0 -28
- data/old/wukong/encoding/asciize.rb +0 -108
- data/old/wukong/extensions.rb +0 -16
- data/old/wukong/extensions/array.rb +0 -18
- data/old/wukong/extensions/blank.rb +0 -93
- data/old/wukong/extensions/class.rb +0 -189
- data/old/wukong/extensions/date_time.rb +0 -53
- data/old/wukong/extensions/emittable.rb +0 -69
- data/old/wukong/extensions/enumerable.rb +0 -79
- data/old/wukong/extensions/hash.rb +0 -167
- data/old/wukong/extensions/hash_keys.rb +0 -16
- data/old/wukong/extensions/hash_like.rb +0 -150
- data/old/wukong/extensions/hashlike_class.rb +0 -47
- data/old/wukong/extensions/module.rb +0 -2
- data/old/wukong/extensions/pathname.rb +0 -27
- data/old/wukong/extensions/string.rb +0 -65
- data/old/wukong/extensions/struct.rb +0 -17
- data/old/wukong/extensions/symbol.rb +0 -11
- data/old/wukong/filename_pattern.rb +0 -74
- data/old/wukong/helper.rb +0 -7
- data/old/wukong/helper/stopwords.rb +0 -195
- data/old/wukong/helper/tokenize.rb +0 -35
- data/old/wukong/logger.rb +0 -38
- data/old/wukong/periodic_monitor.rb +0 -72
- data/old/wukong/schema.rb +0 -269
- data/old/wukong/script.rb +0 -286
- data/old/wukong/script/avro_command.rb +0 -5
- data/old/wukong/script/cassandra_loader_script.rb +0 -40
- data/old/wukong/script/emr_command.rb +0 -168
- data/old/wukong/script/hadoop_command.rb +0 -237
- data/old/wukong/script/local_command.rb +0 -41
- data/old/wukong/store.rb +0 -10
- data/old/wukong/store/base.rb +0 -27
- data/old/wukong/store/cassandra.rb +0 -10
- data/old/wukong/store/cassandra/streaming.rb +0 -75
- data/old/wukong/store/cassandra/struct_loader.rb +0 -21
- data/old/wukong/store/cassandra_model.rb +0 -91
- data/old/wukong/store/chh_chunked_flat_file_store.rb +0 -37
- data/old/wukong/store/chunked_flat_file_store.rb +0 -48
- data/old/wukong/store/conditional_store.rb +0 -57
- data/old/wukong/store/factory.rb +0 -8
- data/old/wukong/store/flat_file_store.rb +0 -89
- data/old/wukong/store/key_store.rb +0 -51
- data/old/wukong/store/null_store.rb +0 -15
- data/old/wukong/store/read_thru_store.rb +0 -22
- data/old/wukong/store/tokyo_tdb_key_store.rb +0 -33
- data/old/wukong/store/tyrant_rdb_key_store.rb +0 -57
- data/old/wukong/store/tyrant_tdb_key_store.rb +0 -20
- data/old/wukong/streamer.rb +0 -30
- data/old/wukong/streamer/accumulating_reducer.rb +0 -83
- data/old/wukong/streamer/base.rb +0 -126
- data/old/wukong/streamer/counting_reducer.rb +0 -25
- data/old/wukong/streamer/filter.rb +0 -20
- data/old/wukong/streamer/instance_streamer.rb +0 -15
- data/old/wukong/streamer/json_streamer.rb +0 -21
- data/old/wukong/streamer/line_streamer.rb +0 -12
- data/old/wukong/streamer/list_reducer.rb +0 -31
- data/old/wukong/streamer/rank_and_bin_reducer.rb +0 -145
- data/old/wukong/streamer/record_streamer.rb +0 -14
- data/old/wukong/streamer/reducer.rb +0 -11
- data/old/wukong/streamer/set_reducer.rb +0 -14
- data/old/wukong/streamer/struct_streamer.rb +0 -48
- data/old/wukong/streamer/summing_reducer.rb +0 -29
- data/old/wukong/streamer/uniq_by_last_reducer.rb +0 -51
- data/old/wukong/typed_struct.rb +0 -12
- data/spec/away/encoding_spec.rb +0 -32
- data/spec/away/exe_spec.rb +0 -20
- data/spec/away/flow_spec.rb +0 -82
- data/spec/away/graph_spec.rb +0 -6
- data/spec/away/job_spec.rb +0 -15
- data/spec/away/rake_compat_spec.rb +0 -9
- data/spec/away/script_spec.rb +0 -81
- data/spec/hanuman/graphviz_spec.rb +0 -29
- data/spec/hanuman/slot_spec.rb +0 -2
- data/spec/support/examples_helper.rb +0 -10
- data/spec/support/streamer_test_helpers.rb +0 -6
- data/spec/support/wukong_widget_helpers.rb +0 -66
- data/spec/wukong/processor_spec.rb +0 -109
- data/spec/wukong/widget/filter_spec.rb +0 -99
- data/spec/wukong/widget/stringifier_spec.rb +0 -51
- data/spec/wukong/workflow/command_spec.rb +0 -5
data/lib/hanuman/slottable.rb
DELETED
@@ -1,220 +0,0 @@
|
|
1
|
-
module Hanuman
|
2
|
-
|
3
|
-
#
|
4
|
-
# For stages that can be linked to directly
|
5
|
-
# Including this means your stage has exactly one input (itself).
|
6
|
-
#
|
7
|
-
module IsOwnInputSlot
|
8
|
-
extend Gorillib::Concern
|
9
|
-
include Inlinkable
|
10
|
-
included do
|
11
|
-
magic :input, Hanuman::Stage, :writer => false, :tester => true, :doc => 'stage/slot in graph that feeds into this one'
|
12
|
-
end
|
13
|
-
def inputs
|
14
|
-
input? ? [input] : []
|
15
|
-
end
|
16
|
-
end
|
17
|
-
|
18
|
-
#
|
19
|
-
# For stages that can be linked to directly
|
20
|
-
# Including this means your stage has exactly one output (itself).
|
21
|
-
#
|
22
|
-
module IsOwnOutputSlot
|
23
|
-
extend Gorillib::Concern
|
24
|
-
include Outlinkable
|
25
|
-
included do
|
26
|
-
magic :output, Hanuman::Stage, :writer => false, :tester => true, :doc => 'stage/slot in graph this one feeds into'
|
27
|
-
end
|
28
|
-
def outputs
|
29
|
-
output? ? [output] : []
|
30
|
-
end
|
31
|
-
end
|
32
|
-
|
33
|
-
#
|
34
|
-
# For stages with named slots
|
35
|
-
#
|
36
|
-
# A named slot is a special kind of field: saying
|
37
|
-
#
|
38
|
-
# consumes :brain
|
39
|
-
#
|
40
|
-
# gives your class
|
41
|
-
#
|
42
|
-
# * A normal attribute `brain_slot`
|
43
|
-
# * methods `brain_slot`, `receive_brain_slot` to go with it
|
44
|
-
# * method `brain`, returning the item (if any) connected to the brain slot
|
45
|
-
# * method `brain=` (alias for `receive_brain`) that links the brain slot with the given item
|
46
|
-
#
|
47
|
-
# @note that at the moment you can't have an input and an output with the same name.
|
48
|
-
#
|
49
|
-
module Slottable
|
50
|
-
extend Gorillib::Concern
|
51
|
-
include Inlinkable
|
52
|
-
include Outlinkable
|
53
|
-
|
54
|
-
included do
|
55
|
-
collection :outslots, Hanuman::OutputSlot, :key_method => :name
|
56
|
-
end
|
57
|
-
|
58
|
-
def inputs
|
59
|
-
inslots.to_a.map{|slot| slot.input }.compact
|
60
|
-
end
|
61
|
-
|
62
|
-
def inslots
|
63
|
-
self.class.inslot_fields.map{|_, slot_field| read_attribute(slot_field.name) }
|
64
|
-
end
|
65
|
-
|
66
|
-
def handle_extra_attributes(attrs)
|
67
|
-
self.class.inslot_fields.each do |_, field|
|
68
|
-
field_name = field.basename
|
69
|
-
next unless attrs.has_key?(field_name)
|
70
|
-
self.public_send(:"receive_#{field_name}", attrs.delete(field_name))
|
71
|
-
end
|
72
|
-
super(attrs)
|
73
|
-
end
|
74
|
-
|
75
|
-
module ClassMethods
|
76
|
-
def consumes(name, options={})
|
77
|
-
field name, Hanuman::Stage, {:field_type => InputSlotField}.merge(options)
|
78
|
-
end
|
79
|
-
def produces(name, options={})
|
80
|
-
field name, Hanuman::Stage, {:field_type => OutputSlotField}.merge(options)
|
81
|
-
end
|
82
|
-
|
83
|
-
def define_slot_reader(field)
|
84
|
-
meth_name = field.basename
|
85
|
-
slot_name = field.name
|
86
|
-
type = field.type
|
87
|
-
define_meta_module_method(meth_name, true) do ||
|
88
|
-
begin
|
89
|
-
slot = read_attribute(slot_name) or return nil
|
90
|
-
slot.other
|
91
|
-
rescue StandardError => err ; err.polish("#{self.class}.#{meth_name}") rescue nil ; raise ; end
|
92
|
-
end
|
93
|
-
end
|
94
|
-
|
95
|
-
def define_inslot_receiver(field)
|
96
|
-
meth_name = field.basename
|
97
|
-
slot_name = field.name
|
98
|
-
type = field.type
|
99
|
-
define_meta_module_method("receive_#{meth_name}", true) do |stage|
|
100
|
-
begin
|
101
|
-
slot = read_attribute(slot_name) or return nil
|
102
|
-
slot.from(stage)
|
103
|
-
self
|
104
|
-
rescue StandardError => err ; err.polish("#{self.class} set slot #{meth_name} to #{stage}") rescue nil ; raise ; end
|
105
|
-
end
|
106
|
-
meta_module.module_eval do
|
107
|
-
alias_method "#{meth_name}=", "receive_#{meth_name}"
|
108
|
-
end
|
109
|
-
end
|
110
|
-
|
111
|
-
def define_outslot_receiver(field)
|
112
|
-
meth_name = field.basename
|
113
|
-
slot_name = field.name
|
114
|
-
type = field.type
|
115
|
-
define_meta_module_method("receive_#{meth_name}", true) do |stage|
|
116
|
-
begin
|
117
|
-
slot = read_attribute(slot_name) or return nil
|
118
|
-
slot.into(stage)
|
119
|
-
self
|
120
|
-
rescue StandardError => err ; err.polish("#{self.class} set slot #{meth_name} to #{stage}") rescue nil ; raise ; end
|
121
|
-
end
|
122
|
-
meta_module.module_eval do
|
123
|
-
alias_method "#{meth_name}=", "receive_#{meth_name}"
|
124
|
-
end
|
125
|
-
end
|
126
|
-
|
127
|
-
def inslot_fields
|
128
|
-
fields.select{|_, field| field.is_a?(InputSlotField) }
|
129
|
-
end
|
130
|
-
|
131
|
-
def inslot_field?(field_name)
|
132
|
-
fields[field_name].is_a?(InputSlotField)
|
133
|
-
end
|
134
|
-
end
|
135
|
-
|
136
|
-
class SlotField < Gorillib::Model::Field
|
137
|
-
self.visibilities = visibilities.merge(:reader => true, :writer => false, :tester => false)
|
138
|
-
field :basename, Symbol
|
139
|
-
field :stage_type, Whatever, :doc => 'type for stages this slot accepts'
|
140
|
-
class_attribute :slot_type
|
141
|
-
|
142
|
-
def initialize(model, basename, type, options={})
|
143
|
-
name = "#{basename}_slot"
|
144
|
-
options[:stage_type] = type
|
145
|
-
slot_type = self.slot_type
|
146
|
-
options[:basename] = basename
|
147
|
-
options[:default] = ->{ slot_type.new(:name => basename, :stage => self) }
|
148
|
-
super(model, name, slot_type, options)
|
149
|
-
end
|
150
|
-
end
|
151
|
-
|
152
|
-
class InputSlotField < SlotField
|
153
|
-
self.slot_type = Hanuman::InputSlot
|
154
|
-
def inscribe_methods(model)
|
155
|
-
model.__send__(:define_slot_reader, self)
|
156
|
-
model.__send__(:define_inslot_receiver, self)
|
157
|
-
super
|
158
|
-
end
|
159
|
-
end
|
160
|
-
|
161
|
-
class OutputSlotField < SlotField
|
162
|
-
self.slot_type = Hanuman::OutputSlot
|
163
|
-
def inscribe_methods(model)
|
164
|
-
model.__send__(:define_slot_reader, self)
|
165
|
-
model.__send__(:define_outslot_receiver, self)
|
166
|
-
super
|
167
|
-
end
|
168
|
-
end
|
169
|
-
|
170
|
-
end # Slottable
|
171
|
-
|
172
|
-
module SplatInputs
|
173
|
-
extend Gorillib::Concern
|
174
|
-
include Slottable
|
175
|
-
|
176
|
-
included do
|
177
|
-
collection :splat_inslots, Hanuman::InputSlot, :key_method => :name
|
178
|
-
end
|
179
|
-
|
180
|
-
def set_input(stage)
|
181
|
-
slot = Hanuman::InputSlot.new(:name => stage.name, :stage => self, :input => stage)
|
182
|
-
self.splat_inslots << slot
|
183
|
-
slot
|
184
|
-
end
|
185
|
-
|
186
|
-
def has_input?(slot_name)
|
187
|
-
self.splat_inslots.keys.include?(slot_name)
|
188
|
-
end
|
189
|
-
|
190
|
-
def inslots
|
191
|
-
super + splat_inslots.to_a
|
192
|
-
end
|
193
|
-
end
|
194
|
-
|
195
|
-
module SplatOutputs
|
196
|
-
extend Gorillib::Concern
|
197
|
-
include Slottable
|
198
|
-
|
199
|
-
included do
|
200
|
-
collection :splat_outslots, Hanuman::OutputSlot, :key_method => :name
|
201
|
-
end
|
202
|
-
|
203
|
-
def set_output(stage)
|
204
|
-
slot = Hanuman::OutputSlot.new(
|
205
|
-
:name => stage.name, :stage => self, :output => stage)
|
206
|
-
self.outslots << slot
|
207
|
-
slot
|
208
|
-
end
|
209
|
-
|
210
|
-
def outputs
|
211
|
-
outslots.to_a.map{|slot| slot.output }
|
212
|
-
end
|
213
|
-
|
214
|
-
def into(*others)
|
215
|
-
others.each{|other| super(other)}
|
216
|
-
self
|
217
|
-
end
|
218
|
-
end
|
219
|
-
|
220
|
-
end
|
data/lib/wukong/bad_record.rb
DELETED
@@ -1,15 +0,0 @@
|
|
1
|
-
class BadRecord
|
2
|
-
include Gorillib::Model
|
3
|
-
field :contents, Whatever, :doc => "The faulty contents; will be truncated at 1000 characters"
|
4
|
-
field :error, Exception, :doc => "Error (optional)"
|
5
|
-
|
6
|
-
def receive_contents(contents)
|
7
|
-
super contents.to_s[0..1000]
|
8
|
-
end
|
9
|
-
|
10
|
-
def make(contents, error=nil)
|
11
|
-
hsh = { :contents => contents }
|
12
|
-
hsh[:error] = error if error
|
13
|
-
receive(hsh)
|
14
|
-
end
|
15
|
-
end
|
data/lib/wukong/event.rb
DELETED
@@ -1,44 +0,0 @@
|
|
1
|
-
module Wukong
|
2
|
-
class EventMetadata
|
3
|
-
include Gorillib::Model
|
4
|
-
|
5
|
-
field :timestamp, Time, :doc => "time the event originated, assigned by the origin (as anything they like) and unchanged afterwards. A UTC ruby time, serialized as a unix timestamp. Corresponds to Flume's `time` metadata"
|
6
|
-
field :origin, String, :doc => "name for the source of this record; in flume, the dispatching `host`. This influences delivery guarantees. A downcased, dasherized, dot-separated identifier."
|
7
|
-
field :nano_ctr, Bignum, :doc => "nanosecond timestamp, monotonically-increasing within each origin. The `[origin, nano_ctr]` pair may be considered globally unique. Serialized as whatever flume uses."
|
8
|
-
|
9
|
-
field :topic, Symbol, :doc => "Topic this event belongs to"
|
10
|
-
|
11
|
-
def event_id
|
12
|
-
[origin, nano_ctr].join('!')
|
13
|
-
end
|
14
|
-
|
15
|
-
end
|
16
|
-
|
17
|
-
module Event
|
18
|
-
extend Gorillib::Concern
|
19
|
-
include Gorillib::Model
|
20
|
-
|
21
|
-
def _metadata
|
22
|
-
@_metadata ||= {}
|
23
|
-
end
|
24
|
-
|
25
|
-
def _metadata= m
|
26
|
-
@_metadata = m
|
27
|
-
end
|
28
|
-
|
29
|
-
def to_wire options={}
|
30
|
-
super(options).merge(:_metadata => self._metadata)
|
31
|
-
end
|
32
|
-
end
|
33
|
-
|
34
|
-
end
|
35
|
-
|
36
|
-
#
|
37
|
-
# Example Usage
|
38
|
-
#
|
39
|
-
# def process(blob)
|
40
|
-
# record = JSON.parse(blob)
|
41
|
-
# metadata = blob._metadata
|
42
|
-
# { :_id => metadata.event_id, :time => metadata.timestamp, :type => metadata.topic, :data => record }
|
43
|
-
# # ... now do stuff
|
44
|
-
# end
|
data/lib/wukong/local_runner.rb
DELETED
@@ -1,55 +0,0 @@
|
|
1
|
-
module Wukong
|
2
|
-
class Runner
|
3
|
-
include Gorillib::FancyBuilder
|
4
|
-
member :flow, Wukong::Dataflow
|
5
|
-
|
6
|
-
def run(slot_name)
|
7
|
-
wire_flow
|
8
|
-
flow.setup
|
9
|
-
drive_flow(slot_name)
|
10
|
-
flow.stop
|
11
|
-
end
|
12
|
-
|
13
|
-
def self.run(flow, slot_name)
|
14
|
-
runner = self.receive(:flow => flow)
|
15
|
-
runner.run(slot_name)
|
16
|
-
end
|
17
|
-
|
18
|
-
def validate!
|
19
|
-
raise StandardError, "flow is missing for #{self}" unless flow.present?
|
20
|
-
end
|
21
|
-
|
22
|
-
protected
|
23
|
-
|
24
|
-
# Connect sources, sinks, flows and so forth. On return, the topology of the graph should be in place.
|
25
|
-
# Override in your subclass
|
26
|
-
#
|
27
|
-
# @abstract
|
28
|
-
def wire_flow
|
29
|
-
end
|
30
|
-
|
31
|
-
# Launch the flow -- sources be each'ing, processors be process'n
|
32
|
-
# Override in your subclass
|
33
|
-
#
|
34
|
-
# @abstract
|
35
|
-
def drive_flow
|
36
|
-
puts flow
|
37
|
-
end
|
38
|
-
end
|
39
|
-
|
40
|
-
# Run dataflow in pure ruby
|
41
|
-
class LocalRunner < Runner
|
42
|
-
|
43
|
-
protected
|
44
|
-
|
45
|
-
def drive_flow(slot_name)
|
46
|
-
validate!
|
47
|
-
flow.drive(slot_name)
|
48
|
-
end
|
49
|
-
|
50
|
-
def wire_flow
|
51
|
-
# flow.set_output sink(:test_sink)
|
52
|
-
# flow.set_output sinks.to_a.last
|
53
|
-
end
|
54
|
-
end
|
55
|
-
end
|
data/lib/wukong/mapred.rb
DELETED
data/lib/wukong/universe.rb
DELETED
@@ -1,48 +0,0 @@
|
|
1
|
-
module Wukong
|
2
|
-
|
3
|
-
#
|
4
|
-
# Holds graphs, supplies `processor` and similar stage template methods
|
5
|
-
#
|
6
|
-
module Universe
|
7
|
-
def find_or_create_class(superklass, klass_name, namespace, &block)
|
8
|
-
klass_name = Gorillib::Inflector.camelize(klass_name.to_s).to_sym
|
9
|
-
if namespace.const_defined?(klass_name)
|
10
|
-
namespace.const_get(klass_name)
|
11
|
-
else
|
12
|
-
namespace.send(:const_set, klass_name, Class.new(superklass, &block))
|
13
|
-
end
|
14
|
-
end
|
15
|
-
|
16
|
-
def processor(processor_name, &block)
|
17
|
-
klass = find_or_create_class(Wukong::Processor, processor_name, Wukong::Widget) do
|
18
|
-
register_processor(processor_name)
|
19
|
-
end
|
20
|
-
klass.class_eval(&block) if block_given?
|
21
|
-
klass
|
22
|
-
end
|
23
|
-
|
24
|
-
def dataflow(name, attrs={}, &block)
|
25
|
-
attrs[:name] = name = name.to_sym
|
26
|
-
dataflow = @dataflows[name] ||= Dataflow.new(:name => name)
|
27
|
-
dataflow.receive!(attrs, &block)
|
28
|
-
dataflow
|
29
|
-
end
|
30
|
-
|
31
|
-
def workflow(name, attrs={}, &block)
|
32
|
-
attrs[:name] = name = name.to_sym
|
33
|
-
workflow = @workflows[name] ||= Workflow.new(:name => name)
|
34
|
-
workflow.receive!(attrs, &block)
|
35
|
-
workflow
|
36
|
-
end
|
37
|
-
|
38
|
-
def self.extended(base)
|
39
|
-
base.instance_eval do
|
40
|
-
@dataflows = Hash.new
|
41
|
-
@workflows = Hash.new
|
42
|
-
end
|
43
|
-
end
|
44
|
-
end
|
45
|
-
|
46
|
-
# Wukong can serve as a universe
|
47
|
-
extend Universe
|
48
|
-
end
|
data/lib/wukong/widget/filter.rb
DELETED
@@ -1,81 +0,0 @@
|
|
1
|
-
module Wukong
|
2
|
-
module Widget
|
3
|
-
|
4
|
-
class Filter < Wukong::Processor
|
5
|
-
def process(*args) emit(*args) if select?(*args) ; end
|
6
|
-
def reject?(*args) not select?(*args) ; end
|
7
|
-
end
|
8
|
-
|
9
|
-
class Rejecter < Filter
|
10
|
-
def process(*args) emit(*args) if not reject?(*args) ; end
|
11
|
-
def select?(*args) not reject?(*args) ; end
|
12
|
-
def reject?(*args) true ; end
|
13
|
-
end
|
14
|
-
|
15
|
-
class All < Filter
|
16
|
-
def select?(*args) ; true ; end
|
17
|
-
end
|
18
|
-
|
19
|
-
class None < Rejecter
|
20
|
-
def reject?(*args) ; true ; end
|
21
|
-
end
|
22
|
-
|
23
|
-
# Selects only records matching this regexp
|
24
|
-
class RegexpFilter < Filter
|
25
|
-
field :pattern, Regexp, :doc => 'strings matching this regular expression will be selected'
|
26
|
-
def select?(str)
|
27
|
-
pattern.match(str)
|
28
|
-
end
|
29
|
-
|
30
|
-
def self.make(workflow, pattern, attrs={}, &block)
|
31
|
-
super workflow, attrs.merge(:pattern => pattern), &block
|
32
|
-
end
|
33
|
-
register_processor(:re)
|
34
|
-
end
|
35
|
-
|
36
|
-
class RegexpRejecter < Rejecter
|
37
|
-
field :pattern, Regexp, :doc => 'strings matching this regular expression will be rejected'
|
38
|
-
def reject?(str)
|
39
|
-
pattern.match(str)
|
40
|
-
end
|
41
|
-
|
42
|
-
def self.make(workflow, pattern, attrs={}, &block)
|
43
|
-
super workflow, attrs.merge(:pattern => pattern), &block
|
44
|
-
end
|
45
|
-
register_processor(:not_re)
|
46
|
-
end
|
47
|
-
|
48
|
-
class ProcFilter < Filter
|
49
|
-
# @param [Proc] proc use for body of `reject?` method
|
50
|
-
# @yield ...or supply a block directly
|
51
|
-
def initialize(prc=nil, &block)
|
52
|
-
prc ||= block or raise "Please supply a proc or a block to #{self.class}.new"
|
53
|
-
define_singleton_method(:select?, prc)
|
54
|
-
end
|
55
|
-
end
|
56
|
-
|
57
|
-
class ProcRejecter < Rejecter
|
58
|
-
# @param [Proc] proc use for body of `reject?` method
|
59
|
-
# @yield ...or supply a block directly
|
60
|
-
def initialize(prc=nil, &block)
|
61
|
-
prc ||= block or raise "Please supply a proc or a block to #{self.class}.new"
|
62
|
-
define_singleton_method(:reject?, prc)
|
63
|
-
end
|
64
|
-
end
|
65
|
-
|
66
|
-
class Limit < Rejecter
|
67
|
-
# include CountingProcessor
|
68
|
-
field :max_records, Integer, :doc => 'maximum records to allow', :writer => true
|
69
|
-
|
70
|
-
def reject?(*)
|
71
|
-
count >= max_records
|
72
|
-
end
|
73
|
-
|
74
|
-
def self.make(workflow, max, attrs={}, &block)
|
75
|
-
super workflow, attrs.merge(:max_records => max), &block
|
76
|
-
end
|
77
|
-
register_processor
|
78
|
-
end
|
79
|
-
|
80
|
-
end
|
81
|
-
end
|