callapi 0.8.2 → 0.8.3

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: b15bf280c079ecd6b54dc85083778c56bcbd82a0
4
- data.tar.gz: bdcea789ec933c02f7117e604028b2ceac584a21
3
+ metadata.gz: 02bc23118c163ba3958e49a25c0cfe96cb39fc53
4
+ data.tar.gz: b89debc1a4a2ab08d51e0417cbc00c800307a412
5
5
  SHA512:
6
- metadata.gz: 665df982cab57bd4c6303076ebbe0fbb375ec18cdc3ec7e1ce39809a760d1ca4d1179543e5767893934d8c684e953d23deced6c50869b6374e4f5724d658b055
7
- data.tar.gz: b03a2dfe9299bb84337d9420fe0b69ffd1533e969f3a1eed8927dbad023e80a1bce3205a7a8cf5fa15987bc48224d02c87352ac72f530c1b9e614d1ae060ae6b
6
+ metadata.gz: 4c2c444d6e38be1c9268215bb33a103f1a3cccfa36c42d6965f8ec85ac4f1b107d1d52f17daf1196f55c375f441ccc2cdd3e6049f3f84ed43e4c243d7e8ea0d2
7
+ data.tar.gz: 2b84398197f954df3a1d222ddcc379856f2c03ad1e048fd43d6ece3ba3e9b2fe1950e5ac1b18b05cabffc2bde93a10391bacf65bf0a1fb53cf3dbee5ffd7802c
data/README.md CHANGED
@@ -1,4 +1,5 @@
1
- # Callapi
1
+ # Callapi [![Gem Version](https://badge.fury.io/rb/callapi.svg)](http://badge.fury.io/rb/callapi) [![Code Climate](https://codeclimate.com/github/kv109/Callapi/badges/gpa.svg)](https://codeclimate.com/github/kv109/Callapi)
2
+
2
3
 
3
4
  Easy API calls
4
5
 
@@ -21,6 +21,7 @@ Gem::Specification.new do |spec|
21
21
  spec.add_development_dependency 'bundler', '~> 1.7'
22
22
  spec.add_development_dependency 'rake', '~> 10.0'
23
23
 
24
+ #TODO: Use better dependencies pattern
24
25
  spec.add_runtime_dependency 'addressable', '~> 2.3'
25
26
  spec.add_runtime_dependency 'addressabler', '~> 0.1'
26
27
  spec.add_runtime_dependency 'multi_json', '~> 1.10'
@@ -28,4 +29,6 @@ Gem::Specification.new do |spec|
28
29
  spec.add_runtime_dependency 'activesupport', '~> 4.2'
29
30
  spec.add_runtime_dependency 'chainy', '~> 0.0.5'
30
31
  spec.add_runtime_dependency 'memoist', '~> 0.11'
32
+
33
+ spec.required_ruby_version = '>= 2.0'
31
34
  end
@@ -5,7 +5,6 @@ class Callapi::Call::Base
5
5
  require_relative 'response'
6
6
 
7
7
  extend Forwardable
8
- extend Memoist
9
8
 
10
9
  def_delegators :request_metadata, :request_method, :request_path
11
10
 
@@ -24,11 +23,6 @@ class Callapi::Call::Base
24
23
  @strategy ||= (self.class.strategy || Callapi::Config.default_request_strategy)
25
24
  end
26
25
 
27
- def request_metadata
28
- Callapi::Call::RequestMetadata.new(self)
29
- end
30
- memoize :request_metadata
31
-
32
26
  def response_parser
33
27
  @response_parser ||= (self.class.response_parser || Callapi::Config.default_response_parser)
34
28
  end
@@ -63,4 +57,8 @@ class Callapi::Call::Base
63
57
  def request_class
64
58
  Callapi::Call::Request
65
59
  end
60
+
61
+ def request_metadata
62
+ @request_metadata ||= Callapi::Call::RequestMetadata.new(self)
63
+ end
66
64
  end
@@ -3,7 +3,14 @@ class Callapi::Call::Request::Api < Callapi::Call::Request::Http
3
3
  Callapi::Config.api_host || raise(Callapi::ApiHostNotSetError)
4
4
  end
5
5
 
6
+ def uri
7
+ @uri ||= super.tap do |uri|
8
+ uri.path = api_path_prefix + request_path
9
+ end
10
+ end
11
+
6
12
  def api_path_prefix
7
- Callapi::Config.api_path_prefix
13
+ Callapi::Config.api_path_prefix if Callapi::Config.api_path_prefix # backward compatibility
14
+ URI(Callapi::Config.api_host).path
8
15
  end
9
16
  end
@@ -5,7 +5,6 @@ require 'addressabler'
5
5
  class Callapi::Call::Request::Http < Callapi::Call::Request::Base
6
6
  require_relative 'http/log_helper'
7
7
 
8
- extend Memoist
9
8
  include Callapi::Call::Request::Http::LogHelper
10
9
 
