dialers 0.1.0
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 +7 -0
- data/.gitignore +10 -0
- data/.rbenv-vars-example +4 -0
- data/.rspec +5 -0
- data/.rubocop.yml +89 -0
- data/.travis.yml +4 -0
- data/Gemfile +4 -0
- data/Guardfile +16 -0
- data/LICENSE.txt +21 -0
- data/NOTES.md +60 -0
- data/README.md +143 -0
- data/Rakefile +1 -0
- data/bin/_guard-core +16 -0
- data/bin/console +7 -0
- data/bin/guard +16 -0
- data/bin/rspec +16 -0
- data/bin/setup +7 -0
- data/dialers.gemspec +37 -0
- data/examples/github/api.rb +19 -0
- data/examples/github/api_caller.rb +27 -0
- data/examples/github/usage.rb +12 -0
- data/examples/twitter/api.rb +27 -0
- data/examples/twitter/api_caller.rb +43 -0
- data/examples/twitter/usage.rb +16 -0
- data/lib/dialers.rb +13 -0
- data/lib/dialers/assign_attributes.rb +20 -0
- data/lib/dialers/caller.rb +128 -0
- data/lib/dialers/errors.rb +77 -0
- data/lib/dialers/request_options.rb +5 -0
- data/lib/dialers/short_circuit.rb +18 -0
- data/lib/dialers/short_circuits_collection.rb +27 -0
- data/lib/dialers/status.rb +82 -0
- data/lib/dialers/transformable.rb +84 -0
- data/lib/dialers/version.rb +3 -0
- data/lib/dialers/wrapper.rb +34 -0
- metadata +260 -0
@@ -0,0 +1,27 @@
|
|
1
|
+
module Dialers
|
2
|
+
class ShortCircuitsCollection
|
3
|
+
ResponseLambda = -> (_response) { nil }
|
4
|
+
|
5
|
+
def initialize
|
6
|
+
self.collection = []
|
7
|
+
end
|
8
|
+
|
9
|
+
def add(options)
|
10
|
+
collection << Dialers::ShortCircuit.new(options.fetch(:if), options.fetch(:do))
|
11
|
+
end
|
12
|
+
|
13
|
+
def search_for_stops(response)
|
14
|
+
short_circuit = collection.find do |item|
|
15
|
+
item.can_stop?(response)
|
16
|
+
end
|
17
|
+
|
18
|
+
if !short_circuit.nil?
|
19
|
+
short_circuit.stop(response)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
private
|
24
|
+
|
25
|
+
attr_accessor :collection
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,82 @@
|
|
1
|
+
module Dialers
|
2
|
+
# A wrapper over an HTTP status to answer some questions related to what a state means.
|
3
|
+
class Status
|
4
|
+
def initialize(status)
|
5
|
+
self.status = status
|
6
|
+
end
|
7
|
+
|
8
|
+
# @param code [Fixnum] The code to compare
|
9
|
+
# @return [Boolean] wether the status is the argument
|
10
|
+
def is?(code)
|
11
|
+
status.to_i == code.to_i
|
12
|
+
end
|
13
|
+
|
14
|
+
# @return [Boolean] wether the status is a 2xx one.
|
15
|
+
def success?
|
16
|
+
initial_letter == "2"
|
17
|
+
end
|
18
|
+
|
19
|
+
# @return [Boolean] wether the status is a 3xx one.
|
20
|
+
def redirect?
|
21
|
+
initial_letter == "3"
|
22
|
+
end
|
23
|
+
|
24
|
+
# @return [Boolean] wether the status is a 4xx one.
|
25
|
+
def client_error?
|
26
|
+
initial_letter == "4"
|
27
|
+
end
|
28
|
+
|
29
|
+
# @return [Boolean] wether the status is a 5xx one.
|
30
|
+
def server_error?
|
31
|
+
initial_letter == "5"
|
32
|
+
end
|
33
|
+
|
34
|
+
# @return [Boolean] wether the status is 200.
|
35
|
+
def ok?
|
36
|
+
is?(200)
|
37
|
+
end
|
38
|
+
|
39
|
+
# @return [Boolean] wether the status is 201.
|
40
|
+
def created?
|
41
|
+
is?(201)
|
42
|
+
end
|
43
|
+
|
44
|
+
# @return [Boolean] wether the status is 202.
|
45
|
+
def accepted?
|
46
|
+
is?(202)
|
47
|
+
end
|
48
|
+
|
49
|
+
# @return [Boolean] wether the status is 204.
|
50
|
+
def no_content?
|
51
|
+
is?(204)
|
52
|
+
end
|
53
|
+
|
54
|
+
# @return [Boolean] wether the status is 400.
|
55
|
+
def bad_request?
|
56
|
+
is?(400)
|
57
|
+
end
|
58
|
+
|
59
|
+
# @return [Boolean] wether the status is 401.
|
60
|
+
def unauthorized?
|
61
|
+
is?(401)
|
62
|
+
end
|
63
|
+
|
64
|
+
# @return [Boolean] wether the status is 404.
|
65
|
+
def not_found?
|
66
|
+
is?(404)
|
67
|
+
end
|
68
|
+
|
69
|
+
# @return [Boolean] wether the status is 405.
|
70
|
+
def method_not_allowed?
|
71
|
+
is?(405)
|
72
|
+
end
|
73
|
+
|
74
|
+
private
|
75
|
+
|
76
|
+
def initial_letter
|
77
|
+
@initial_letter ||= status.to_s[0]
|
78
|
+
end
|
79
|
+
|
80
|
+
attr_accessor :status
|
81
|
+
end
|
82
|
+
end
|
@@ -0,0 +1,84 @@
|
|
1
|
+
module Dialers
|
2
|
+
# This class provide some ways to transform a reponse into an object or a set of objects
|
3
|
+
# based on what objects the user of this class wants to provide.
|
4
|
+
class Transformable
|
5
|
+
def initialize(response)
|
6
|
+
self.response = response
|
7
|
+
self.raw_data = response.body
|
8
|
+
end
|
9
|
+
|
10
|
+
# Transforms a response into one object based on the response's body.
|
11
|
+
#
|
12
|
+
# If you pass a hash like this:
|
13
|
+
#
|
14
|
+
# { 200 => ProductCreated, 202 => ProductAccepted }
|
15
|
+
#
|
16
|
+
# the transformation will decide which object to create based on the status.
|
17
|
+
#
|
18
|
+
# It's important to note that the class must provide attribute writers for this method to be
|
19
|
+
# able to fill an object with the responses's body data.
|
20
|
+
#
|
21
|
+
# @param entity_class_or_decider [Hash, Class] A class or a hash of Fixnum => Class
|
22
|
+
# to decide with the status.
|
23
|
+
# @param root [String, nil] The root to use to get the object from the body.
|
24
|
+
#
|
25
|
+
# @return [Object] The result of the transformation.
|
26
|
+
def transform_to_one(entity_class_or_decider, root: nil)
|
27
|
+
object = root ? raw_data[root] : raw_data
|
28
|
+
transform_attributes_to_object(entity_class_or_decider, object)
|
29
|
+
end
|
30
|
+
|
31
|
+
# Transforms a response into many objects based on the response's body.
|
32
|
+
#
|
33
|
+
# @param entity_class_or_decider [Hash, Class] A class or a hash of Fixnum => Class
|
34
|
+
# to decide with the status.
|
35
|
+
# @param root [String, nil] The root to use to get an array from the body.
|
36
|
+
#
|
37
|
+
# @return [Array<Object>] The result of the transformation.
|
38
|
+
def transform_to_many(entity_class_or_decider, root: nil)
|
39
|
+
items = get_rooted_items(root)
|
40
|
+
unless items.is_a?(Array)
|
41
|
+
fail Dialers::ImpossibleTranformationError.new(response)
|
42
|
+
end
|
43
|
+
items.map { |item| transform_attributes_to_object(entity_class_or_decider, item) }
|
44
|
+
end
|
45
|
+
|
46
|
+
# Returns the raw body of the request.
|
47
|
+
# @return [Hash, Array] the raw body of the request.
|
48
|
+
def as_received
|
49
|
+
raw_data
|
50
|
+
end
|
51
|
+
|
52
|
+
private
|
53
|
+
|
54
|
+
attr_accessor :raw_data, :response
|
55
|
+
|
56
|
+
def transform_attributes_to_object(entity_class_or_decider, attributes)
|
57
|
+
entity_class = decide_entity_class(entity_class_or_decider)
|
58
|
+
if entity_class.nil?
|
59
|
+
fail Dialers::ResponseError.new(response)
|
60
|
+
else
|
61
|
+
Dialers::AssignAttributes.call(entity_class.new, attributes)
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
def decide_entity_class(entity_class_or_decider)
|
66
|
+
case entity_class_or_decider
|
67
|
+
when Class
|
68
|
+
entity_class_or_decider
|
69
|
+
when Hash
|
70
|
+
entity_class_or_decider[response.status]
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
def get_rooted_items(root)
|
75
|
+
if root.nil?
|
76
|
+
raw_data
|
77
|
+
elsif raw_data.is_a?(Array)
|
78
|
+
raw_data
|
79
|
+
else
|
80
|
+
raw_data[root]
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
module Dialers
|
2
|
+
# This class is just a convenience to this:
|
3
|
+
#
|
4
|
+
# class Anything
|
5
|
+
# def api_caller
|
6
|
+
# @api_caller ||= ApiCaller.new
|
7
|
+
# end
|
8
|
+
# end
|
9
|
+
#
|
10
|
+
# Instead, you can wrap it like this:
|
11
|
+
#
|
12
|
+
# class Anything < Dialers::Wrapper
|
13
|
+
# api_caller { ApiCaller.new }
|
14
|
+
# end
|
15
|
+
#
|
16
|
+
# The major reason of the existence of this class is to provide a place to add future
|
17
|
+
# improvements like automatic injection of callers within Rails based on conventions and
|
18
|
+
# methods and patterns that may arise in the future.
|
19
|
+
#
|
20
|
+
class Wrapper
|
21
|
+
# Defines the api caller instance to use on all wrappers.
|
22
|
+
#
|
23
|
+
# api_caller { ApiCaller.new }
|
24
|
+
#
|
25
|
+
def self.api_caller(&block)
|
26
|
+
define_method(:api_caller) do
|
27
|
+
@api_caller ||= block.call
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
# Returns the value of the `api_caller` as defined by the {api_caller} class method
|
32
|
+
attr_reader :api_caller
|
33
|
+
end
|
34
|
+
end
|
metadata
ADDED
@@ -0,0 +1,260 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: dialers
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- juliogarciag
|
8
|
+
autorequire:
|
9
|
+
bindir: exe
|
10
|
+
cert_chain: []
|
11
|
+
date: 2015-09-02 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: faraday
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ~>
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0.9'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ~>
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0.9'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: faraday_middleware
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ~>
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0.9'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ~>
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0.9'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: faraday-conductivity
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ~>
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0.3'
|
48
|
+
type: :runtime
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ~>
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0.3'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: bundler
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ~>
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '1.10'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ~>
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '1.10'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: rake
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - ~>
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '10.0'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - ~>
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '10.0'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: rspec
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - ~>
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '3.3'
|
90
|
+
type: :development
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - ~>
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '3.3'
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: pry
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - ~>
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: '0.10'
|
104
|
+
type: :development
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - ~>
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '0.10'
|
111
|
+
- !ruby/object:Gem::Dependency
|
112
|
+
name: guard
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
114
|
+
requirements:
|
115
|
+
- - ~>
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: '2.13'
|
118
|
+
type: :development
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
requirements:
|
122
|
+
- - ~>
|
123
|
+
- !ruby/object:Gem::Version
|
124
|
+
version: '2.13'
|
125
|
+
- !ruby/object:Gem::Dependency
|
126
|
+
name: guard-rspec
|
127
|
+
requirement: !ruby/object:Gem::Requirement
|
128
|
+
requirements:
|
129
|
+
- - ~>
|
130
|
+
- !ruby/object:Gem::Version
|
131
|
+
version: '4.6'
|
132
|
+
type: :development
|
133
|
+
prerelease: false
|
134
|
+
version_requirements: !ruby/object:Gem::Requirement
|
135
|
+
requirements:
|
136
|
+
- - ~>
|
137
|
+
- !ruby/object:Gem::Version
|
138
|
+
version: '4.6'
|
139
|
+
- !ruby/object:Gem::Dependency
|
140
|
+
name: rspec-nc
|
141
|
+
requirement: !ruby/object:Gem::Requirement
|
142
|
+
requirements:
|
143
|
+
- - ~>
|
144
|
+
- !ruby/object:Gem::Version
|
145
|
+
version: '0.2'
|
146
|
+
type: :development
|
147
|
+
prerelease: false
|
148
|
+
version_requirements: !ruby/object:Gem::Requirement
|
149
|
+
requirements:
|
150
|
+
- - ~>
|
151
|
+
- !ruby/object:Gem::Version
|
152
|
+
version: '0.2'
|
153
|
+
- !ruby/object:Gem::Dependency
|
154
|
+
name: rspec-legacy_formatters
|
155
|
+
requirement: !ruby/object:Gem::Requirement
|
156
|
+
requirements:
|
157
|
+
- - ~>
|
158
|
+
- !ruby/object:Gem::Version
|
159
|
+
version: '1.0'
|
160
|
+
type: :development
|
161
|
+
prerelease: false
|
162
|
+
version_requirements: !ruby/object:Gem::Requirement
|
163
|
+
requirements:
|
164
|
+
- - ~>
|
165
|
+
- !ruby/object:Gem::Version
|
166
|
+
version: '1.0'
|
167
|
+
- !ruby/object:Gem::Dependency
|
168
|
+
name: simple_oauth
|
169
|
+
requirement: !ruby/object:Gem::Requirement
|
170
|
+
requirements:
|
171
|
+
- - ~>
|
172
|
+
- !ruby/object:Gem::Version
|
173
|
+
version: '0.3'
|
174
|
+
type: :development
|
175
|
+
prerelease: false
|
176
|
+
version_requirements: !ruby/object:Gem::Requirement
|
177
|
+
requirements:
|
178
|
+
- - ~>
|
179
|
+
- !ruby/object:Gem::Version
|
180
|
+
version: '0.3'
|
181
|
+
- !ruby/object:Gem::Dependency
|
182
|
+
name: patron
|
183
|
+
requirement: !ruby/object:Gem::Requirement
|
184
|
+
requirements:
|
185
|
+
- - ~>
|
186
|
+
- !ruby/object:Gem::Version
|
187
|
+
version: '0.4'
|
188
|
+
type: :development
|
189
|
+
prerelease: false
|
190
|
+
version_requirements: !ruby/object:Gem::Requirement
|
191
|
+
requirements:
|
192
|
+
- - ~>
|
193
|
+
- !ruby/object:Gem::Version
|
194
|
+
version: '0.4'
|
195
|
+
description: Api Wrappers for Ruby
|
196
|
+
email:
|
197
|
+
- julioggonz@gmail.com
|
198
|
+
executables: []
|
199
|
+
extensions: []
|
200
|
+
extra_rdoc_files: []
|
201
|
+
files:
|
202
|
+
- .gitignore
|
203
|
+
- .rbenv-vars-example
|
204
|
+
- .rspec
|
205
|
+
- .rubocop.yml
|
206
|
+
- .travis.yml
|
207
|
+
- Gemfile
|
208
|
+
- Guardfile
|
209
|
+
- LICENSE.txt
|
210
|
+
- NOTES.md
|
211
|
+
- README.md
|
212
|
+
- Rakefile
|
213
|
+
- bin/_guard-core
|
214
|
+
- bin/console
|
215
|
+
- bin/guard
|
216
|
+
- bin/rspec
|
217
|
+
- bin/setup
|
218
|
+
- dialers.gemspec
|
219
|
+
- examples/github/api.rb
|
220
|
+
- examples/github/api_caller.rb
|
221
|
+
- examples/github/usage.rb
|
222
|
+
- examples/twitter/api.rb
|
223
|
+
- examples/twitter/api_caller.rb
|
224
|
+
- examples/twitter/usage.rb
|
225
|
+
- lib/dialers.rb
|
226
|
+
- lib/dialers/assign_attributes.rb
|
227
|
+
- lib/dialers/caller.rb
|
228
|
+
- lib/dialers/errors.rb
|
229
|
+
- lib/dialers/request_options.rb
|
230
|
+
- lib/dialers/short_circuit.rb
|
231
|
+
- lib/dialers/short_circuits_collection.rb
|
232
|
+
- lib/dialers/status.rb
|
233
|
+
- lib/dialers/transformable.rb
|
234
|
+
- lib/dialers/version.rb
|
235
|
+
- lib/dialers/wrapper.rb
|
236
|
+
homepage: https://github.com/platanus/dialers
|
237
|
+
licenses:
|
238
|
+
- MIT
|
239
|
+
metadata: {}
|
240
|
+
post_install_message:
|
241
|
+
rdoc_options: []
|
242
|
+
require_paths:
|
243
|
+
- lib
|
244
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
245
|
+
requirements:
|
246
|
+
- - '>='
|
247
|
+
- !ruby/object:Gem::Version
|
248
|
+
version: '0'
|
249
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
250
|
+
requirements:
|
251
|
+
- - '>='
|
252
|
+
- !ruby/object:Gem::Version
|
253
|
+
version: '0'
|
254
|
+
requirements: []
|
255
|
+
rubyforge_project:
|
256
|
+
rubygems_version: 2.4.7
|
257
|
+
signing_key:
|
258
|
+
specification_version: 4
|
259
|
+
summary: Api Wrappers for Ruby
|
260
|
+
test_files: []
|