cloud_powers 0.2.7 → 0.2.7.1

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.
@@ -17,16 +17,19 @@ module Smash
17
17
 
18
18
  # Attempts to create a Context out of the argument(s) you've
19
19
  # passed.
20
- # === @params args <Hash|JSON|Array|enumerable list>
21
- # - exp Hash:
22
- # `{ task: 'demo', queue: [:backlog, :sned], pipe: :status_stream }`
23
- # each key is a module or class that is in CloudPowers and each value
24
- # is either an array of configurations information or a single configuration.
25
- # - exp Array
26
- # `[:task, 'demo', :queue, :backlog, :sned, :pipe, :status_stream]`
27
- # each key is followed by 0..n valid configurations information
28
- # === @returns
29
- # `Smash::Context`
20
+ #
21
+ # Parameters
22
+ # * args +Hash+|+JSON+|+Array+|+enumerable list+
23
+ # * * expample +Hash+:
24
+ # * * * each key is a module or class that is in CloudPowers and each value
25
+ # is either an array of configurations information or a single configuration.
26
+ # { task: 'demo', queue: [:backlog, :sned], pipe: :status_stream }
27
+ # * * expample Array
28
+ # * * * each key is followed by 0..n valid configurations information
29
+ # [:task, 'demo', :queue, :backlog, :sned, :pipe, :status_stream]
30
+ #
31
+ # Returns
32
+ # +Smash::Context+
30
33
  def initialize(args)
31
34
  unless valid_args?(args)
32
35
  raise ArgumentError.new 'Can be either a Hash, JSON, or an Enumerable ' +
@@ -36,8 +39,12 @@ module Smash
36
39
  @structure = decipher(args)
37
40
  end
38
41
 
39
- # # Decipher figures out which translation method to use by making some simple
40
- # # type checks, etc. and then routing the args to the correct method.
42
+ # Decipher figures out which translation method to use by making some simple type checks, etc.
43
+ # and then routing the args to the correct method.
44
+ #
45
+ # Notes
46
+ # * See +#translate_json()+
47
+ # * See +#translate_list()+
41
48
  def decipher(args)
42
49
  case args
43
50
  when Hash
@@ -50,33 +57,61 @@ module Smash
50
57
  end
51
58
 
52
59
  # Creates a flat Array of the 2-D Array that gets returned from `#simplify()`
53
- # === @returns <Array>
60
+ #
61
+ # Returns +Array+
62
+ #
63
+ # Example
64
+ # example_context.structure
65
+ # # => { task: 'demo', queue: [:backlog, :sned], pipe: [:status_stream] }
66
+ # example.flatten
67
+ # # => [:task, 'demo', :queue, :backlog, :sned, :pipe, :status_stream]
68
+ #
69
+ # Notes
70
+ # * See +#simplify()
71
+ # * See +#Array::flatten()+
54
72
  def flatten
55
73
  simplify.flatten
56
74
  end
57
75
 
58
76
  # Create an array version of @sructure by calling `#to_a()` on it
59
- # === @returns Array<Array..n>
60
- # TODO: Check if this has a limit to n-layers
77
+ #
78
+ # Returns
79
+ # <tt>Array[Array..n]</tt>
80
+ #
81
+ # Example
82
+ # example_context.structure
83
+ # # => { task: 'demo', queue: [:backlog, :sned], pipe: [:status_stream] }
84
+ # example.simplify
85
+ # # => [:task, 'demo', :queue, [:backlog, :sned], :pipe, [:status_stream]]
86
+ #
87
+ # Notes
88
+ # * This uses the different Constants, like Smash, Synapse and anything it can find
89
+ # to decide what should be used as a key and what its following values array should
90
+ # contain. It basically says:
91
+ # 1. if the nth item is a known key (from the above search), add it as an object in the Array.
92
+ # 2. else, add it to the last sub-Array
93
+ # 3. move to n+1 in the +structure Hash+
94
+ # * TODO: Check if this has a limit to n-layers
61
95
  def simplify
