grid_rest 0.0.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.
data/.document ADDED
@@ -0,0 +1,6 @@
1
+ lib/**/*.rb
2
+ bin/*
3
+ rails/**/*.rb
4
+ -
5
+ features/**/*.feature
6
+ LICENSE.txt
data/Gemfile ADDED
@@ -0,0 +1,15 @@
1
+ source "http://rubygems.org"
2
+ # Add dependencies required to use your gem here.
3
+ # Example:
4
+ # gem "activesupport", ">= 2.3.5"
5
+ gem "activesupport", ">= 3.0.7"
6
+ gem "rest-client"
7
+
8
+ # Add dependencies to develop your gem here.
9
+ # Include everything needed to run rake, tests, features, etc.
10
+ group :development do
11
+ gem "shoulda", ">= 0"
12
+ gem "bundler", "~> 1.0.0"
13
+ gem "jeweler", "~> 1.6.0"
14
+ gem "rcov", ">= 0"
15
+ end
data/LICENSE.txt ADDED
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2011 Benjamin ter Kuile
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.rdoc ADDED
@@ -0,0 +1,92 @@
1
+ = grid_rest
2
+
3
+ grid_rest is a gem that makes your rails application interact with other backends through a REST interface. It is build in a situation where one rails application was talking to 2 java backends.
4
+ The main development focus is JSON communication, but XML should be just as easy.
5
+
6
+ == Example configurations
7
+ These configurations should be put in <tt>config/grid_rest.yml</tt>:
8
+
9
+ === General REST interface
10
+ include_in:
11
+ - ActiveRecord::Base
12
+ - ApplicationController
13
+ extend: ActiveRecord::Base
14
+ development:
15
+ url_prefix: '/api/1.0'
16
+ host: localhost
17
+ port: 20400
18
+ logging: true
19
+
20
+ production:
21
+ url_prefix: '/api/1.0'
22
+ host: localhost
23
+ port: 20400
24
+ logging: true
25
+
26
+ test:
27
+ url_prefix: '/api/1.0'
28
+ host: localhost
29
+ port: 20400
30
+ logging: true
31
+
32
+ === Multiple REST interfaces
33
+ include_in:
34
+ - ActiveRecord::Base
35
+ - ApplicationController
36
+ extend: ActiveRecord::Base
37
+ development:
38
+ zieook_workflow:
39
+ url_prefix: "/api/1.0/"
40
+ host: localhost
41
+ port: 20200
42
+ logging: true
43
+ zieook_data:
44
+ url_prefix: "/api/1.0"
45
+ host: localhost
46
+ port: 20100
47
+ logging: true
48
+
49
+ production:
50
+ zieook_workflow:
51
+ url_prefix: "/api/1.0/"
52
+ host: localhost
53
+ port: 20200
54
+ logging: true
55
+ zieook_data:
56
+ url_prefix: "/api/1.0"
57
+ host: localhost
58
+ port: 20100
59
+ logging: false
60
+
61
+ test:
62
+ zieook_workflow:
63
+ url_prefix: "/api/1.0/"
64
+ host: localhost
65
+ port: 20200
66
+ logging: true
67
+ zieook_data:
68
+ url_prefix: "/api/1.0"
69
+ host: localhost
70
+ port: 20100
71
+ logging: true
72
+ === Other ORM
73
+ include_in:
74
+ - MyOrm::Base
75
+ - ApplicationController
76
+ extend: MyOrm::Base
77
+ ....
78
+
79
+ == Contributing to grid_rest
80
+
81
+ * Check out the latest master to make sure the feature hasn't been implemented or the bug hasn't been fixed yet
82
+ * Check out the issue tracker to make sure someone already hasn't requested it and/or contributed it
83
+ * Fork the project
84
+ * Start a feature/bugfix branch
85
+ * Commit and push until you are happy with your contribution
86
+ * Make sure to add tests for it. This is important so I don't break it in a future version unintentionally.
87
+
88
+ == Copyright
89
+
90
+ Copyright (c) 2011 GridLine. See LICENSE.txt for
91
+ further details.
92
+
data/Rakefile ADDED
@@ -0,0 +1,54 @@
1
+ # encoding: utf-8
2
+
3
+ require 'rubygems'
4
+ require 'bundler'
5
+ begin
6
+ Bundler.setup(:default, :development)
7
+ rescue Bundler::BundlerError => e
8
+ $stderr.puts e.message
9
+ $stderr.puts "Run `bundle install` to install missing gems"
10
+ exit e.status_code
11
+ end
12
+ require 'rake'
13
+
14
+ require 'jeweler'
15
+ Jeweler::Tasks.new do |gem|
16
+ # gem is a Gem::Specification... see http://docs.rubygems.org/read/chapter/20 for more options
17
+ gem.name = "grid_rest"
18
+ gem.homepage = "http://github.com/bterkuile/grid_rest"
19
+ gem.license = "MIT"
20
+ gem.summary = %Q{grid_rest is a gem that makes your rails application interact with other backends through a REST interface.}
21
+ gem.description = %Q{grid_rest is a gem that makes your rails application interact with other backends through a REST interface. It is build in a situation where one rails application was talking to 2 java backends.
22
+ The main development focus is JSON communication, but XML should be just as easy}
23
+ gem.email = "bterkuile@gmail.com"
24
+ gem.authors = ["Benjamin ter Kuile"]
25
+ # dependencies defined in Gemfile
26
+ end
27
+ Jeweler::RubygemsDotOrgTasks.new
28
+
29
+ require 'rake/testtask'
30
+ Rake::TestTask.new(:test) do |test|
31
+ test.libs << 'lib' << 'test'
32
+ test.pattern = 'test/**/test_*.rb'
33
+ test.verbose = true
34
+ end
35
+
36
+ require 'rcov/rcovtask'
37
+ Rcov::RcovTask.new do |test|
38
+ test.libs << 'test'
39
+ test.pattern = 'test/**/test_*.rb'
40
+ test.verbose = true
41
+ test.rcov_opts << '--exclude "gems/*"'
42
+ end
43
+
44
+ task :default => :test
45
+
46
+ require 'rake/rdoctask'
47
+ Rake::RDocTask.new do |rdoc|
48
+ version = File.exist?('VERSION') ? File.read('VERSION') : ""
49
+
50
+ rdoc.rdoc_dir = 'rdoc'
51
+ rdoc.title = "grid_rest #{version}"
52
+ rdoc.rdoc_files.include('README*')
53
+ rdoc.rdoc_files.include('lib/**/*.rb')
54
+ end
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ 0.0.1
@@ -0,0 +1,13 @@
1
+ module GridRest
2
+ class Railtie < Rails::Railtie
3
+ #rake_tasks do
4
+ # load "tasks/tiny_mce.rake"
5
+ #end
6
+
7
+ initializer :grid_rest do |app|
8
+ app.config.after_initialize do
9
+ GridRest.load_config!
10
+ end
11
+ end
12
+ end
13
+ end
data/lib/grid_rest.rb ADDED
@@ -0,0 +1,306 @@
1
+ require 'rest_client'
2
+ require 'active_support/all'
3
+ require 'grid_rest/railtie'
4
+ module GridRest
5
+ mattr_accessor :grid_config, :log_file
6
+ class GridConfig < HashWithIndifferentAccess
7
+ # This allows for method like calling of the configuration. For example:
8
+ # GridRest.grid_config.host
9
+ # or
10
+ # GridRest.grid_config.namespaces
11
+ def method_missing(m, *args)
12
+ return self.send('[]=', m.to_s.chop, args.first) if m.to_s.last == '=' && args.size == 1
13
+ return self.send('[]', m)
14
+ end
15
+ end
16
+ self.grid_config = GridConfig.new
17
+ def self.include_in(klass)
18
+ klass.send(:include, GridRestExtensions)
19
+ self.grid_config.namespaces.keys.each do |k|
20
+ klass.send(:class_eval, namespace_methods(k))
21
+ end
22
+ end
23
+
24
+ def self.extend_class(klass)
25
+ klass.send(:extend, GridRestExtensions)
26
+ self.grid_config.namespaces.keys.each do |k|
27
+ klass.send(:class_eval, "class << self; #{namespace_methods(k)}; end")
28
+ end
29
+ end
30
+ def self.namespace_methods(namespace)
31
+ expand_str = <<-END
32
+ def #{namespace}_get(url, rparams = {})
33
+ grid_rest_get(url, rparams.merge(:grid_rest_namespace => '#{namespace}'))
34
+ end
35
+ def #{namespace}_post(url, rparams = {})
36
+ grid_rest_post(url, rparams.merge(:grid_rest_namespace => '#{namespace}'))
37
+ end
38
+ def #{namespace}_put(url, rparams = {})
39
+ grid_rest_put(url, rparams.merge(:grid_rest_namespace => '#{namespace}'))
40
+ end
41
+ def #{namespace}_delete(url, rparams = {})
42
+ grid_rest_delete(url, rparams.merge(:grid_rest_namespace => '#{namespace}'))
43
+ end
44
+ END
45
+ end
46
+
47
+ # Very important method. This will set the appropriate settings for the current
48
+ # rails environment and appends this system to the specified classes
49
+ def self.load_config!
50
+ config_path = File.join(Rails.root, 'config', 'grid_rest.yml')
51
+ raise "File #{config_path} does not exist" unless File.exist?(config_path)
52
+ h = YAML::load_file(config_path) rescue nil
53
+ raise "Config file #{config_path} could not be parsed" unless h
54
+ raise "Config file #{config_path} needs an environment" unless h[Rails.env]
55
+ self.grid_config.namespaces = HashWithIndifferentAccess.new unless self.grid_config.namespaces.is_a?(Hash)
56
+ h[Rails.env].each do |k, v|
57
+ if v.is_a?(Hash)
58
+ self.grid_config.namespaces[k.to_sym] = HashWithIndifferentAccess.new(v)
59
+ else
60
+ self.grid_config[k.to_sym] = v
61
+ end
62
+ end
63
+
64
+ # Now extend/include in configured classes
65
+ for inclusion in Array.wrap(h['include_in'])
66
+ self.include_in inclusion.constantize
67
+ end
68
+ for extension in Array.wrap(h['extend'])
69
+ self.extend_class extension.constantize
70
+ end
71
+ end
72
+ module GridRestExtensions
73
+ include ActiveSupport::Benchmarkable
74
+ unless respond_to?(:logger)
75
+ def logger
76
+ Rails.logger
77
+ end
78
+ end
79
+ # This one is on the deprication list
80
+ def grid_rest?(rparams = {})
81
+ ns = rparams[:grid_rest_namespace].present? ? "grid_rest_#{rparams[:grid_rest_namespace]}" : 'grid_rest'
82
+ raise "APP_CONFIG not available, make sure that config/config.yml and config/initializers/load_config.rb are available" unless defined?(APP_CONFIG)
83
+ raise "Namespace #{ns} not available in config/config.yml" unless APP_CONFIG[ns]
84
+ @grid_rest_active ||= Net::HTTP.new(APP_CONFIG[ns]['host'], APP_CONFIG[ns]['port']).start rescue nil
85
+ end
86
+
87
+ # This will get the current namespace or nil during grid_rest_request processing
88
+ def current_namespace
89
+ @current_namespace
90
+ end
91
+
92
+ # Wrapper for grid_rest_log_message to write a log message in a consitant manner given the request parameters
93
+ def grid_rest_log(method, url, rparams = {}, emsg = "")
94
+ if current_namespace
95
+ return unless GridRest.grid_config.namespaces[current_namespace]['logging']
96
+ else
97
+ return unless GridRest.grid_config['logging']
98
+ end
99
+ grid_rest_log_message(rparams.any? ? "#{Time.now.to_s(:db)} #{method.to_s.upcase} #{url} with #{rparams.inspect} #{emsg}" : "#{Time.now.to_s(:db)} #{method.to_s.upcase} #{url} #{emsg}")
100
+ end
101
+
102
+ # Write msg to the log file. Should only be called from grid_rest_log unless you know what you are doing
103
+ def grid_rest_log_message(msg)
104
+ GridRest.log_file ||= File.open(File.join(Rails.root, 'log', "#{Rails.env}_grid_rest.log"), 'a+')
105
+ GridRest.log_file.puts msg
106
+ GridRest.log_file.flush unless Rails.env == 'production'
107
+ end
108
+
109
+ def grid_rest_request(method, relative_url, rparams = {})
110
+ #return DummyResponse.new # test return
111
+ rest_url = generate_url(relative_url, rparams)
112
+ #return Error.new('unavailable', :url => rest_url) unless grid_rest?(rparams)
113
+ # Specify defaults per method for format
114
+ format = rparams.delete(:format) || {:get => :json, :post => :json, :put => :json}[method]
115
+ accept = get_accept_header(format)
116
+ @current_namespace = rparams.delete(:grid_rest_namespace) # Remove this setting from request parameters
117
+ begin
118
+ r = benchmark "Fetching #{method.to_s.upcase} #{relative_url} #{rparams.inspect}", :level => :debug do
119
+ case method
120
+ when :get then RestClient.get rest_url, :params => rparams, :accept => accept
121
+ when :post then
122
+ if rparams[:json_data]
123
+ RestClient.post rest_url, rparams[:json_data].is_a?(Hash) ? rparams[:json_data].to_json : rparams[:json_data], :content_type => :json, :accept => :json
124
+ elsif rparams[:xml_data]
125
+ RestClient.post rest_url, rparams[:xml_data].is_a?(Hash) ? rparams[:xml_data].to_xml : rparams[:xml_data], :content_type => :xml, :accept => :xml
126
+ elsif rparams[:binary]
127
+ RestClient.post rest_url, rparams[:binary], :content_type => 'binary/octet-stream'
128
+ else
129
+ rparams[:headers] ||= {}
130
+ rparams[:headers][:accept] = accept
131
+ rparams[:multipart] = true
132
+ RestClient.post rest_url, rparams
133
+ end
134
+ when :put then
135
+ if rparams[:json_data]
136
+ RestClient.put rest_url, rparams[:json_data].is_a?(Hash) ? rparams[:json_data].to_json : rparams[:json_data], :content_type => :json, :accept => :json
137
+ elsif rparams[:xml_data]
138
+ RestClient.put rest_url, rparams[:xml_data].is_a?(Hash) ? rparams[:xml_data].to_xml : rparams[:xml_data], :content_type => :xml, :accept => :xml
139
+ elsif rparams[:binary]
140
+ RestClient.put rest_url, rparams[:binary], :content_type => 'binary/octet-stream'
141
+ else
142
+ rparams[:headers] ||= {}
143
+ rparams[:headers][:accept] = accept
144
+ rparams[:multipart] = true
145
+ RestClient.put rest_url, rparams
146
+ end
147
+ when :delete then
148
+ if rparams[:json_data]
149
+ RestClient.delete rest_url, rparams[:json_data].is_a?(Hash) ? rparams[:json_data].to_json : rparams[:json_data], :content_type => :json, :accept => :json
150
+ elsif rparams[:xml_data]
151
+ RestClient.delete rest_url, rparams[:xml_data].is_a?(Hash) ? rparams[:xml_data].to_xml : rparams[:xml_data], :content_type => :xml, :accept => :xml
152
+ elsif rparams[:binary]
153
+ RestClient.delete rest_url, rparams[:binary], :content_type => 'binary/octet-stream'
154
+ else
155
+ rparams[:headers] ||= {}
156
+ rparams[:headers][:accept] = accept
157
+ rparams[:multipart] = true
158
+ RestClient.delete rest_url, :params => rparams
159
+ end
160
+ else
161
+ raise "No proper method (#{method}) for a grid_rest_request call"
162
+ end
163
+ end
164
+ grid_rest_log method, rest_url, rparams, "response code: #{r.code}"
165
+ if format == :json
166
+ #r = benchmark("decoding response JSON", :level => :debug ){ ActiveSupport::JSON.decode(r.body) rescue r } # Slow
167
+ r = benchmark("decoding response JSON", :level => :debug ){ JSON.parse(r.body) rescue r }
168
+ end
169
+ # Singleton class extensions
170
+ def r.valid?
171
+ true
172
+ end
173
+ rescue RestClient::ResourceNotFound => e
174
+ r = Error.new('resource not found', :url => rest_url, :code => e.http_code, :method => method)
175
+ grid_rest_log method, rest_url, rparams, "resource not found response"
176
+ rescue Errno::ECONNREFUSED
177
+ r = Error.new('connection refused', :url => rest_url, :code => 404, :method => method)
178
+ grid_rest_log method, rest_url, rparams, "connection refused response"
179
+ rescue => e
180
+ r = Error.new "general", :url => rest_url, :code => e.respond_to?(:http_code) ? e.http_code : 500, :method => method
181
+ grid_rest_log method, rest_url, rparams, "error in request"
182
+ end
183
+ r
184
+ end
185
+
186
+ def generate_url(url, rparams = {})
187
+ host = GridRest.grid_config.namespaces[rparams[:grid_rest_namespace]].try('[]', 'host') || GridRest.grid_config['host']
188
+ port = GridRest.grid_config.namespaces[rparams[:grid_rest_namespace]].try('[]', 'port') || GridRest.grid_config['port'] || 80
189
+ url_prefix = GridRest.grid_config.namespaces[rparams[:grid_rest_namespace]].try('[]', 'url_prefix') || GridRest.grid_config['url_prefix'] || ''
190
+ raise "No host specified for GridRest" unless host
191
+ gurl = File.join( "#{host}:#{port}", url_prefix, URI.encode(url) )
192
+ gurl = "http://#{gurl}" unless gurl =~ /^http/
193
+ gurl
194
+ end
195
+
196
+ def grid_rest_get(url, rparams = {})
197
+ return grid_rest_request(:get, url, rparams)
198
+ end
199
+
200
+ def grid_rest_put(url, rparams = {})
201
+ grid_rest_request(:put, url, rparams)
202
+ end
203
+
204
+ def grid_rest_delete(url, rparams = {})
205
+ grid_rest_request(:delete, url, rparams)
206
+ end
207
+ def grid_rest_post(url, rparams={})
208
+ return grid_rest_request(:post, url, rparams)
209
+ end
210
+ def get_accept_header(f)
211
+ case f
212
+ when :json then :json #'application/json'
213
+ when :xml then :xml #'application/xml'
214
+ else :json #'application/json'
215
+ end
216
+ end
217
+ end
218
+
219
+ # Error class for a rest request. Has some nice features like
220
+ # internationalisation of messages, and basic methods to correspond
221
+ # with a normal request, but most importantly returns false on the
222
+ # valid? question.
223
+ class Error
224
+ attr_reader :message, :code, :url, :request_method
225
+ def initialize(message = nil, rparams = {})
226
+ @message = I18n.t(message, :scope => [:grid_rest, :error])
227
+ @code = rparams.delete(:code)
228
+ @url = rparams.delete(:url)
229
+ @request_method = rparams.delete(:request_method)
230
+ end
231
+ def code
232
+ @code || 500
233
+ end
234
+ def to_s
235
+ ''
236
+ end
237
+ alias to_str to_s
238
+
239
+ def valid?
240
+ false
241
+ end
242
+
243
+ def try(*args)
244
+ nil
245
+ end
246
+
247
+ # Call this on error if the result should be an empty array, but wit the
248
+ # invalid metadata
249
+ def array
250
+ ErrorArray.new(self)
251
+ end
252
+ end
253
+
254
+ class ErrorArray < Array
255
+ attr_reader :message, :code, :url, :request_method
256
+ def initialize(e)
257
+ @message = e.message
258
+ @code = e.code
259
+ @url = e.url
260
+ @request_method = e.request_method
261
+ end
262
+ def to_s
263
+ ''
264
+ end
265
+ alias to_str to_s
266
+ def valid?
267
+ false
268
+ end
269
+ def try(*args)
270
+ nil
271
+ end
272
+ end
273
+
274
+ # This class can be used in testing environments. It will always be valid and behaves a
275
+ # bit like a normal response when this is a json hash.
276
+ class DummyResponse < Hash
277
+ def code
278
+ 200
279
+ end
280
+ def valid?
281
+ true
282
+ end
283
+ end
284
+ end
285
+
286
+ # Arrays are valid, unless defined otherwise
287
+ class Object
288
+ def valid?
289
+ true
290
+ end
291
+ def invalid?
292
+ !valid?
293
+ end
294
+ end
295
+
296
+ class NilClass
297
+ def valid?
298
+ false
299
+ end
300
+ end
301
+
302
+ class FalseClass
303
+ def valid?
304
+ false
305
+ end
306
+ end
data/test/helper.rb ADDED
@@ -0,0 +1,18 @@
1
+ require 'rubygems'
2
+ require 'bundler'
3
+ begin
4
+ Bundler.setup(:default, :development)
5
+ rescue Bundler::BundlerError => e
6
+ $stderr.puts e.message
7
+ $stderr.puts "Run `bundle install` to install missing gems"
8
+ exit e.status_code
9
+ end
10
+ require 'test/unit'
11
+ require 'shoulda'
12
+
13
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
14
+ $LOAD_PATH.unshift(File.dirname(__FILE__))
15
+ require 'grid_rest'
16
+
17
+ class Test::Unit::TestCase
18
+ end
@@ -0,0 +1,7 @@
1
+ require 'helper'
2
+
3
+ class TestGridRest < Test::Unit::TestCase
4
+ should "probably rename this file and start testing for real" do
5
+ flunk "hey buddy, you should probably rename this file and start testing for real"
6
+ end
7
+ end
metadata ADDED
@@ -0,0 +1,151 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: grid_rest
3
+ version: !ruby/object:Gem::Version
4
+ prerelease: false
5
+ segments:
6
+ - 0
7
+ - 0
8
+ - 1
9
+ version: 0.0.1
10
+ platform: ruby
11
+ authors:
12
+ - Benjamin ter Kuile
13
+ autorequire:
14
+ bindir: bin
15
+ cert_chain: []
16
+
17
+ date: 2011-06-07 00:00:00 +02:00
18
+ default_executable:
19
+ dependencies:
20
+ - !ruby/object:Gem::Dependency
21
+ version_requirements: &id001 !ruby/object:Gem::Requirement
22
+ requirements:
23
+ - - ">="
24
+ - !ruby/object:Gem::Version
25
+ segments:
26
+ - 3
27
+ - 0
28
+ - 7
29
+ version: 3.0.7
30
+ requirement: *id001
31
+ prerelease: false
32
+ type: :runtime
33
+ name: activesupport
34
+ - !ruby/object:Gem::Dependency
35
+ version_requirements: &id002 !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - ">="
38
+ - !ruby/object:Gem::Version
39
+ segments:
40
+ - 0
41
+ version: "0"
42
+ requirement: *id002
43
+ prerelease: false
44
+ type: :runtime
45
+ name: rest-client
46
+ - !ruby/object:Gem::Dependency
47
+ version_requirements: &id003 !ruby/object:Gem::Requirement
48
+ requirements:
49
+ - - ">="
50
+ - !ruby/object:Gem::Version
51
+ segments:
52
+ - 0
53
+ version: "0"
54
+ requirement: *id003
55
+ prerelease: false
56
+ type: :development
57
+ name: shoulda
58
+ - !ruby/object:Gem::Dependency
59
+ version_requirements: &id004 !ruby/object:Gem::Requirement
60
+ requirements:
61
+ - - ~>
62
+ - !ruby/object:Gem::Version
63
+ segments:
64
+ - 1
65
+ - 0
66
+ - 0
67
+ version: 1.0.0
68
+ requirement: *id004
69
+ prerelease: false
70
+ type: :development
71
+ name: bundler
72
+ - !ruby/object:Gem::Dependency
73
+ version_requirements: &id005 !ruby/object:Gem::Requirement
74
+ requirements:
75
+ - - ~>
76
+ - !ruby/object:Gem::Version
77
+ segments:
78
+ - 1
79
+ - 6
80
+ - 0
81
+ version: 1.6.0
82
+ requirement: *id005
83
+ prerelease: false
84
+ type: :development
85
+ name: jeweler
86
+ - !ruby/object:Gem::Dependency
87
+ version_requirements: &id006 !ruby/object:Gem::Requirement
88
+ requirements:
89
+ - - ">="
90
+ - !ruby/object:Gem::Version
91
+ segments:
92
+ - 0
93
+ version: "0"
94
+ requirement: *id006
95
+ prerelease: false
96
+ type: :development
97
+ name: rcov
98
+ description: |-
99
+ grid_rest is a gem that makes your rails application interact with other backends through a REST interface. It is build in a situation where one rails application was talking to 2 java backends.
100
+ The main development focus is JSON communication, but XML should be just as easy
101
+ email: bterkuile@gmail.com
102
+ executables: []
103
+
104
+ extensions: []
105
+
106
+ extra_rdoc_files:
107
+ - LICENSE.txt
108
+ - README.rdoc
109
+ files:
110
+ - .document
111
+ - Gemfile
112
+ - LICENSE.txt
113
+ - README.rdoc
114
+ - Rakefile
115
+ - VERSION
116
+ - lib/grid_rest.rb
117
+ - lib/grid_rest/railtie.rb
118
+ - test/helper.rb
119
+ - test/test_grid_rest.rb
120
+ has_rdoc: true
121
+ homepage: http://github.com/bterkuile/grid_rest
122
+ licenses:
123
+ - MIT
124
+ post_install_message:
125
+ rdoc_options: []
126
+
127
+ require_paths:
128
+ - lib
129
+ required_ruby_version: !ruby/object:Gem::Requirement
130
+ requirements:
131
+ - - ">="
132
+ - !ruby/object:Gem::Version
133
+ segments:
134
+ - 0
135
+ version: "0"
136
+ required_rubygems_version: !ruby/object:Gem::Requirement
137
+ requirements:
138
+ - - ">="
139
+ - !ruby/object:Gem::Version
140
+ segments:
141
+ - 0
142
+ version: "0"
143
+ requirements: []
144
+
145
+ rubyforge_project:
146
+ rubygems_version: 1.3.6
147
+ signing_key:
148
+ specification_version: 3
149
+ summary: grid_rest is a gem that makes your rails application interact with other backends through a REST interface.
150
+ test_files: []
151
+