zillabyte 0.9.30 → 0.9.31

Sign up to get free protection for your applications and to get access to all the features.
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