rightresource 0.2.8 → 0.2.9

Sign up to get free protection for your applications and to get access to all the features.
data/README.rdoc CHANGED
@@ -10,7 +10,4 @@ License:: The MIT License
10
10
  rest_client
11
11
  crack
12
12
 
13
- == install
14
- sudo gem install json rest-client crack
15
-
16
13
  == example
@@ -1,7 +1,10 @@
1
1
  class AlertSpec < RightResource::Base
2
2
  class << self
3
3
  def alert_specs_subject(id, params={})
4
- connection.post(element_path(id, :alert_specs_subject, params))
4
+ pair = URI.decode({:alert_specs_subject => params}.to_params).split('&').map {|l| l.split('=')}
5
+ h = Hash[*pair.flatten]
6
+ path = "alert_specs_subject"
7
+ action(:post, path, h)
5
8
  end
6
9
  end
7
10
  end
@@ -20,7 +20,7 @@ module RightResource
20
20
 
21
21
  # Set RESTFul client with login authentication for HTTP Methods(Low level)
22
22
  # === Examples
23
- # conn = Connection.new do |c|
23
+ # conn = RightResource::Connection.new do |c|
24
24
  # c.login(:username => "user", :password => "pass", :account => "1")
25
25
  # end
26
26
  # Deployment.connection = conn
@@ -83,6 +83,27 @@ module RightResource
83
83
  connection.resource_id || nil
84
84
  end
85
85
 
86
+ # RestFul Method
87
+ def action(method, path, params={})
88
+ case method
89
+ when :get
90
+ connection.get(path, params)
91
+ when :post
92
+ connection.post(path, params)
93
+ when :put
94
+ connection.put(path, params)
95
+ when :delete
96
+ connection.delete(path, params)
97
+ end
98
+ rescue RestClient::ResourceNotFound
99
+ nil
100
+ rescue => e
101
+ logger.error("#{e.class}: #{e.pretty_inspect}")
102
+ logger.debug {"Backtrace:\n#{e.backtrace.pretty_inspect}"}
103
+ ensure
104
+ logger.debug {"#{__FILE__} #{__LINE__}: #{self.class}\n#{self.pretty_inspect}\n"}
105
+ end
106
+
86
107
  # Get resources by index method
87
108
  # same resources support criteria like filtering.
88
109
  #
@@ -150,14 +171,30 @@ module RightResource
150
171
  end
151
172
 
152
173
  # Create new resource
153
- # Example:
174
+ # ==== Parameters
175
+ #
176
+ # * +params+ - see Examples
177
+ #
178
+ # === Examples
154
179
  # params = {
155
- # :nickname => "dev",
156
- # :deployment_href => "https://my.rightscale.com/api/acct/22329/deployments/59855",
157
- # :server_template_href => "https://my.rightscale.com/api/acct/22329/server_templates/76610",
158
- # :ec2_availability_zone => "ap-northeast-1a"
180
+ # :cloud_id => 4, # {1 = us-east; 2 = eu; 3 = us-west, 4 = ap}
181
+ # :ec2_image_href => "https://my.rightscale.com/api/acct/22329/multi_cloud_images/40840", # AMI image or MultiCloud image
182
+ # :nickname =>"dev703", # Instance rightscale nickname
183
+ # :instance_type => 'm1.xlarge',
184
+ # :assoicate_eip_at_launch => '0',
185
+ # :deployment_href => "https://my.rightscale.com/api/acct/22329/deployments/63387",
186
+ # :ec2_availability_zone=>"ap-southeast-1b", # (ex: 'us-east-1a', 'any')
187
+ # :ec2_ssh_key_href => "https://my.rightscale.com/api/acct/22329/ec2_ssh_keys/240662",
188
+ # :ec2_security_group =>
189
+ # ["https://my.rightscale.com/api/acct/22329/ec2_security_groups/170342",
190
+ # "https://my.rightscale.com/api/acct/22329/ec2_security_groups/170344",
191
+ # "https://my.rightscale.com/api/acct/22329/ec2_security_groups/170353"],
192
+ # :server_template_href => "https://my.rightscale.com/api/acct/22329/ec2_server_templates/82665" # rightscale servertemplate
159
193
  # }
