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 CHANGED
@@ -1,15 +1,15 @@
1
1
  ---
2
2
  !binary "U0hBMQ==":
3
3
  metadata.gz: !binary |-
4
- M2ZkNTM0ODU4M2I4M2YxNjQzYmIwY2U5MDQ4YTk4YzlkMTVkNWJhMg==
4
+ ZDEwYWYzMTUyNGU4ZmZjYmIwYzZhNDdiYzg3N2VmYmRmZDMyMjUzNA==
5
5
  data.tar.gz: !binary |-
6
- YTBhMTZiODM5MGUzM2U2OTFiNWViNzA1ZGJhYjFkMjc3NTg0NzZmZA==
6
+ YjMwYTg3NjNjNjlmOWJmMzE1ZjMwNzZjMTY5NDRlNzk4OWMxMzZiYg==
7
7
  SHA512:
8
8
  metadata.gz: !binary |-
9
- MzZiNmE3ZDFjNDc3OTAwNmZjMzY5ZTEyOTA5MjIwNzI2ODg4MWMxYTViYzQ4
10
- YzBiZWMwNjhjNjYwODAxNDhmOGZlNTI5NzkxODJkZGRmODRhODE3MDgxNmZk
11
- ZDUxYTE3NWNjNjM0NWVlMDA2Zjg4ZDI5ZWI2ZGI1MzczNzdhYWE=
9
+ ZjA2OTIwZTFiNDUxZWE0OTc0N2IyZTM4ZDc4NzQwZjUzM2ExZTEwYzA1NGQ2
10
+ MTA5MDg5NDRhYmE0YzI1ZmE0M2I3ZTBiMWRkMTdhODBkYWJmOTE4NjdjYmU0
11
+ N2JhOGEzOTUxZTEzZjgwM2VjYzE2ZDk1NDM1NDlhMGU0NTgyNDA=
12
12
  data.tar.gz: !binary |-
13
- ZDVhZWYyOTYyZDk1ZTE4ZmIxNTQwZDI3MjFmYjllNjljM2RiMjM0NWE4Y2Ey
14
- YzI3ZWJjMzQ2MjlhZGE5NzZkZDAyNGQ3YzU2YjEzNzYyODIzMmU0MjZhYzNh
15
- NWZkYTc5Y2EwZmNkMGI4ZjA3MjdiOGFlZTRkMjZlMmI1NGMyMzA=
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
- # HIGH_LEVEL_DESCRIPTION
2
+ # TAGLINE
3
3
  # The each block can be thought of as a map operation that runs across multiple machines.
4
- # The rows of the web_pages dataset are distributed across our system and processed.
5
- # The result of the each is another stream object that will contain the emitted rows.
6
- # The input argument tuple contains a single row, that can be accessed like a hash object.
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
- # name "name" # the name of the operation
21
- # emits "stream_1", "stream_2" # optional for single output stream
22
- # output_format :replace # :replace or :merge, optional, defaults to :replace
23
- # prepare |=block=| # optional if no initialization needed
24
- # execute |=block=|
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
- # - The allowed output formats are :replace and :merge.
28
- # * :replace - discards the input tuple values and only emits the specified values. This is the default.
29
- # * :merge - re-emits the input tuple values along with the specified values.
30
- # - The "prepare" and "execute" blocks can be in do...end format or {} format.
31
- # * the "prepare" block is where any setup is done to prepare for tuple processing in the "execute" block.
32
- # * the "execute" block is where the tuples are actually processed. It must take in a single argument (the "tuple").
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
- # The filter is a conditional each. Conditional expressions can be used to determine if a
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
- # Simplified syntax:
9
+ # # Simplified syntax:
8
10
  # stream.filter do |tuple|
9
11
  # |=block=|
10
12
  # end
11
- # - The condition for keeping the tuple should be specified in the block.
12
- # - This is equivalent to just specifying a "keep" block below.
13
- # Custom filter:
13
+ #
14
+ # # Extended Syntax
14
15
  # stream.filter do