62
96
  @structure.to_a
63
97
  end
64
98
 
65
99
  # A Hash that represents the resources and some configuration for them
66
- # === @returns Hash
100
+ #
101
+ # Returns +Hash+
67
102
  def structure
68
103
  modify_keys_with(@structure) { |key| key.to_sym }
69
104
  end
70
105
 
71
106
  # Valid scheme for @structure is assured by running the arguments through
72
- # the decipher method, which is how @structure is set in `#new(args)`
107
+ # the decipher method, which is how @structure is set in +#new(args)+
73
108
  def structure=(args)
74
109
  @structure = decipher(args)
75
110
  end
76
111
 
77
112
  # Parse the given JSON
78
- # === @param: json_string <String::Json>
79
- # === @returns <Hash>
113
+ # Parameters: json_string <String::Json>
114
+ # Returns <Hash>
80
115
  def translate_json(json_string)
81
116
  begin
82
117
  JSON.parse(json_string)
@@ -124,19 +159,19 @@ module Smash
124
159
  # ...
125
160
  # }
126
161
  # ```
127
- # === @returns Hash
162
+ # Returns Hash
128
163
  # If `#valid_package_hash?()` is called on this Hash, it will return true
129
164
  def translate_list(list)
130
165
  list.first.kind_of?(Enumerable) ? translate_simplified(list) : translate_flattened(list)
131
166
  end
132
167
 
133
168
  # Translates an Array into a valid @structure Hash
134
- # === @param arr <Array>
169
+ # Parameters arr <Array>
135
170
  # e.g.
136
171
  # ```Ruby
137
172
  # [:task, 'demo', :queue, 'name1', {other config hash},...,:pipe, 'name1']
138
173
  # ```
139
- # === @returns Hash
174
+ # Returns Hash
140
175
  # calling `#valid_hash_format?()` on returned Hash will return true
141
176
  def translate_flattened(list)
142
177
  arr = list.to_a
@@ -155,7 +190,7 @@ module Smash
155
190
  end
156
191
 
157
192
  # Translates a 2D Array into a valid @structure Hash
158
- # === @param arr <Array>
193
+ # Parameters arr <Array>
159
194
  # e.g.
160
195
  # ```
161
196
  # [
@@ -169,7 +204,7 @@ module Smash
169
204
  # - First object of each inner-Array is the key
170
205
  # - All following values in that inner Array are separate configuration
171
206
  # information pieces that can be used in the `#create!()` method for that particular resource
172
- # === @returns Hash
207
+ # Returns Hash
173
208
  # well formatted for the @structure
174
209
  def translate_simplified(arr)
175
210
  arr.inject({}) do |hash, key_config_map|
@@ -181,7 +216,7 @@ module Smash
181
216
  end
182
217
 
183
218
  # Uses `#to_json()` on the @structure
184
- # === @returns Hash
219
+ # Returns Hash
185
220
  def to_json
186
221
  structure.to_json
187
222
  end
@@ -190,8 +225,8 @@ module Smash
190
225
  # class _should_ exist in. It can be a vanilla version, where the @structure
191
226
  # is a Hash, structured correctly or it can be serialized into JSON or it can
192
227
  # be an Array
193
- # === @params: args String
194
- # === @returns: Boolean
228
+ # Parameters args String
229
+ # Returns Boolean
195
230
  def valid_args?(args)
196
231
  case args
197
232
  when Hash
@@ -208,16 +243,16 @@ module Smash
208
243
  # Makes sure that the list is enumerable and that at least the first term
209
244
  # is a resource name from Smash::CloudPowers. All other objects can
210
245
  # potentially be configurations.
211
- # @param list <Array|Enumerable>
212
- # @returns Boolean
246
+ # Parameters list <Array|Enumerable>
247
+ # Returns Boolean
213
248
  def valid_array_format?(list)