160
- # Server.create(params)
194
+ # server_id = Server.create(params).id
195
+ # settings = Server.settings(server_id)
196
+ # p settings
197
+ #
161
198
  def create(params={})
162
199
  #TODO: refactor
163
200
  self.new(params).tap do |resource|
@@ -187,12 +224,12 @@ module RightResource
187
224
 
188
225
  # Get single resource
189
226
  def element_path(id, prefix_options = nil, query_options = nil)
190
- "#{resource_name}s/#{id}#{prefix(prefix_options)}.#{format.extension}#{query_string(query_options)}"
227
+ "#{resource_name}s/#{id}#{prefix(prefix_options)}#{query_string(query_options)}"
191
228
  end
192
229
 
193
230
  # Get resource collections
194
231
  def collection_path(prefix_options = nil, query_options = nil)
195
- "#{resource_name}s#{prefix(prefix_options)}.#{format.extension}#{query_string(query_options)}"
232
+ "#{resource_name}s#{prefix(prefix_options)}#{query_string(query_options)}"
196
233
  end
197
234
 
198
235
  # Get resource name(equals plural of classname)
@@ -233,7 +270,7 @@ module RightResource
233
270
  raise ArgumentError, "expected an Hash, String or Symbol, got #{options.pretty_inspect}"
234
271
  end
235
272
  end
236
- default
273
+ "#{default}.#{format.extension}"
237
274
  end
238
275
 
239
276
  # create querystring by crack to_params method
@@ -271,7 +308,7 @@ module RightResource
271
308
 
272
309
  def loads(attributes)
273
310
  raise ArgumentError, "expected an attributes Hash, got #{attributes.pretty_inspect}" unless attributes.is_a?(Hash)
274
- attributes.each_pair {|key,value| @attributes[key.to_s.gsub('-', '_').to_sym] = value}
311
+ @attributes = attributes.generate_attributes
275
312
  self
276
313
  end
277
314
 
@@ -316,18 +353,18 @@ module RightResource
316
353
  #TODO: refactor hard coding
317
354
  attrs = self.attributes.reject {|key,value| key.to_s == "cloud_id"}
318
355
  pair = URI.decode({resource_name.to_sym => attrs}.to_params).split('&').map {|l| l.split('=')}
319
- headers = Hash[*pair.flatten]
320
- headers["cloud_id"] = self.attributes[:cloud_id] if self.attributes.has_key?(:cloud_id)
321
- connection.put(element_path, headers)
356
+ h = Hash[*pair.flatten]
357
+ h["cloud_id"] = self.attributes[:cloud_id] if self.attributes.has_key?(:cloud_id)
358
+ connection.put(element_path, h)
322
359
  end
323
360
 
324
361
  def create
325
362
  #TODO: refactor hard coding
326
363
  attrs = self.attributes.reject {|key,value| key.to_s == "cloud_id"}
327
364
  pair = URI.decode({resource_name.to_sym => attrs}.to_params).split('&').map {|l| l.split('=')}
328
- headers = Hash[*pair.flatten]
329
- headers["cloud_id"] = self.attributes[:cloud_id] if self.attributes.has_key?(:cloud_id)
330
- connection.post(collection_path, headers)
365
+ h= Hash[*pair.flatten]
366
+ h["cloud_id"] = self.attributes[:cloud_id] if self.attributes.has_key?(:cloud_id)
367
+ connection.post(collection_path, h)
331
368
  self.id = self.class.resource_id
332
369
  end
333
370
 
