apipie-bindings 0.0.4 → 0.0.5

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,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 9e97dd17fff7daa31bb6b9c3d9c0ce896a8b6a98
4
- data.tar.gz: ebb7ed8491df770582786a1d86102088dc7dee5f
3
+ metadata.gz: a805b89ca19114aead114bef90692bb47509284b
4
+ data.tar.gz: 07cf88b87738018220613dfad3ff8311375947ed
5
5
  SHA512:
6
- metadata.gz: be9739179d7a3c68a2fa8f666d5565cb0f154c5996315f24b43a93d2b131ff2ef08b9b5ee3ec9490ba9122d3421d3df8c6b9c2dee2762497ad4471571e7fdd4c
7
- data.tar.gz: 4992332d1c150706ccb2757d9bdb32549b96a153706dd58c64d4c15ea1f1a2a4a7719abb86ca6c0b646cdc1d0ce65417102dee79cda19131bf057215be70a533
6
+ metadata.gz: 6230f046f2ead04118c213a12e0ca24189d45cef2d61eac2cec82fbc95e44906d24acf4a8fd17d758ff34f4cff4ea2592dced3ab4c4005b4bd4d628d722e8c3c
7
+ data.tar.gz: 0a89ea42ac4b7db3f29e6643f207aa59ea07135509be0afc64b090831eaa4e021d19605890e2f65ed1fc3498945493ea03371714438cad7757750fc7e3f671ef
@@ -1,4 +1,5 @@
1
1
  require 'apipie_bindings/version'
2
+ require 'apipie_bindings/exceptions'
2
3
  require 'apipie_bindings/inflector'
3
4
  require 'apipie_bindings/indifferent_hash'
4
5
  require 'apipie_bindings/api'
@@ -36,6 +36,7 @@ module ApipieBindings
36
36
  # *after* each API request
37
37
  # @option config [Object] :logger (Logger.new(STDERR)) custom logger class
38
38
  # @param [Hash] options params that are passed to ResClient as-is
39
+ # @raise [ApipieBindings::ConfigurationError] when no +:uri+ or +:apidoc_cache_dir+ is provided
39
40
  # @example connect to a server
40
41
  # ApipieBindings::API.new({:uri => 'http://localhost:3000/',
41
42
  # :username => 'admin', :password => 'changeme',
@@ -44,6 +45,9 @@ module ApipieBindings
44
45
  # ApipieBindings::API.new({:apidoc_cache_dir => 'test/unit/data',
45
46
  # :apidoc_cache_name => 'architecture'})
46
47
  def initialize(config, options={})
48
+ if config[:uri].nil? && config[:apidoc_cache_dir].nil?
49
+ raise ApipieBindings::ConfigurationError.new('Either :uri or :apidoc_cache_dir needs to be set')
50
+ end
47
51
  @uri = config[:uri]
48
52
  @api_version = config[:api_version] || 1
49
53
  @apidoc_cache_dir = config[:apidoc_cache_dir] || File.join(Dir.tmpdir, 'apipie_bindings', @uri.tr(':/', '_'))
@@ -98,19 +102,6 @@ module ApipieBindings
98
102
  end
99
103
  end
100
104
 
101
- def retrieve_apidoc
102
- FileUtils.mkdir_p(@apidoc_cache_dir) unless File.exists?(@apidoc_cache_dir)
103
- path = "/apidoc/v#{@api_version}.json"
104
- begin
105
- response = http_call('get', path, {},
106
- {:accept => "application/json"}, {:response => :raw})
107
- rescue
108
- raise "Could not load data from #{@uri}#{path}"
109
- end
110
- File.open(apidoc_cache_file, "w") { |f| f.write(response.body) }
111
- log.debug "New apidoc loaded from the server"
112
- load_apidoc
113
- end
114
105
 
115
106
  def apidoc
116
107
  @apidoc = @apidoc || load_apidoc || retrieve_apidoc
@@ -135,6 +126,22 @@ module ApipieBindings
135
126
  apidoc[:docs][:resources].keys.map { |res| resource(res) }
136
127
  end
137
128
 
129
+
130
+ # Call an action in the API.
131
+ # It finds most fitting route based on given parameters
132
+ # with other attributes neccessary to do an API call.
133
+ # If in dry_run mode {#initialize} it finds fake response data in examples
134
+ # or user provided data. At the end when the response format is JSON it
135
+ # is parsed and returned as ruby objects. If server supports checksum sending
136
+ # the internal cache with API description is checked and updated if needed
137
+ # @param [Symbol] resource_name name of the resource
138
+ # @param [Symbol] action_name name of the action
139
+ # @param [Hash] params parameters to be send in the request
140
+ # @param [Hash] headers extra headers to be sent with the request
141
+ # @param [Hash] options options to influence the how the call is processed
142
+ # * *:response* (Symbol) *:raw* - skip parsing JSON in response
143
+ # @example show user data
144
+ # call(:users, :show, :id => 1)
138
145
  def call(resource_name, action_name, params={}, headers={}, options={})
139
146
  check_cache if @aggressive_cache_checking
140
147
  resource = resource(resource_name)
@@ -149,13 +156,22 @@ module ApipieBindings
149
156
  headers, options)
150
157
  end
151
158
 