214
249
  use = list.first.kind_of?(Enumerable) ? list.first.first : list.first
215
250
  ((list.kind_of? Enumerable) && (available_resources.include?(to_pascal(use).to_sym)))
216
251
  end
217
252
 
218
253
  # Makes sure that each key is the name of something CloudPowers can interact with
219
- # @param hash <Hash>
220
- # @returns Boolean
254
+ # Parameters hash <Hash>
255
+ # Returns Boolean
221
256
  def valid_hash_format?(hash)
222
257
  keys_arr = hash.keys.map { |key| to_pascal(key).to_sym }
223
258
  (keys_arr - available_resources).empty?
@@ -10,16 +10,19 @@ module Smash
10
10
 
11
11
  # Sets an Array of instance variables, individually to a value that a
12
12
  # user given block returns.
13
- # === @params Array
14
- # * each object will be used as the name for the instance variable that
13
+ #
14
+ # Parameters
15
+ #
16
+ # * keys +Array+
17
+ # * * each object will be used as the name for the instance variable that
15
18
  # your block returns
16
- # === @&block (optional)
17
- # * this is called for each object in the Array and is used as the value
19
+ # +block+ (optional)
20
+ # * this block is called for each object in the Array and is used as the value
18
21
  # for the instance variable that is being named and created for each key
19
- # === @return Array
22
+ # Returns Array
20
23
  # * each object will either be the result of `#instance_variable_set(key, value)`
21
24
  # or instance_variable_get(key)
22
- # === Sampel use:
25
+ # Example
23
26
  # keys = ['foo', 'bar', 'yo']
24
27
  #
25
28
  # attr_map!(keys) { |key| sleep 1; "#{key}:#{Time.now.to_i}" }
@@ -37,7 +40,7 @@ module Smash
37
40
 
38
41
  # This is a way to find out if you are trying to work with a resource
39
42
  # available to CloudPowers
40
- # === @returns <Array>
43
+ # Returns <Array>
41
44
  # * Use `.constants` to find all the modules and classes available.
42
45
  # Notes:
43
46
  # TODO: make this smartly pick up all the objects, within reason and
@@ -64,17 +67,17 @@ module Smash
64
67
 
65
68
  # Allows you to modify all keys, including nested, with a block that you pass.
66
69
  # If no block is passed, a copy is returned.
67
- # === @params
70
+ # Parameters
68
71
  # * params Hash|Array
69
72
  # === @&block (optional)
70
73
  # * should modify the key and return that value so it can be used in the copy
71
- # === @returns
74
+ # Returns
72
75
  # * a copy of the given Array or Hash, with all Hash keys modified
73
76
  # === Sample use:
74
77
  # hash = { 'foo' => 'v1', 'bar' => { fleep: { 'florp' => 'yo' } } }
75
78
  # modify_keys_with(hash) { |key| key.to_sym }
76
79
  # # => { foo: 'v1', bar: { fleep: { florp: 'yo' } } }
77
- # === Notes:
80
+ # Notes:
78
81
  # * see `#modify_keys_with()` for handling first-level keys
79
82
  # * see `#pass_the_buck()` for the way nested structures are handled
80
83
  # * case for different types taken from _MultiXML_ (multi_xml.rb)
@@ -117,29 +120,29 @@ module Smash
117
120
  end
118
121
 
119
122
  # Gets the path from the environment and sets @log_file using the path
120
- # @returns @log_file path <String>
123
+ # Returns @log_file path <String>
121
124
  def log_file
122
125
  @log_file ||= zfind('LOG_FILE')
123
126
  end
124
127
 
125
- # === @returns: An instance of Logger, cached as @logger
128
+ # Returns An instance of Logger, cached as @logger
126
129
  def logger
127
130
  @logger ||= create_logger
128
131
  end
129
132
 
130
133
  # Allows you to modify all first-level keys with a block that you pass.
131
134
  # If no block is passed, a copy is returned.