@@ -0,0 +1,11 @@
1
+ class Hash
2
+ def generate_attributes
3
+ attrs = {}
4
+ self.each_pair {|key,value| attrs[key.to_s.gsub('-', '_').to_sym] = value}
5
+ if attrs
6
+ self.clear
7
+ self.merge!(attrs)
8
+ end
9
+ self
10
+ end
11
+ end
@@ -0,0 +1 @@
1
+ require 'right_resource/core_ext/hash/generate_attributes'
@@ -1,3 +1,3 @@
1
1
  if RUBY_VERSION < "1.9.0"
2
- require 'right_resource/core_ext/object/tap.rb'
2
+ require 'right_resource/core_ext/object/tap'
3
3
  end
@@ -1,15 +1,14 @@
1
+ # == Define methods
2
+ # deployment actions (start_all, stop_all, duplicate)
3
+ # ==== Parameters
4
+ # * +id+ - RightScale deployment resource id(https://my.rightscale.com/deployments/{id})
1
5
  class Deployment < RightResource::Base
2
6
  class << self
3
- def start_all(id)
4
- connection.post(element_path(id, :start_all))
5
- end
6
-
7
- def stop_all(id)
8
- connection.post(element_path(id, :stop_all))
9
- end
10
-
11
- def duplicate(id)
12
- connection.post(element_path(id, :duplicate))
7
+ [:start_all, :stop_all, :duplicate].each do |act_method|
8
+ define_method(act_method) do |id|
9
+ path = element_path(id, act_method).sub(/\.#{format.extension}$/, '')
10
+ action(:post, path)
11
+ end
13
12
  end
14
13
  end
15
14
  end
@@ -1,8 +1,16 @@
1
+ # == alias_method
2
+ # * _attach_to_server_ - component_ec2_ebs_volumes
1
3
  class Ec2EbsVolume < RightResource::Base
2
4
  class << self
3
- def attach_to_server
4
- name = "component_ec2_ebs_volumes"
5
- raise NotImplementedError
5
+ # Eb2Volume attach to server
6
+ # === Parameters
7
+ # * +params+ - Hash (keys = [:ec2_ebs_volume_href, :component_href, :device, :mount])
8
+ def component_ec2_ebs_volumes(params)
9
+ pair = URI.decode({:component_ec2_ebs_volume => elems}.to_params).split('&').map {|l| l.split('=')}
10
+ h = Hash[*pair.flatten]
11
+ path = "component_ec2_ebs_volumes"
12
+ action(:post, path, h)
6
13
  end
14
+ alias_method :attach_to_server, :component_ec2_ebs_volumes
7
15
  end
8
16
  end
@@ -1,11 +1,6 @@
1
1
  class Ec2ElasticIp < RightResource::Base
2
2
  class << self
3
- def update(id)
4
- raise NotImplementedError
5
- end
6
- end
7
-
8
- def update
9
- raise NotImplementedError
3
+ undef :update
10
4
  end
5
+ undef :update
11
6
  end
@@ -1,7 +1,5 @@
1
1
  class Ec2SshKey < RightResource::Base
2
2
  class << self
3
- def index(id)
4
- raise NotImplementedError
5
- end
3
+ undef :index
6
4
  end
7
5
  end
@@ -1,27 +1,6 @@
1
1
  class MultiCloudImage < RightResource::Base
2
2
  class << self
3
- def create
4
- raise NotImplementedError
5
- end
6
-
7
- def update(id)
8
- raise NotImplementedError
9
- end
10
-
11
- def destory(id)
12
- raise NotImplementedError
13
- end
14
- end
15
-
16
- def create
17
- raise NotImplementedError
18
- end
19
-
20
- def update(id)
21
- raise NotImplementedError
22
- end
23
-
24
- def destory(id)
25
- raise NotImplementedError
3
+ undef :create, :update, :destory
26
4
  end
5
+ undef :create, :update, :destory
27
6
  end
@@ -1,27 +1,6 @@
1
1
  class RightScript < RightResource::Base
2
2
  class << self
3
- def create
4
- raise NotImplementedError
5
- end
6
-
7
- def update(id)
8
- raise NotImplementedError
9
- end
10
-
11
- def destory(id)
12
- raise NotImplementedError
13
- end
14
- end
15
-
16
- def create
17
- raise NotImplementedError
18
- end
19
-
20
- def update(id)
21
- raise NotImplementedError
22
- end
23
-
24
- def destory(id)
25
- raise NotImplementedError
3
+ undef :create, :update, :destory
26
4
  end
5
+ undef :create, :update, :destory
27
6
  end
@@ -1,11 +1,6 @@
1
1
  class S3Bucket < RightResource::Base
2
2
  class << self
3
- def update(id)
4
- raise NotImplementedError
5
- end
6
- end
7
-
8
- def update
9
- raise NotImplementedError
3
+ undef :update
10
4
  end
5
+ undef :update
11
6
  end
@@ -1,48 +1,116 @@
1
+ # == define_methods 1
2
+ # Server Action
3
+ # * _start_
4
+ # * _stop_
5
+ # * _restart_
6
+ #
7
+ # === Parameters
8
+ # * _id_ - RightScale server resource id(https://my.rightscale.com/servers/{id})
9
+ # === Examples
10
+ # server_id = Server.index(:filter => "nickname=dev001").first.id
11
+ # Server.start(server_id)
12
+ #
13
+ # == define_methods 2
14
+ # Server and other resource action
15
+ # * _run_script_
16
+ # * _attach_volume_
17
+ # === Parameters
18
+ # * _id_ - RightScale server resource id(https://my.rightscale.com/servers/{id})
19
+ # * _params_ - Hash(ex. :right_script, :ec2_ebs_volume_href, :device)
20
+ # === Examples
21
+ # server_id = 1
22
+ # params = {:ec2_ebs_volume_href => "https://my.rightscale.com/api/acct/##/ec2_ebs_volumes/1", :device => "/dev/sdj"}
23
+ # Server.attach_volume(server_id, params) # => 204 No Content
1
24
  class Server < RightResource::Base
2
25
  class << self
3
- #TODO: refactor define_method or method_missing
4
- def action; end
5
- # server start(Starting created instance)
6
- # === Examples
7
- # server_id = Server.index(:filter => "nickname=dev001").first.id
8
- # Server.start(server_id)
9
- def start(id)
10
- connection.post(element_path(id, :start))
11
- end
12
-
13
- # server stop(Starting created instance)
14
- def stop(id)
15
- connection.post(element_path(id, :stop))
26
+ [:start, :stop, :reboot].each do |act_method|
27
+ define_method(act_method) do |id|
28
+ path = element_path(id, act_method).sub(/\.#{format.extension}$/, '')
29
+ action(:post, path)
30
+ end
16
31
  end
17
32
 
18
- # server restart(Starting created instance)
19
- def reboot(id)
20
- connection.post(element_path(id, :reboot))
33
+ [:run_script, :attach_volume].each do |act_method|
34
+ define_method(act_method) do |id,params|
35
+ elems = params.reject {|key,value| key == :right_script} # select server resource params
36
+ pair = URI.decode({resource_name.to_sym => elems}.to_params).split('&').map {|l| l.split('=')}
37
+ h = Hash[*pair.flatten]
38
+ h["right_script"] = params[:right_script] if params.has_key?(:right_script)
39
+ path = element_path(id, act_method)
40
+ action(:post, path, h)
41
+ end
21
42
  end
22
43
 
23
- # Run rightscript
24
- # location header is status href
25
- def run_script(id, params={})
26
- raise NotImplementedError
27
- end
28
-
29
- def attach_volume(id, params={})
30
- raise NotImplementedError
44
+ # Get sampleing data
45
+ # === Return
46
+ # Hash (keys # => [:cf, :start, :vars, :lag_time, :end, :data :avg_lag_time])
47
+ # === Examples
48
+ # server_id = 848422
49
+ # params = {:start => -180, :end => -20, :plugin_name => "cpu-0", :plugin_type => "cpu-idle"}
50
+ # Server.get_sketchy_data(server_id, params)
51
+ def get_sketchy_data(id, params)
52
+ path = element_path(id, :get_sketchy_data, params)
53
+ format.decode(action(:get, path)).generate_attributes
31
54
  end
32
55
 
33
- def get_sketchy_data(id, params={})
34
- raise NotImplementedError
56
+ # Get URL of Server monitoring graph
57
+ # === Examples
58
+ # * General Graph
59
+ # Server.monitoring(1)
60
+ #
61
+ # * Custumize Graph
62
+ # server_id = 1
63
+ # params = {:graph_name => "cpu-0/cpu-idle", :size => "small", :period => "day", :title => "MyCpuGraph", :tz => "JST"}
64
+ # Server.monitoring(server_id, params)
65
+ def monitoring(id, params={})
66
+ if params[:graph_name]
67
+ prefix_options = params[:graph_name]
68
+ params.delete(:graph_name)
69
+ path = element_path(id, :monitoring => prefix_options)
70
+ else
71
+ path = element_path(id, :monitoring)
72
+ end
73
+ format.decode(action(:get, path, params)).generate_attributes
35
74
  end
36
75
 
76
+ # Get Server settings(Subresource)
77
+ # === Examples
78
+ # server_id = Server.index(:filter => "nickname=dev-001").first.id
79
+ # settings = Server.settings(server_id)
37
80
  def settings(id)
38
81
  path = element_path(id, :settings)
39
- generate_attributes(format.decode(connection.get(path)))
82
+ format.decode(action(:get, path)).generate_attributes
83
+ end
84
+
85
+ # Get status of any running jobs after calling to the servers resource to run_script
86
+ # === Parameters
87
+ # * +resource_ref+ - Hash[:id] or Hash[:href](execute run_script method response location header)
88
+ # (ex. Location: https://my.rightscale.com/api/acct/##/statuses/{id})
89
+ # === Examples
90
+ # server_id = 1
91
+ # right_script_id = 1
92
+ # Server.run_script(server_id, :right_script => right_script_id)
93
+ # # => 201 Created, location: https://my.rightscale.com/api/acct/##/statuses/12345
94
+ #
95
+ # Server.statuses(:id => Server.resource_id) if Server.status == 201
96
+ # or
97
+ # Server.statuses(:href => Server.headers[:location]) if Server.status == 201
98
+ def statuses(resource_ref)
99
+ path = element_path(id, :get_sketchy_data, params)
100
+ format.decode(action(:get, path)).generate_attributes
40
101
  end
41
102
 
103
+ # Get Server tags(server or ec2_current_instance)
104
+ # === Parameters
105
+ # * +resource_href+ - server.href or server.ec2_current_href
106
+ # === Examples
107
+ # server = Server.show(1)
108
+ # tags = Server.tags(server.ec2_current_href)
109
+ # # => [{"name"=>"rs_login:state=active"}, {"name"=>"rs_logging:state=active"}, {"name"=>"rs_monitoring:state=active"}]
42
110
  def tags(resource_href)
43
- query_options = {'resource_href' => resource_href}
111
+ query_options = {:resource_href => resource_href}
44
112
  path = "tags/search.#{format.extension}#{query_string(query_options)}"
45
- Hash[*format.decode(connection.get(path)).collect {|tag|
113
+ Hash[*format.decode(action(:get, path)).collect {|tag|
46
114
  tag['name'].split('=')
47
115
  }.flatten]
48
116
  end
@@ -1,21 +1,42 @@
1
1
  class ServerArray < RightResource::Base
2
2
  class << self
3
+ # server array launch
4
+ # ==== Parameters
5
+ # * +id+ - RightScale server array resource id(https://my.rightscale.com/server_arrays/{id})
6
+ #
7
+ # === Examples
8
+ # array_id = 1
9
+ # ServerArray.launch(array_id)
3
10
  def launch(id)
4
- connection.post(element_path(id, :launch))
11
+ path = element_path(id, :launch)
12
+ action(:post, path)
5
13
  end
6
14
 
15
+ # server array terminate all
16
+ # === Examples
17
+ # ServerArray.terminate_all(1)
18
+ # # => {:ec2_instances=>{"failure"=>[],
19
+ # "success"=>[{"ec2_instance_href"=>"https://my.rightscale.com/api/acct/##/ec2_instances/1367"}]}}
7
20
  def terminate_all(id)
8
- connection.post(element_path(id, :terminate_all))
21
+ path = element_path(id, :terminate_all)
22
+ format.decode(action(:post, path)).generate_attributes
9
23
  end
10
24
 
11
- def run_script_on_all(id)
25
+ # Run script on all
26
+ # === Exception
27
+ # * +NotImplementedError+
28
+ def run_script_on_all(id, params)
12
29
  raise NotImplementedError
30
+ # pair = URI.decode({resource_name.to_sym => params}.to_params).split('&').map {|l| l.split('=')}
31
+ # h = Hash[*pair.flatten]
32
+ # path = element_path(id, :run_script_on_all)
33
+ # action(:post, path, h)
13
34
  end
14
35
 
15
36
  def instances(id)
16
37
  path = element_path(id, :instances)
17
- result = format.decode(connection.get(path)).map do |instance|
18
- generate_attributes(instance)
38
+ result = format.decode(action(:get, path)).map do |instance|
39
+ instance.generate_attributes
19
40
  end
20
41
  end
21
42
  end
@@ -1,8 +1,11 @@
1
1
  class ServerTemplate < RightResource::Base
2
2
  class << self
3
+ # === Parameters
4
+ # * _id_ - ServerTemplate id
5
+ # * _params_ - Hash (keys = [:phase]) ex. 'boot', 'operational', 'decommission'
3
6
  def executables(id, params={})
4
7
  path = element_path(id, :executables, params)
5
- instantiate_collection(format.decode(connection.get(path)))
8
+ format.decode(connection.get(path)).map {|x| x.generate_attributes}
6
9
  end
7
10
  end
8
11
  end
@@ -1,31 +1,6 @@
1
1
  class Status < RightResource::Base
2
2
  class << self
3
- def index(id)
4
- raise NotImplementedError
5
- end
6
-
7
- def create
8
- raise NotImplementedError
9
- end
10
-
11
- def update(id)
12
- raise NotImplementedError
13
- end
14
-
15
- def destory(id)
16
- raise NotImplementedError
17
- end
18
- end
19
-
20
- def create
21
- raise NotImplementedError
22
- end
23
-
24
- def update(id)
25
- raise NotImplementedError
26
- end
27
-
28
- def destory(id)
29
- raise NotImplementedError
3
+ undef :index, :create, :update, :destory
30
4
  end
5
+ undef :create, :update, :destory
31
6
  end
@@ -0,0 +1,66 @@
1
+ # == define_methods
2
+ # * _set_
3
+ # * _unset_
4
+ # === Examples
5
+ # Set tags for a resource
6
+ # ec2_href = Server.show(1).current_instance_href
7
+ # params = {:resource_href => ec2_href, :tags => ["xx99_server:role=dev", "xx99_server:group=dev"]}
8
+ # Tag.set(params)
9
+ # puts Tag.status
10
+ # p Tag.search(:resource_href => ec2_href)
11
+ # Unset tags for a resource
12
+ # Tag.unset(params)
13
+ # puts Tag.status
14
+ # p Tag.search(:resource_href => ec2_href)
15
+ class Tag < RightResource::Base
16
+ class << self
17
+ undef :index, :show, :create, :update, :destory
18
+
19
+ [:set, :unset].each do |act_method|
20
+ define_method(act_method) do |params|
21
+ path = "#{get_tag_resource_path(act_method)}"
22
+ action(:put, path, params)
23
+ end
24
+ end
25
+
26
+ # Search tags for a resource(resource_href in params) or resources matching giving tags
27
+ # === Parameters
28
+ # * +params+ - Hash (keys = [:resource_href or :resource_type, :match_all, :tags])
29
+ # === Return
30
+ # Array(tags)
31
+ # === Examples
32
+ # Get tags for a resource
33
+ # Tag.search(:resource_href => "/ec2_instances/1")
34
+ #
35
+ # Get resources matching tags
36
+ # param = {:resource_type => "ec2_instance", :tags => ["x99_db:role=*"]}
37
+ # servers = Tag.search(p).select {|server| server[:state] == "operational"}.map do |resource|
38
+ # Server.new(resource)
39
+ # end
40
+ #
41
+ # param = {:resource_type => "ec2_instance", :match_all => 'true', :tags => ["x99_db:role=slave"]}
42
+ # servers = Tag.search(p).select {|server| server[:state] == "operational"}.map do |resource|
43
+ # Server.new(resource)
44
+ # end
45
+ def search(params)
46
+ path = "#{get_tag_resource_path("search")}.#{format.extension}#{query_string(params)}"
47
+ result = format.decode(action(:get, path)).map do |tags|
48
+ tags.generate_attributes
49
+ end
50
+ end
51
+
52
+ # === Examples
53
+ # Tag.taggable_resources
54
+ def taggable_resources
55
+ # "#{self.name.to_s.split('::').last}s/#{__method__}" if RUBY_VERSION >= "1.8.7"
56
+ path = get_tag_resource_path("taggable_resources")
57
+ RightResource::Formats::XmlFormat.decode(action(:get, path))
58
+ end
59
+
60
+ private
61
+ def get_tag_resource_path(method_name)
62
+ "#{self.name.to_s.split('::').last.downcase}s/#{method_name}"
63
+ end
64
+ end
65
+ undef :create, :update, :destory
66
+ end
@@ -27,7 +27,7 @@ require 'right_resource/ec2_ssh_key'
27
27
  require 'right_resource/server_array'
28
28
  require 'right_resource/ec2_ebs_snapshot'
29
29
  require 'right_resource/s3_bucket'
30
- #require 'right_resource/tag'
30
+ require 'right_resource/tag'
31
31
  # Design API
32
32
  require 'right_resource/server_template'
33
33
  require 'right_resource/right_script'
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rightresource
3
3
  version: !ruby/object:Gem::Version
4
- hash: 7
4
+ hash: 5
5
5
  prerelease: false
6
6
  segments:
7
7
  - 0
8
8
  - 2
9
- - 8
10
- version: 0.2.8
9
+ - 9
10
+ version: 0.2.9
11
11
  platform: ruby
12
12
  authors:
13
13
  - Satoshi Ohki
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2010-11-12 00:00:00 +09:00
18
+ date: 2010-11-15 00:00:00 +09:00
19
19
  default_executable:
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency
@@ -80,6 +80,8 @@ files:
80
80
  - lib/right_resource/alert_spec.rb
81
81
  - lib/right_resource/base.rb
82
82
  - lib/right_resource/connection.rb
83
+ - lib/right_resource/core_ext/hash/generate_attributes.rb
84
+ - lib/right_resource/core_ext/hash.rb
83
85
  - lib/right_resource/core_ext/object/tap.rb
84
86
  - lib/right_resource/core_ext/object.rb
85
87
  - lib/right_resource/core_ext.rb
@@ -101,6 +103,7 @@ files:
101
103
  - lib/right_resource/server_array.rb
102
104
  - lib/right_resource/server_template.rb
103
105
  - lib/right_resource/status.rb
106
+ - lib/right_resource/tag.rb
104
107
  - lib/right_resource.rb
105
108
  has_rdoc: true
106
109
  homepage: https://github.com/satsv/rightresource