15
- # name "name" \t\t\t => optional
16
- # emits "stream_1", "stream_2", ... \t\t => optional for single output stream
17
- # prepare |=block=| \t\t\t\t => optional if no initialization needed
18
- # keep |=block=|
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` function can be used to implement aggregate computations
4
- # such as counting and summing. The following is a full example of a
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
- # stream.group_by do
9
- # name "name" \t\t\t\t\t => optional
10
- # group_by "field_1", "field_2", ...
11
- # emits "stream_1", "stream_2", ... \t\t => optional for single output stream
12
- # begin_group |=block=|
13
- # aggregate |=block=|
14
- # end_group |=block=|
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
- # - The "begin_group", "aggregate" and "end_group" blocks can be in do...end format or {} format.
17
- # * the "begin_group" block is 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").
18
- # * the "aggregate" block is where the aggregation is performed. It must take in a single argument (the "tuple").
19
- # * the "end_group" block is where the final aggregated value is emitted.
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. Here is an example of a `join` in Zillabyte.
7
+ # fields.
7
8
  # LANGUAGE_SYNTAX
8
9
  # lhs_stream.join_with( rhs_stream_object, options )
9
- # - Options should be specified as a hash. The following keys are recognized:
10
- # Mandatory:
11
- # * "on" -- specifies the fields to join on. The value must be a STRING or a length-2 ARRAY.
12
- # If value = a STRING, the LH and RH join fields will both be set to this STRING.
13
- # 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].
14
- # Optional:
15
- # * "type" -- specifies the join type. The default is :left. Options are [:inner, :outer, :left, :right]
16
- # * "emits" -- specifies the stream to emit. A "join" may only emit a single stream.
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
- # HIGH_LEVEL_DESCRIPTION
2
+ # TAGLINE
3
3
  # The `sink` is a passive operation that defines the schema of the rows that need to be saved.
4
- # Of all the operations where a stream is consumed, only the `sink` requires a schema to be defined.
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
- # name "name_of_relation"
9
- # column "field_1", :type_1
10
- # column "field_2", :type_2 ...
9
+ # name "name_of_relation"
10
+ # column "field_1", :type_1
11
+ # column "field_2", :type_2 ...
11
12
  # end
12
- # - "Sink" relation "name" must be specified as a non-empty STRING with only alphanumeric and underscore characters!
13
- # - Field names must be non-empty STRINGS with only alphanumeric or underscore characters.
14
- # - Field names cannot be "v[number]", "id", "confidence", "since" or "source" which are reserved Zillabyte names.
15
- # - Field types must be SYMBOLS. The following types are allowed [:string, :integer, :float, :double, :boolean, :array, :map]
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
- # HIGH_LEVEL_DESCRIPTION
3
- # A `source` is where the data for your app originates and is defined
4
- # on the app object. The easiest way to stream data into a Zillabyte
5
- # app is to use a Zillabyte dataset. A simple `source` takes in the
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
- # A `source` can also use data outside of the public datasets Zillabyte
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
- # `source` and include the code needed to generate the `source` data
12
- # in the `next_tuple` block. The expanded syntax also allows for
13
- # additional customizations such as providing a `name` for the `source`
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 `begin_cycle` block.
16
- #
21
+ # values in the begin_cycle block.
22
+ #
17
23
  # LANGUAGE_SYNTAX
18
- #
19
- # Sourcing from a dataset:
20
- # app.source("dataset_name")
21
- # Custom source:
22
- # app.source do
23
- # name "name" \t\t\t\t\t => optional
24
- # emits "stream_1", "stream_2", ... \t\t => optional for single output stream
25
- # end_cycle_policy :null_emit OR :explicit \t => default :null_emit
26
- # begin_cycle |=block=| \t\t\t\t => optional if no initialization needed
27
- # next_tuple |=block=|
28
- # end
29
- # - The "end_cycle_policy" is used to specify when a cycle should end. Two options are available:
30
- # * :null_emit - end the cycle when a field contains "nil" or when nothing is emitted from the "next_tuple" block.
31
- # * :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?.
32
- # - The "begin_cycle" and "next_tuple" blocks can be in do...end format or {} format.
33
- # * the "begin_cycle" block is where any setup is done to initialize the content and quantity of tuples emitted by the "next_tuple" block.
34
- # * the "next_tuple" block is where the tuples are actually emitted.
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
@@ -1,3 +1,3 @@
1
1
  module Zillabyte
2
- VERSION = "0.9.30" unless defined?(VERSION)
2
+ VERSION = "0.9.31" unless defined?(VERSION)
3
3
  end
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.30
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-14 00:00:00.000000000 Z
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.30
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.30
40
+ version: 0.9.31
41
41
  description: The Official Zillabyte Gem
42
42
  email:
43
43
  - gem@zillabyte.com