132
- # === @params
135
+ # Parameters
133
136
  # * params Hash|Array
134
137
  # === @&block (optional)
135
138
  # * should modify the key and return that value so it can be used in the copy
136
- # === @returns
139
+ # Returns
137
140
  # * a copy of the given Array or Hash, with all Hash keys modified
138
141
  # === Sample use:
139
142
  # hash = { 'foo' => 'v1', 'bar' => { fleep: { 'florp' => 'yo' } } }
140
143
  # modify_keys_with(hash) { |k| k.to_sym }
141
144
  # # => { :foo => 'v1', :bar => { fleep: { 'florp' => 'yo' } } }
142
- # === Notes:
145
+ # Notes:
143
146
  # * see `#deep_modify_keys_with()` for handling nested keys
144
147
  # * case for different types taken from _MultiXML_ (multi_xml.rb)
145
148
  def modify_keys_with(params)
@@ -155,7 +158,7 @@ module Smash
155
158
  # until another bit of logic does what it's supposed to, kind of like
156
159
  # continuing to poll something and doing something when a package is ready
157
160
  # to be taken and processed.
158
- # === @params:
161
+ # Parameters
159
162
  # * [allowed_attempts] or Infinity(default) <Number>: The number of times
160
163
  # the loop should be allowed to...well, loop, before a failed retry occurs.
161
164
  # * &test <Block>: A predicate method or block of code that is callable
@@ -175,9 +178,9 @@ module Smash
175
178
  end
176
179
 
177
180
  # Gives the path from the project root to lib/tasks[/#{file}.rb]
178
- # === @params:
181
+ # Parameters
179
182
  # * [file] <String>: name of a file
180
- # === @returns:
183
+ # Returns
181
184
  # * path[/file] <String>
182
185
  # * If a `file` is given, it will have a '.rb' file extension
183
186
  # * If no `file` is given, it will return the `#task_require_path`
@@ -187,7 +190,7 @@ module Smash
187
190
  end
188
191
 
189
192
  # Gives the path from the project root to lib/tasks[/file]
190
- # === @params String (optional)
193
+ # Parameters String (optional)
191
194
  # * file_name name of a file
192
195
  # === @returns:
193
196
  # * path[/file] String
@@ -198,8 +201,8 @@ module Smash
198
201
  end
199
202
 
200
203
  # Change strings into camelCase
201
- # === @params var String
202
- # === @returns String
204
+ # Parameters var String
205
+ # Returns String
203
206
  # * givenString
204
207
  def to_camel(var)
205
208
  var = var.to_s unless var.kind_of? String
@@ -209,8 +212,8 @@ module Smash
209
212
  end
210
213
 
211
214
  # Change strings hyphen-delimited-string
212
- # === @params var String
213
- # === @returns String
215
+ # Parameters var String
216
+ # Returns String
214
217
  # * given-string
215
218
  def to_hyph(var)
216
219
  var = var.to_s unless var.kind_of? String
@@ -225,8 +228,8 @@ module Smash
225
228
  end
226
229
 
227
230
  # Change strings into snake_case and add '@' at the front
228
- # === @params var String
229
- # === @returns String
231
+ # Parameters var String
232
+ # Returns String
230
233
  # * @given_string
231
234
  def to_i_var(var)
232
235
  var = var.to_s unless var.kind_of? String
@@ -234,8 +237,8 @@ module Smash
234
237
  end
235
238
 
236
239
  # Change strings into PascalCase
237
- # === @params var String
238
- # === @returns String
240
+ # Parameters var String
241
+ # Returns String
239
242
  # * givenString
240
243
  def to_pascal(var)
241
244
  var = var.to_s unless var.kind_of? String
@@ -243,8 +246,8 @@ module Smash
243
246
  end
244
247
 
245
248
  # Change strings into a ruby_file_name with extension