11
10
  HTTP_METHOD_TO_REQUEST_CLASS = {
@@ -29,6 +28,7 @@ class Callapi::Call::Request::Http < Callapi::Call::Request::Base
29
28
  end
30
29
 
31
30
  def http
31
+ #TODO: Use HTTParty
32
32
  Net::HTTP.new(uri.host, uri.port)
33
33
  end
34
34
 
@@ -43,18 +43,13 @@ class Callapi::Call::Request::Http < Callapi::Call::Request::Base
43
43
  end
44
44
 
45
45
  def uri
46
- Addressable::URI.parse(host).tap do |uri|
47
- uri.path = api_path_prefix + request_path
46
+ @uri ||= Addressable::URI.parse(host).tap do |uri|
47
+ uri.path = request_path
48
48
  uri.query_hash = params unless put_params_in_request_body?
49
49
  end
50
50
  end
51
- memoize :uri
52
51
 
53
52
  def put_params_in_request_body?
54
53
  [:post, :patch, :put].include? request_method
55
54
  end
56
-
57
- def api_path_prefix
58
- ''
59
- end
60
55
  end
@@ -4,38 +4,62 @@ module Callapi::Call::Request::Http::LogHelper
4
4
  def with_logging
5
5
  return yield if Callapi::Config.log_level == :none
6
6
 
7
- t0 = Time.now
7
+ start_time = Time.now
8
+
9
+ add_api_host_log
10
+ add_request_path_log
11
+ add_request_headers_log
12
+ add_request_params_log
13
+
14
+ yield.tap do |response|
15
+ add_response_log(response)
16
+ add_response_summary_log(start_time)
17
+ end
18
+ rescue StandardError => e
19
+ puts 'Exception occured, skipping logs'.center(80, '-').colorize(:red).on_yellow
20
+ raise e
21
+ end
22
+
23
+ def add_api_host_log
8
24
  string = ''
9
25
  string << uri.host
10
26
  string << ":#{uri.port}" if uri.port
11
27
 
12
28
  puts "Sending request to #{string}".center(80, '-').colorize(:white).on_blue
29
+ end
30
+
31
+ def add_request_path_log
13
32
  'PATH: '.tap do |string|
14
33
  string << "#{request_method.to_s.upcase} "
15
34
  string << "#{uri.path}"
16
35
  puts string.colorize(:magenta)
17
36
  end
37
+ end
38
+
39
+ def add_request_headers_log
18
40
  'HEADERS: '.tap do |string|
19
41
  string << "#{headers}"
20
42
  puts string.colorize(:cyan)
21
43
  end
44
+ end
45
+
46
+ def add_request_params_log
22
47
  'PARAMS: '.tap do |string|
23
48
  string << "#{params}"
24
49
  puts string.colorize(:green)
25
50
  end
51
+ end
26
52
 
27
- response = yield
28
-
53
+ def add_response_log(response)
29
54
  response.tap do |response|
30
55
  "RESPONSE: [#{response.code}]\n".tap do |string|
31
56
  string << (response.body.nil? ? '[EMPTY BODY]' : response.body)
32
57
  puts string.colorize(:light_blue)
33
58
  end
34
-
35
- puts "request send (#{(Time.now - t0).round(3)} sec)".center(80, '-').colorize(:white).on_blue
36
59
  end
37
- rescue StandardError => e
38
- puts "Exception occured, skipping logs".center(80, '-').colorize(:red).on_yellow
39
- raise e
60
+ end
61
+
62
+ def add_response_summary_log(start_time)
63
+ puts "request send (#{(Time.now - start_time).round(3)} sec)".center(80, '-').colorize(:white).on_blue
40
64
  end
41
65
  end
@@ -2,7 +2,7 @@ class Callapi::Config
2
2
  DEFAULT_REQUEST_STRATEGY = 'Callapi::Call::Request::Api'
3
3
  DEFAULT_RESPONSE_PARSER = 'Callapi::Call::Parser::Json'
4
4
  DEFAULT_MOCKS_DIRECTORY = 'mocked_calls'
5
- DEFAULT_PATH_PREFIX = ''
5
+ DEFAULT_PATH_PREFIX = nil
6
6
 
7
7
  class << self
8
8
  attr_reader :mocks_directory
@@ -46,41 +46,62 @@ class Callapi::Routes
46
46
 
47
47
  def create_classes
48
48
  classes_metadata.each do |class_metadata|
49
- classes = class_metadata.class_name.split('::')
50
- classes = classes[2..classes.size]
49
+ classes = classes_without_http_namespace(class_metadata)
51
50
 
52
51
  classes.inject(class_metadata.http_method_namespace) do |namespace, class_name|
53
52
  if namespace.constants.include?(class_name.to_sym)
54
53
  namespace.const_get(class_name)
55
54
  else
56
- full_class_name = "#{namespace}::#{class_name}"
57
- if call_classes_names.include?(full_class_name)
58
- namespace.const_set(class_name, Class.new(Callapi::Call::Base)).tap do |klass|
59
- set_call_class_options(klass, class_metadata.class_options) if class_metadata.class_options
60
- create_helper_method(klass, class_metadata)
61
- end
62
- else
63
- namespace.const_set(class_name, Class.new)
64
- end
55
+ create_class(namespace, class_name, class_metadata)
65
56
  end
66
57
  end
67
58
  end
68
59
  end
69
60
 
61
+ def classes_without_http_namespace(class_metadata)
62
+ classes = class_metadata.class_name.split('::')
63
+ classes[2..classes.size]
64
+ end
65
+
66
+ def create_class(namespace, class_name, class_metadata)
67
+ full_class_name = "#{namespace}::#{class_name}"
68
+ if call_classes_names.include?(full_class_name)
69
+ create_call_class(namespace, class_name, class_metadata)
70
+ else
71
+ create_call_namespace(namespace, class_name)
72
+ end
73
+ end
74
+
75
+ def create_call_class(namespace, class_name, class_metadata)
76
+ namespace.const_set(class_name, Class.new(Callapi::Call::Base)).tap do |klass|
77
+ set_call_class_options(klass, class_metadata.class_options) if class_metadata.class_options
78
+ create_helper_method(klass, class_metadata)
79
+ end
80
+ end
81
+
82
+ def create_call_namespace(namespace, new_namespace)
83
+ namespace.const_set(new_namespace, Class.new)
84
+ end
85
+
70
86
  def create_helper_method(klass, class_metadata)
71
- http_method = class_metadata.http_method_namespace.to_s.split('::').last
72
- call_name_with_namespaces = class_metadata.call_name_with_namespaces.map do |class_name|
87
+ Object.send(:define_method, helper_method_name(class_metadata)) do |*args|
88
+ klass.new(*args)
89
+ end
90
+ end
91
+
92
+ def helper_method_base_name(class_metadata)
93
+ class_metadata.call_name_with_namespaces.map do |class_name|
73
94
  class_name.scan(/(::)?((\w)+)Param/).map { |matched_groups| matched_groups[1] }.compact.each do |pattern|
74
95
  class_name.sub!(pattern, "By#{pattern}")
75
96
  class_name.sub!('Param', '')
76
97
  end
77
98
  class_name
78
99
  end
79
- method_name = [http_method, call_name_with_namespaces, 'call'].join('_')
80
- method_name = method_name.underscore.gsub('/', '_')
81
- Object.send(:define_method, method_name) do |*args|
82
- klass.new(*args)
83
- end
100
+ end
101
+
102
+ def helper_method_name(class_metadata)
103
+ method_name = [class_metadata.http_method, helper_method_base_name(class_metadata), 'call'].join('_')
104
+ method_name.underscore.gsub('/', '_')
84
105
  end
85
106
 
86
107
  def set_call_class_options(klass, options)
@@ -24,6 +24,7 @@ class Callapi::Routes::Metadata
24
24
  data.class_name = full_class_name(i)
25
25
  data.call_class = is_call_class
26
26
  data.http_method_namespace = @http_method_namespace
27
+ data.http_method = @http_method_namespace.to_s.split('::').last
27
28
  if is_call_class
28
29
  data.class_options = @call_options
29
30
  data.call_name_with_namespaces = call_name_with_namespaces
@@ -1,3 +1,3 @@
1
1
  module Callapi
2
- VERSION = '0.8.2'
2
+ VERSION = '0.8.3'
3
3
  end
@@ -8,7 +8,7 @@ RSpec.configure do |config|
8
8
  Get::Users = Class.new(Callapi::Call::Base)
9
9
 
10
10
  Callapi::Config.configure do |config|
11
- config.log_level = :off
11
+ config.log_level = :none
12
12
  end
13
13
  end
14
14
  end
@@ -1,9 +1,10 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe Callapi::Call::Request::Api do
4
+ let(:config) { Callapi::Config }
5
+
4
6
  context '#host' do
5
7
  subject { described_class.new(nil).host }
6
- let(:config) { Callapi::Config }
7
8
 
8
9
  context 'when API host is not set' do
9
10
  it 'should raise ApiHostNotSet error' do
@@ -20,9 +21,17 @@ describe Callapi::Call::Request::Api do
20
21
  end
21
22
  end
22
23
 
24
+ context '#api_path_prefix' do
25
+ subject { described_class.new(nil).api_path_prefix }
26
+
27
+ it 'should take API path prefix from API host' do
28
+ allow(config).to receive(:api_host).and_return('http://api.org/api/v1')
29
+ expect( subject ).to eql '/api/v1'
30
+ end
31
+ end
32
+
23
33
  context '#response' do
24
34
  before do
25
- config = Callapi::Config
26
35
  allow(config).to receive(:request_strategy).and_return(described_class)
27
36
  allow(config).to receive(:api_host).and_return('http://api.org')
28
37
  stub_request(:get, 'http://api.org/users').to_return(status: 200, body: '')
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: callapi
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.8.2
4
+ version: 0.8.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Kacper Walanus
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-02-09 00:00:00.000000000 Z
11
+ date: 2015-02-15 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -191,7 +191,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
191
191
  requirements:
192
192
  - - ">="
193
193
  - !ruby/object:Gem::Version
194
- version: '0'
194
+ version: '2.0'
195
195
  required_rubygems_version: !ruby/object:Gem::Requirement
196
196
  requirements:
197
197
  - - ">="