zillabyte 0.9.30 → 0.9.31
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.
- checksums.yaml +8 -8
- data/ruby/lib/zillabyte/harness/component_input.rb +34 -0
- data/ruby/lib/zillabyte/harness/component_output.rb +25 -0
- data/ruby/lib/zillabyte/harness/each.rb +26 -23
- data/ruby/lib/zillabyte/harness/filter.rb +21 -14
- data/ruby/lib/zillabyte/harness/group_by.rb +17 -16
- data/ruby/lib/zillabyte/harness/injected_component.rb +61 -0
- data/ruby/lib/zillabyte/harness/join.rb +12 -10
- data/ruby/lib/zillabyte/harness/sink.rb +15 -9
- data/ruby/lib/zillabyte/harness/source.rb +36 -27
- data/ruby/lib/zillabyte/version.rb +1 -1
- metadata +4 -4
checksums.yaml
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
---
|
2
2
|
!binary "U0hBMQ==":
|
3
3
|
metadata.gz: !binary |-
|
4
|
-
|
4
|
+
ZDEwYWYzMTUyNGU4ZmZjYmIwYzZhNDdiYzg3N2VmYmRmZDMyMjUzNA==
|
5
5
|
data.tar.gz: !binary |-
|
6
|
-
|
6
|
+
YjMwYTg3NjNjNjlmOWJmMzE1ZjMwNzZjMTY5NDRlNzk4OWMxMzZiYg==
|
7
7
|
SHA512:
|
8
8
|
metadata.gz: !binary |-
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
ZjA2OTIwZTFiNDUxZWE0OTc0N2IyZTM4ZDc4NzQwZjUzM2ExZTEwYzA1NGQ2
|
10
|
+
MTA5MDg5NDRhYmE0YzI1ZmE0M2I3ZTBiMWRkMTdhODBkYWJmOTE4NjdjYmU0
|
11
|
+
N2JhOGEzOTUxZTEzZjgwM2VjYzE2ZDk1NDM1NDlhMGU0NTgyNDA=
|
12
12
|
data.tar.gz: !binary |-
|
13
|
-
|
14
|
-
|
15
|
-
|
13
|
+
MDNiM2RjMzE4ZjY1ZWQ5MmY1OTQ2YjAzMDJmNDM3MDI3MjQzMWExZGQ4MTMx
|
14
|
+
NzZhOWMzOGM3ZWQwMzZkMmFmZmViMmQzM2MxZjI5NjlhZDkzNDNiZGIxYTlj
|
15
|
+
NGIwMGY2ZjI3Y2Y5N2M3ZWM2OTE4YjllMTlmNmEwYzQ5MWQ2NTA=
|
@@ -1,3 +1,37 @@
|
|
1
|
+
# OPERATION Component Input
|
2
|
+
# TAGLINE
|
3
|
+
# Declare the input of a component
|
4
|
+
# HIGH_LEVEL_DESCRIPTION
|
5
|
+
# Components work by declaring a “schema” of their inputs and outputs.
|
6
|
+
# The inputs are the expected fields they will look for within incoming tuples.
|
7
|
+
# In an example case, our component declares an input stream named “urls”, and will look for the “url” field of any incoming tuples.
|
8
|
+
#
|
9
|
+
# LANGUAGE_SYNTAX
|
10
|
+
# component.inputs do
|
11
|
+
# name "input_stream_name"
|
12
|
+
# field "field_1", :type_1
|
13
|
+
# field "field_2", :type_2
|
14
|
+
# end
|
15
|
+
#
|
16
|
+
# SYNTAX_NOTES
|
17
|
+
# "Inputs" stream "name" must be specified as a non-empty STRING with only alphanumeric and underscore characters!
|
18
|
+
#
|
19
|
+
# Field names must be non-empty STRINGS with only alphanumeric or underscore characters.
|
20
|
+
#
|
21
|
+
# Field names cannot be "v[number]", "id", "confidence", "since" or "source" which are reserved Zillabyte names.
|
22
|
+
#
|
23
|
+
# Field types must be SYMBOLS. The following types are allowed :string, :integer, :float, :double, :boolean, :array and :map.
|
24
|
+
#
|
25
|
+
# EXAMPLE
|
26
|
+
# require 'zillabyte'
|
27
|
+
#
|
28
|
+
# comp = Zillabyte.component("ruby_component")
|
29
|
+
#
|
30
|
+
# # We declare the input to contain a "word" field
|
31
|
+
# stream = comp.inputs do
|
32
|
+
# name "word_stream"
|
33
|
+
# field "word", :string
|
34
|
+
# end
|
1
35
|
class Zillabyte::Harness::ComponentInput
|
2
36
|
attr_accessor :_app, :_node
|
3
37
|
|
@@ -1,3 +1,28 @@
|
|
1
|
+
# OPERATION Component Output
|
2
|
+
# TAGLINE
|
3
|
+
# Declare the output of a component
|
4
|
+
# HIGH_LEVEL_DESCRIPTION
|
5
|
+
# In a similar manner to component inputs, we declare the component output schema for the component.
|
6
|
+
# This determines the output of the component for other Zillabyte functions to expect. This is just like a sink in apps.
|
7
|
+
# LANGUAGE_SYNTAX
|
8
|
+
# component_stream.outputs do
|
9
|
+
# name "output_stream_name"
|
10
|
+
# field "field_1", :type_1
|
11
|
+
# field "field_2", :type_2
|
12
|
+
# end
|
13
|
+
# SYNTAX_NOTES
|
14
|
+
# "Outputs" stream "name" must be specified as a non-empty STRING with only alphanumeric and underscore characters!
|
15
|
+
#
|
16
|
+
# Field names must be non-empty STRINGS with only alphanumeric or underscore characters.
|
17
|
+
#
|
18
|
+
# Field names cannot be "v[number]", "id", "confidence", "since" or "source" which are reserved Zillabyte names.
|
19
|
+
#
|
20
|
+
# Field types must be SYMBOLS. The following types are allowed :string, :integer, :float, :double, :boolean, :array and :map.
|
21
|
+
# EXAMPLE
|
22
|
+
# stream.outputs do
|
23
|
+
# name "plural"
|
24
|
+
# field "word", :string
|
25
|
+
# end
|
1
26
|
class Zillabyte::Harness::ComponentOutput
|
2
27
|
attr_accessor :_app, :_node
|
3
28
|
|
@@ -1,45 +1,48 @@
|
|
1
1
|
# OPERATION Each
|
2
|
-
#
|
2
|
+
# TAGLINE
|
3
3
|
# The each block can be thought of as a map operation that runs across multiple machines.
|
4
|
-
#
|
5
|
-
# The
|
6
|
-
#
|
7
|
-
#
|
4
|
+
# HIGH_LEVEL_DESCRIPTION
|
5
|
+
# The `each` operation is the simplest operation within Zillabyte. It is analogous to the inner
|
6
|
+
# block of a conventional "for" loop which is used to apply the same set of manipulations to
|
7
|
+
# each record. Similarly, Zillabyte applies the same code logic specified in the each to each
|
8
|
+
# tuple the operation receives.
|
8
9
|
#
|
9
10
|
# LANGUAGE_SYNTAX
|
10
|
-
# Simplified syntax:
|
11
|
+
# # Simplified syntax:
|
11
12
|
#
|
12
13
|
# stream.each do |tuple|
|
13
14
|
# |=block=|
|
14
15
|
# end
|
15
|
-
# - This is equivalent to just specifying an \"execute\" block below.
|
16
|
-
# - Note that this syntax only works for a single output stream.
|
17
16
|
#
|
18
|
-
# Custom each:
|
17
|
+
# # Custom each:
|
19
18
|
# stream.each do
|
20
|
-
#
|
21
|
-
#
|
22
|
-
#
|
23
|
-
#
|
24
|
-
#
|
19
|
+
# name "name" # the name of the operation
|
20
|
+
# emits "stream_1", "stream_2" # optional for single output stream
|
21
|
+
# output_format :replace # :replace or :merge, optional, defaults to :replace
|
22
|
+
# prepare |=block=| # optional if no initialization needed
|
23
|
+
# execute |=block=|
|
25
24
|
# end
|
26
25
|
#
|
27
|
-
#
|
28
|
-
#
|
29
|
-
#
|
30
|
-
#
|
31
|
-
#
|
32
|
-
#
|
26
|
+
# SYNTAX_NOTES
|
27
|
+
# The simplified syntax can be used if a prepare block and other customizations are not needed.
|
28
|
+
#
|
29
|
+
# * **Note:** this syntax only works for a single output stream.
|
30
|
+
#
|
31
|
+
# The allowed output formats are :replace and :merge.
|
32
|
+
# * **:replace** : discards the input tuple values and only emits the specified values. This is the default.
|
33
|
+
# * **:merge** : re-emits the input tuple values along with the specified values.
|
33
34
|
#
|
35
|
+
# The "prepare" and "execute" blocks can be in do...end format or {} format.
|
36
|
+
# * **"prepare"** block : where any setup is done to prepare for tuple processing in the "execute" block.
|
37
|
+
# * **"execute"** block : where the tuples are actually processed. It must take in a single argument (the "tuple").
|
38
|
+
#
|
34
39
|
# EXAMPLE
|
35
40
|
#
|
36
41
|
# # This is a simple example which emits the url of a tuple
|
37
42
|
# s = s.each do |tuple|
|
38
43
|
# emit :url => tuple["url"]
|
39
44
|
# end
|
40
|
-
#
|
41
|
-
#
|
42
|
-
#
|
45
|
+
#
|
43
46
|
# # Eaches can also be used for conditional emitting
|
44
47
|
# stream = result_stream.each{ |tuple|
|
45
48
|
#
|
@@ -1,32 +1,39 @@
|
|
1
1
|
# OPERATION Filter
|
2
|
+
# TAGLINE
|
3
|
+
# The filter is a conditional each.
|
2
4
|
# HIGH_LEVEL_DESCRIPTION
|
3
|
-
#
|
5
|
+
# Conditional expressions can be used to determine if a
|
4
6
|
# tuple received by the operation is emitted.
|
5
7
|
#
|
6
8
|
# LANGUAGE_SYNTAX
|
7
|
-
#
|
9
|
+
# # Simplified syntax:
|
8
10
|
# stream.filter do |tuple|
|
9
11
|
# |=block=|
|
10
12
|
# end
|
11
|
-
#
|
12
|
-
#
|
13
|
-
# Custom filter:
|
13
|
+
#
|
14
|
+
# # Extended Syntax
|
14
15
|
# stream.filter do
|
15
|
-
#
|
16
|
-
#
|
17
|
-
#
|
18
|
-
#
|
16
|
+
# name "name" # optional
|
17
|
+
# emits "stream_1", "stream_2", ... # optional for single output stream
|
18
|
+
# prepare |=block=| # optional if no initialization needed
|
19
|
+
# keep |=block=|
|
19
20
|
# end
|
20
|
-
# - The "prepare" and "keep" blocks can be in do...end format or {} format.
|
21
|
-
# * the "prepare" block is where any setup is done to prepare for tuple processing in the "keep" block.
|
22
|
-
# * tuples will pass through the filter if "keep" returns "True". It must take in a single argument (the "tuple").
|
23
21
|
#
|
22
|
+
# SYNTAX_NOTES
|
23
|
+
# The simplified syntax can be used if a prepare block and other customizations are not needed.
|
24
|
+
#
|
25
|
+
# * **Note:** this syntax only works for a single output stream.
|
26
|
+
#
|
27
|
+
# The "prepare" and "keep" blocks can be in do...end format or {} format.
|
28
|
+
# * **"prepare"** block : where any setup is done to prepare for tuple processing in the "keep" block.
|
29
|
+
# * **"keep"** block : tuples pass through the filter if "keep" returns "True". It must take in a single argument (the "tuple").
|
30
|
+
#
|
24
31
|
# EXAMPLE
|
25
32
|
# # Filter for simple string inclusion
|
26
33
|
# stream = stream.filter { |tuple| tuple["url"].include? "hello world" }
|
27
|
-
#
|
34
|
+
#
|
28
35
|
# # Custom Filter
|
29
|
-
# stream = stream.filter do
|
36
|
+
# stream = stream.filter do
|
30
37
|
# name "hello_world_filter"
|
31
38
|
# emits "hello_stream"
|
32
39
|
# keep do |tuple|
|
@@ -1,26 +1,27 @@
|
|
1
1
|
# OPERATION Group By
|
2
|
+
# Group tuples by keys
|
2
3
|
# HIGH_LEVEL_DESCRIPTION
|
3
|
-
# The `group_by`
|
4
|
-
# such as counting and summing.
|
5
|
-
# word count operation in Zillabyte.
|
6
|
-
#
|
4
|
+
# The `group_by` operation can be used to implement aggregation-type functions
|
5
|
+
# such as counting and summing.
|
7
6
|
# LANGUAGE_SYNTAX
|
8
|
-
#
|
9
|
-
#
|
10
|
-
#
|
11
|
-
#
|
12
|
-
#
|
13
|
-
#
|
14
|
-
#
|
7
|
+
# stream.group_by do
|
8
|
+
# name "name" # optional
|
9
|
+
# group_by "field_1", "field_2", ...
|
10
|
+
# emits "stream_1", "stream_2", ... # optional for single output stream
|
11
|
+
# begin_group |=block=|
|
12
|
+
# aggregate |=block=|
|
13
|
+
# end_group |=block=|
|
15
14
|
# end
|
16
|
-
#
|
17
|
-
#
|
18
|
-
#
|
19
|
-
#
|
15
|
+
# SYNTAX_NOTES
|
16
|
+
#
|
17
|
+
# The "begin_group", "aggregate" and "end_group" blocks can be in do...end format or {} format.
|
18
|
+
# * **"begin_group"** block : where the initial values for the aggregation are set. It must take in a single argument (the "grouping tuple", which is emitted at the beginning of each group and contains the values of the fields specified in "group_by").
|
19
|
+
# * **"aggregate"** block : where the aggregation is performed. It must take in a single argument (the "tuple").
|
20
|
+
# * **"end_group"** block : where the final aggregated value is emitted.
|
20
21
|
# EXAMPLE
|
21
22
|
# # Declare the group_by, grouping on the :word field
|
22
23
|
# stream = stream.group_by(:word) do
|
23
|
-
#
|
24
|
+
#
|
24
25
|
# # Save the word being grouped, initialize any state
|
25
26
|
# begin_group do |g_tuple|
|
26
27
|
# @word = g_tuple[:word]
|
@@ -1,3 +1,64 @@
|
|
1
|
+
# OPERATION Call Component
|
2
|
+
# TAGLINE
|
3
|
+
# Call a component
|
4
|
+
# HIGH_LEVEL_DESCRIPTION
|
5
|
+
# Components can be embedded into other components or even applications.
|
6
|
+
# When running an application that has an embedded component, that component is
|
7
|
+
# joined into the same execution environment as its parent, allowing for high throughput component execution.
|
8
|
+
# To embed a component, use the "call_component" operation
|
9
|
+
# LANGUAGE_SYNTAX
|
10
|
+
# stream.call_component do
|
11
|
+
# component_id "component_id"
|
12
|
+
# name "name" # optional
|
13
|
+
# additional_inputs other_input_stream_object_1, ... # blank if none
|
14
|
+
# outputs "output_stream_name_1", ...
|
15
|
+
# output_format :replace OR :merge # optional, defaults to :replace
|
16
|
+
# end
|
17
|
+
# SYNTAX_NOTES
|
18
|
+
# The "component_id" MUST be given and correspond to the name or id listed in the output of "zillabyte components".
|
19
|
+
#
|
20
|
+
# The allowed output formats are :replace and :merge. Note that only linear components, i.e. those with only "each" and "filter" operations support :merge.
|
21
|
+
# * **:replace** : discards the input tuple values and only emits the output values. This is the default.
|
22
|
+
# * **:merge** : re-emits the input tuple values along with the output values.
|
23
|
+
#
|
24
|
+
# To correctly stich in the component, the implicit assumptions below WILL BE USED:
|
25
|
+
# * The "stream" that "call_component" is invoked on MUST correspond to the first listed input stream to the component.
|
26
|
+
# * The streams specified in "additional_inputs" MUST correspond to the other listed input streams in order.
|
27
|
+
# * Tuples emitted from the preceeding operation MUST contain the fields listed for the corresponding component input streams.
|
28
|
+
# * The streams specified in "outputs" must correspond to the listed output streams to the component in order.
|
29
|
+
# * The number of input and output streams specified must match the number listed for the component.
|
30
|
+
#
|
31
|
+
# EXAMPLE
|
32
|
+
# require 'zillabyte'
|
33
|
+
# app = Zillabyte.app("plural_app")
|
34
|
+
#
|
35
|
+
# stream = app.source do
|
36
|
+
#
|
37
|
+
# DICTIONARY = %w(apple butterfly bus) unless defined? DICTIONARY
|
38
|
+
# end_cycle_policy :explicit
|
39
|
+
#
|
40
|
+
# begin_cycle do
|
41
|
+
# @count = 0
|
42
|
+
# end
|
43
|
+
#
|
44
|
+
# next_tuple do
|
45
|
+
# emit "word" => DICTIONARY.sample
|
46
|
+
# @count += 1
|
47
|
+
# end_cycle if @count == 5
|
48
|
+
# end
|
49
|
+
#
|
50
|
+
# end
|
51
|
+
#
|
52
|
+
# # Here we call the "pluralize" component
|
53
|
+
# stream = stream.call_component do
|
54
|
+
# component_id "pluralize"
|
55
|
+
# outputs "pluralized_words"
|
56
|
+
# end
|
57
|
+
#
|
58
|
+
# stream.sink do
|
59
|
+
# name "plural_words"
|
60
|
+
# column "word", :string
|
61
|
+
# end
|
1
62
|
class Zillabyte::Harness::InjectedComponent
|
2
63
|
attr_accessor :_app, :_node, :_id, :_input_stream_1, :_options
|
3
64
|
|
@@ -1,19 +1,22 @@
|
|
1
1
|
# OPERATION Join
|
2
|
+
# Join streams together
|
2
3
|
# HIGH_LEVEL_DESCRIPTION
|
3
4
|
# Joins allow you to combine two streams into one in a manner similar
|
4
5
|
# to traditional relational systems. Realtime tuple data from a variety
|
5
6
|
# of sources can be combined into a single stream via joins on specified
|
6
|
-
# fields.
|
7
|
+
# fields.
|
7
8
|
# LANGUAGE_SYNTAX
|
8
9
|
# lhs_stream.join_with( rhs_stream_object, options )
|
9
|
-
#
|
10
|
-
#
|
11
|
-
#
|
12
|
-
#
|
13
|
-
#
|
14
|
-
#
|
15
|
-
#
|
16
|
-
#
|
10
|
+
# SYNTAX_NOTES
|
11
|
+
# Options should be specified as a hash. The following keys are recognized:
|
12
|
+
#
|
13
|
+
# Mandatory:
|
14
|
+
#
|
15
|
+
# * **"on"** : specifies the fields to join on. The value must be a STRING or a length-2 ARRAY. If value = a STRING, the LH and RH join fields will both be set to this STRING. If value = a length-2 ARRAY, the LH join field will be set to array[0] and the RH join field will be set to array[1].
|
16
|
+
#
|
17
|
+
# Optional:
|
18
|
+
# * **"type"** : specifies the join type. The default is :left. Options are [:inner, :outer, :left, :right]
|
19
|
+
# * **"emits"** : specifies the stream to emit. A "join" may only emit a single stream.
|
17
20
|
# EXAMPLE
|
18
21
|
#
|
19
22
|
# # Left join on a shared field, in this case, an :owner_id
|
@@ -25,7 +28,6 @@
|
|
25
28
|
# :on => [:average, :number],
|
26
29
|
# :type => :inner
|
27
30
|
# )
|
28
|
-
#
|
29
31
|
class Zillabyte::Harness::Join
|
30
32
|
attr_accessor :_app, :_node, :_args
|
31
33
|
|
@@ -1,18 +1,24 @@
|
|
1
1
|
# OPERATION Sink
|
2
|
-
#
|
2
|
+
# TAGLINE
|
3
3
|
# The `sink` is a passive operation that defines the schema of the rows that need to be saved.
|
4
|
-
#
|
4
|
+
# HIGH_LEVEL_DESCRIPTION
|
5
|
+
# The `sink` marks the end of a stream. It saves the data it receives according to the schema defined within it.
|
5
6
|
#
|
6
7
|
# LANGUAGE_SYNTAX
|
7
8
|
# stream.sink do
|
8
|
-
#
|
9
|
-
#
|
10
|
-
#
|
9
|
+
# name "name_of_relation"
|
10
|
+
# column "field_1", :type_1
|
11
|
+
# column "field_2", :type_2 ...
|
11
12
|
# end
|
12
|
-
#
|
13
|
-
#
|
14
|
-
#
|
15
|
-
#
|
13
|
+
#
|
14
|
+
# SYNTAX_NOTES
|
15
|
+
# "Sink" relation "name" must be specified as a non-empty STRING with only alphanumeric and underscore characters!
|
16
|
+
#
|
17
|
+
# Field names must be non-empty STRINGS with only alphanumeric or underscore characters.
|
18
|
+
#
|
19
|
+
# Field names cannot be "v[number]", "id", "confidence", "since" or "source" which are reserved Zillabyte names.
|
20
|
+
#
|
21
|
+
# Field types must be SYMBOLS. The following types are allowed :string, :integer, :float, :double, :boolean, :array and :map.
|
16
22
|
#
|
17
23
|
# EXAMPLE
|
18
24
|
# stream.sink{
|
@@ -1,37 +1,46 @@
|
|
1
1
|
# OPERATION Source
|
2
|
-
#
|
3
|
-
# A
|
4
|
-
# on the app object.
|
5
|
-
#
|
2
|
+
# TAGLINE
|
3
|
+
# A source is where the data for your app originates and is defined
|
4
|
+
# on the app object.
|
5
|
+
#
|
6
|
+
# HIGH_LEVEL_DESCRIPTION
|
7
|
+
#
|
8
|
+
# ## Sourcing From Datasets
|
9
|
+
# The easiest way to stream data into a Zillabyte
|
10
|
+
# app is to use a Zillabyte dataset. A simple source takes in the
|
6
11
|
# name of a dataset and produces a stream object.
|
7
12
|
#
|
8
|
-
#
|
13
|
+
# ## Custom Sources
|
14
|
+
# A source can also use data outside of the public datasets Zillabyte
|
9
15
|
# provides. Any external data available on the web can be streamed
|
10
16
|
# into a Zillabyte app. To do so, we use the expanded syntax of a
|
11
|
-
#
|
12
|
-
# in the
|
13
|
-
# additional customizations such as providing a
|
17
|
+
# source and include the code needed to generate the source data
|
18
|
+
# in the next_tuple block. The expanded syntax also allows for
|
19
|
+
# additional customizations such as providing a name for the source
|
14
20
|
# and specifying any preparatory steps such as initializing global
|
15
|
-
# values in the
|
16
|
-
#
|
21
|
+
# values in the begin_cycle block.
|
22
|
+
#
|
17
23
|
# LANGUAGE_SYNTAX
|
18
|
-
#
|
19
|
-
#
|
20
|
-
#
|
21
|
-
#
|
22
|
-
#
|
23
|
-
#
|
24
|
-
#
|
25
|
-
#
|
26
|
-
#
|
27
|
-
#
|
28
|
-
#
|
29
|
-
#
|
30
|
-
#
|
31
|
-
#
|
32
|
-
#
|
33
|
-
#
|
34
|
-
#
|
24
|
+
# #Sourcing from a dataset:
|
25
|
+
# app.source("dataset_name") # fetch a dataset from Zillabyte
|
26
|
+
#
|
27
|
+
# #Custom source:
|
28
|
+
# app.source do
|
29
|
+
# name "name" # optional
|
30
|
+
# emits "stream_1", "stream_2" # optional for single output stream
|
31
|
+
# end_cycle_policy :null_emit OR :explicit # default :null_emit
|
32
|
+
# begin_cycle |=block=| # optional if no initialization needed
|
33
|
+
# next_tuple |=block=| # The code to execute on each tuple fetch
|
34
|
+
# end
|
35
|
+
# SYNTAX_NOTES
|
36
|
+
#
|
37
|
+
# The "end_cycle_policy" is used to specify when a cycle should end. Two options are available:
|
38
|
+
# * **:null_emit** : end the cycle when a field contains "nil" or when nothing is emitted from the "next_tuple" block.
|
39
|
+
# * **:explicit** : the end of a cycle is explicitly declared in the "next_tuple" block. This is done by including the "end_cycle" keyword in the "next_tuple" block, e.g. end_cycle if @queue.nil?.
|
40
|
+
#
|
41
|
+
# The "begin_cycle" and "next_tuple" blocks can be in do...end format or {} format.
|
42
|
+
# * **"begin_cycle"** block : where any setup is done to initialize the content and quantity of tuples emitted by the "next_tuple" block.
|
43
|
+
# * **"next_tuple"** block : where the tuples are actually emitted.
|
35
44
|
# EXAMPLE
|
36
45
|
#
|
37
46
|
# # Source from the "homepages" relation
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: zillabyte
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.9.
|
4
|
+
version: 0.9.31
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- zillabyte
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-11-
|
11
|
+
date: 2014-11-15 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rake
|
@@ -30,14 +30,14 @@ dependencies:
|
|
30
30
|
requirements:
|
31
31
|
- - ~>
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: 0.9.
|
33
|
+
version: 0.9.31
|
34
34
|
type: :runtime
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
38
|
- - ~>
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version: 0.9.
|
40
|
+
version: 0.9.31
|
41
41
|
description: The Official Zillabyte Gem
|
42
42
|
email:
|
43
43
|
- gem@zillabyte.com
|