246
- # === @params var String
247
- # === @returns String
249
+ # Parameters var String
250
+ # Returns String
248
251
  # * given_string.rb
249
252
  # * includes ruby file extension
250
253
  # * see #to_snake()
@@ -253,8 +256,8 @@ module Smash
253
256
  end
254
257
 
255
258
  # Change strings into snake_case
256
- # === @params var String
257
- # === @returns String
259
+ # Parameters var String
260
+ # Returns String
258
261
  # * given_string
259
262
  # * will not have file extensions
260
263
  # * see #to_ruby_file_name()
@@ -271,9 +274,9 @@ module Smash
271
274
 
272
275
  # This method provides a default overrideable message body for things like
273
276
  # basic status updates.
274
- # === @params Hash
277
+ # Parameters Hash
275
278
  # - instanceId:
276
- # === Notes:
279
+ # Notes:
277
280
  # - camel casing is used on the keys because most other languages prefer
278
281
  # that and it's not a huge problem in ruby. Besides, there's some other
279
282
  # handy methods in this module to get you through those issues, like
@@ -11,7 +11,7 @@ module Smash
11
11
  include Smash::CloudPowers::SelfAwareness
12
12
  include Smash::CloudPowers::Zenv
13
13
  # These are sensible defaults that can be overriden by providing a Hash as a param.
14
- # @params [opts <Hash>]
14
+ # Parameters [opts <Hash>]
15
15
  # the opts Hash should have values that should be used instead of the given
16
16
  # configuration.
17
17
  def node_config(opts = {})
@@ -36,7 +36,7 @@ module Smash
36
36
  # configuration for the #run_instances method by using the opts hash that was
37
37
  # provided as a parameter.
38
38
  #
39
- # === @params opts Hash (optional)
39
+ # Parameters opts Hash (optional)
40
40
  # an optional instance configuration hash can be passed, which will override
41
41
  # the values in the default configuration returned by #instance_config()
42
42
  def spin_up_neurons(opts = {})
@@ -17,7 +17,7 @@ module Smash
17
17
 
18
18
  # Gets the instance time or the time it was called and as seconds from
19
19
  # epoch
20
- # === @returns Integer
20
+ # Returns Integer
21
21
  # TODO: use time codes
22
22
  def boot_time
23
23
  begin
@@ -68,16 +68,18 @@ module Smash
68
68
  end
69
69
 
70
70
  # Assures there is always a valid instance id because many other Aws calls require it
71
- # === @returns: String
71
+ # Returns String
72
72
  def instance_id
73
73
  @instance_id ||= metadata_request('instance_id')
74
74
  end
75
75
 
76
76
  # Gets and sets the public hostname of the instance
77
- # === @returns String
78
- # === Notes:
79
- # * When this is being called from somewhere other than an Aws instance, a hardcoded example URL is returned
80
- # because of the way instance metadata is retrieved
77
+ # Returns
78
+ # +String+
79
+ # Notes
80
+ # When this is being called from somewhere other than an Aws instance,
81
+ # a hardcoded example URL is returned
82
+ # because of the way instance metadata is retrieved
81
83
  def instance_url
82
84
  @instance_url ||= unless zfind('TESTING')
83
85
  hostname_uri = 'http://169.254.169.254/latest/meta-data/public-hostname'
@@ -90,8 +92,13 @@ module Smash
90
92
  # Makes the http request to self/meta-data to get all the metadata keys or,
91
93
  # if a key is given, the method makes the http request to get that
92
94
  # particular key from the metadata
93
- # === @param: key String (optional)
94
- # === @returns:
95
+ #
96
+ # Parameters
97
+ # * <tt>key</tt> - +String+ (optional)
98
+ #
99
+ # === Returns
100
+ # * +Array+ if key is blank
101
+ # * +String+ if key is given
95
102
  def metadata_request(key = '')
96
103
  key = to_hyph(key)
97
104
  begin
@@ -110,7 +117,7 @@ module Smash
110
117
  end