152
-
159
+ # Low level call to the API. Suitable for calling actions not covered by
160
+ # apipie documentation. For all other cases use {#call}
161
+ # @param [String] http_method one of +get+, +put+, +post+, +destroy+, +patch+
162
+ # @param [String] path URL path that should be called
163
+ # @param [Hash] params parameters to be send in the request
164
+ # @param [Hash] headers extra headers to be sent with the request
165
+ # @param [Hash] options options to influence the how the call is processed
166
+ # * *:response* (Symbol) *:raw* - skip parsing JSON in response
167
+ # @example show user data
168
+ # http_call('get', '/api/users/1')
153
169
  def http_call(http_method, path, params={}, headers={}, options={})
154
170
  headers ||= { }
155
171
 
156
172
  args = [http_method]
157
173
  if %w[post put].include?(http_method.to_s)
158
- args << params.to_json
174
+ args << params
159
175
  else
160
176
  headers[:params] = params if params
161
177
  end
@@ -168,7 +184,7 @@ module ApipieBindings
168
184
  if dry_run?
169
185
  empty_response = ApipieBindings::Example.new('', '', '', 200, '')
170
186
  ex = options[:fake_response ] || empty_response
171
- response = RestClient::Response.create(ex.response, ex.status, ex.args)
187
+ response = RestClient::Response.create(ex.response, ex.status, args)
172
188
  else
173
189
  response = @client[path].send(*args)
174
190
  update_cache(response.headers[:apipie_checksum])
@@ -217,6 +233,23 @@ module ApipieBindings
217
233
 
218
234
  private
219
235
 
236
+ def retrieve_apidoc
237
+ FileUtils.mkdir_p(@apidoc_cache_dir) unless File.exists?(@apidoc_cache_dir)
238
+ path = "/apidoc/v#{@api_version}.json"
239
+ begin
240
+ response = http_call('get', path, {},
241
+ {:accept => "application/json"}, {:response => :raw})
242
+ rescue
243
+ raise ApipieBindings::DocLoadingError.new(
244
+ "Could not load data from #{@uri}#{path}\n"\
245
+ " - is your server down?\n"\
246
+ " - was rake apipie:cache run when using apipie cache? (typical production settings)")
247
+ end
248
+ File.open(apidoc_cache_file, "w") { |f| f.write(response.body) }
249
+ log.debug "New apidoc loaded from the server"
250
+ load_apidoc
251
+ end
252
+
220
253
  def find_match(fakes, resource, action, params)
221
254
  resource = fakes[[resource, action]]
222
255
  if resource
@@ -0,0 +1,6 @@
1
+ module ApipieBindings
2
+
3
+ class ConfigurationError < StandardError; end
4
+ class DocLoadingError < StandardError; end
5
+
6
+ end
@@ -1,5 +1,5 @@
1
1
  module ApipieBindings
2
2
  def self.version
3
- @version ||= Gem::Version.new '0.0.4'
3
+ @version ||= Gem::Version.new '0.0.5'
4
4
  end
5
5
  end
@@ -59,6 +59,16 @@ describe ApipieBindings::API do
59
59
  result.must_be_kind_of Array
60
60
  end
61
61
 
62
+ it "should preserve file in args (#2)" do
63
+ api = ApipieBindings::API.new({
64
+ :apidoc_cache_dir => 'test/unit/data',
65
+ :apidoc_cache_name => 'architecture',
66
+ :dry_run => true})
67
+ s = StringIO.new; s << 'foo'
68
+ RestClient::Response.expects(:create).with('', 200, [:post, {:file => s}, {}])
69
+ result = api.http_call(:post, '/api/path', {:file => s}, {}, {:response => :raw})
70
+ end
71
+
62
72
  context "update_cache" do
63
73
 
64
74
  before :each do
@@ -106,4 +116,10 @@ describe ApipieBindings::API do
106
116
  end
107
117
  end
108
118
 
119
+ context "configuration" do
120
+ it "should complain when no uri or cache dir is set" do
121
+ proc {ApipieBindings::API.new({})}.must_raise ApipieBindings::ConfigurationError
122
+ end
123
+ end
124
+
109
125
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: apipie-bindings
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.4
4
+ version: 0.0.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Martin Bačovský
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-03-18 00:00:00.000000000 Z
11
+ date: 2014-03-20 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: json
@@ -52,20 +52,6 @@ dependencies:
52
52
  - - '>='
53
53
  - !ruby/object:Gem::Version
54
54
  version: '0'
55
- - !ruby/object:Gem::Dependency
56
- name: i18n
57
- requirement: !ruby/object:Gem::Requirement
58
- requirements:
59
- - - '>='
60
- - !ruby/object:Gem::Version
61
- version: '0'
62
- type: :runtime
63
- prerelease: false
64
- version_requirements: !ruby/object:Gem::Requirement
65
- requirements:
66
- - - '>='
67
- - !ruby/object:Gem::Version
68
- version: '0'
69
55
  - !ruby/object:Gem::Dependency
70
56
  name: awesome_print
71
57
  requirement: !ruby/object:Gem::Requirement
@@ -109,6 +95,7 @@ files:
109
95
  - lib/apipie_bindings/action.rb
110
96
  - lib/apipie_bindings/api.rb
111
97
  - lib/apipie_bindings/example.rb
98
+ - lib/apipie_bindings/exceptions.rb
112
99
  - lib/apipie_bindings/indifferent_hash.rb
113
100
  - lib/apipie_bindings/inflector.rb
114
101
  - lib/apipie_bindings/param.rb