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 +4 -4
- data/README.md +2 -1
- data/callapi.gemspec +3 -0
- data/lib/callapi/call/base.rb +4 -6
- data/lib/callapi/call/request/api.rb +8 -1
- data/lib/callapi/call/request/http.rb +3 -8
- data/lib/callapi/call/request/http/log_helper.rb +32 -8
- data/lib/callapi/config.rb +1 -1
- data/lib/callapi/routes.rb +39 -18
- data/lib/callapi/routes/metadata.rb +1 -0
- data/lib/callapi/version.rb +1 -1
- data/spec/spec_helper.rb +1 -1
- data/spec/unit/call/request/api_spec.rb +11 -2
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 02bc23118c163ba3958e49a25c0cfe96cb39fc53
|
4
|
+
data.tar.gz: b89debc1a4a2ab08d51e0417cbc00c800307a412
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4c2c444d6e38be1c9268215bb33a103f1a3cccfa36c42d6965f8ec85ac4f1b107d1d52f17daf1196f55c375f441ccc2cdd3e6049f3f84ed43e4c243d7e8ea0d2
|
7
|
+
data.tar.gz: 2b84398197f954df3a1d222ddcc379856f2c03ad1e048fd43d6ece3ba3e9b2fe1950e5ac1b18b05cabffc2bde93a10391bacf65bf0a1fb53cf3dbee5ffd7802c
|
data/README.md
CHANGED
data/callapi.gemspec
CHANGED
@@ -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
|
data/lib/callapi/call/base.rb
CHANGED
@@ -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 =
|
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
|
-
|
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
|
-
|
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
|
-
|
38
|
-
|
39
|
-
|
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
|
data/lib/callapi/config.rb
CHANGED
@@ -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
|
data/lib/callapi/routes.rb
CHANGED
@@ -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
|
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
|
-
|
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
|
-
|
72
|
-
|
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
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
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
|
data/lib/callapi/version.rb
CHANGED
data/spec/spec_helper.rb
CHANGED
@@ -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.
|
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-
|
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
|
- - ">="
|