111
118
 
112
119
  # Return the time since boot_time
113
- # === @returns: Integer
120
+ # Returns Integer
114
121
  # Notes:
115
122
  # * TODO: refactor to use valid time stamps for better tracking.
116
123
  # * reason -> separate regions or OSs etc.
@@ -131,9 +138,9 @@ module Smash
131
138
  end
132
139
 
133
140
  # Get the instance status.
134
- # === @params: id String (optional)
141
+ # Parameters id String (optional)
135
142
  # * if no id is given, self-instance ID is returned
136
- # === @returns: String
143
+ # Returns String
137
144
  def status(id = @instance_id)
138
145
  begin
139
146
  ec2.describe_instances(dry_run: zfind('TESTING'), instance_ids: [id]).
@@ -11,11 +11,17 @@ module Smash
11
11
  include Smash::CloudPowers::Zenv
12
12
 
13
13
  # Prefers the given arn but it can make a best guess if none is given
14
+ #
15
+ # Returns
16
+ # arn +String+ - arn for this resource
14
17
  def arn
15
18
  set_arn || "arn:aws:sns:#{zfind(:region)}:#{zfind(:accound_number)}:#{set_name}"
16
19
  end
17
20
 
18
21
  # Prefers the given name but it can parse the arn to find one
22
+ #
23
+ # Returns
24
+ # name +String+ - name for this resource
19
25
  def name
20
26
  set_name || set_arn.split(':').last
21
27
  end
@@ -23,26 +29,38 @@ module Smash
23
29
  #################
24
30
 
25
31
  # Creates a connection point for 1..N nodes to create a connection with the Broadcast
26
- # def create_distributor(channel)
27
- # sns.create_application_platform()
28
- # end
32
+ #
33
+ # Parameters
34
+ # * channel +String+
35
+ #
36
+ # Notes
37
+ # This method is not implemented yet (V 0.2.7)
38
+ def create_distributor(channel)
39
+ sns.create_application_platform()
40
+ end
29
41
 
30
42
  # Creates a point to connect to for information about a given topic
31
- # === @params: name String: the name of the Channel/Topic to be created
32
- # === @returns: Broadcast::Channel representing the created channel
43
+ #
44
+ # Parameters
45
+ # * name +String+ - the name of the Channel/Topic to be created
46
+ #
47
+ # Returns
48
+ # +Broadcast::Channel+ - representing the created channel
33
49
  def create_channel!(name)
34
50
  resp = sns.create_topic(name: name)
35
51
  Channel.new(nil, resp.topic_arn)
36
52
  end
37
53
 
38
54
  # Deletes a topic from SNS-land
39
- # === @params: channel <Broadcast::Channel>
55
+ #
56
+ # Parameters
57
+ # * channel <Broadcast::Channel>
40
58
  def delete_channel!(channel)
41
59
  sns.delete_topic(topic_arn: channel.arn)
42
60
  end
43
61
 
44
62
  # Creates a connection to the Broadcast so that new messages will be picked up
45
- # === @params: channel <Broadcast::Channel>
63
+ # Parameters channel <Broadcast::Channel>
46
64
  def listen_on(channel)
47
65
  sns.subscribe(
48
66
  topic_arn: channel.arn,
@@ -52,7 +70,7 @@ module Smash
52
70
  end
53
71
 
54
72
  # Lists the created topics in SNS.
55
- # === @returns results <Array
73
+ # Returns results <Array
56
74
  def real_channels
57
75
  results = []
58
76
  next_token = ''
@@ -66,7 +84,7 @@ module Smash
66
84
  end
67
85
 
68
86
  # Send a message to a Channel using SNS#publish
69
- # === @params: [opts <Hash>]:
87
+ # Parameters [opts <Hash>]:
70
88
  # this includes all the keys AWS uses but for now it only has defaults
71
89
  # for topic_arn and the message
72
90
  def send_broadcast(opts = {})