wor-requests 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.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 5ed50703665ba94d25a38f3c8ef8a724ca7d4a0d
4
+ data.tar.gz: 2b894c7322b3ab4e87735bcb9579704a90693512
5
+ SHA512:
6
+ metadata.gz: b25426b8bc4ad40adbcbe342bb82cc174e7436b45622b418f4eb2e2e4100e379b01f836152f3f6eb9b534018d1dfd2233ccc32b18b3d818d432dca75e536893b
7
+ data.tar.gz: aa81d67f150c70e1ffd44d56888915ef2868dcaf199bff36b5b207e9b7862a2323d3b81f25f8924bca48b78861cecbafae3d6b632dc893fa3a33ec014af4c881
@@ -0,0 +1,326 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /Gemfile.lock
4
+ /_yardoc/
5
+ /coverage/
6
+ /doc/
7
+ /pkg/
8
+ /spec/reports/
9
+ /tmp/
10
+ *.gem
11
+
12
+ # Created by https://www.gitignore.io/api/ruby,rubymine,rails,emacs,vim,sublimetext,osx,macos,linux,windows
13
+
14
+ ### Emacs ###
15
+ # -*- mode: gitignore; -*-
16
+ *~
17
+ \#*\#
18
+ /.emacs.desktop
19
+ /.emacs.desktop.lock
20
+ *.elc
21
+ auto-save-list
22
+ tramp
23
+ .\#*
24
+
25
+ # Org-mode
26
+ .org-id-locations
27
+ *_archive
28
+
29
+ # flymake-mode
30
+ *_flymake.*
31
+
32
+ # eshell files
33
+ /eshell/history
34
+ /eshell/lastdir
35
+
36
+ # elpa packages
37
+ /elpa/
38
+
39
+ # reftex files
40
+ *.rel
41
+
42
+ # AUCTeX auto folder
43
+ /auto/
44
+
45
+ # cask packages
46
+ .cask/
47
+ dist/
48
+
49
+ # Flycheck
50
+ flycheck_*.el
51
+
52
+ # server auth directory
53
+ /server/
54
+
55
+ # projectiles files
56
+ .projectile
57
+
58
+ # directory configuration
59
+ .dir-locals.el
60
+
61
+ ### Linux ###
62
+
63
+ # temporary files which can be created if a process still has a handle open of a deleted file
64
+ .fuse_hidden*
65
+
66
+ # KDE directory preferences
67
+ .directory
68
+
69
+ # Linux trash folder which might appear on any partition or disk
70
+ .Trash-*
71
+
72
+ # .nfs files are created when an open file is removed but is still being accessed
73
+ .nfs*
74
+
75
+ ### macOS ###
76
+ *.DS_Store
77
+ .AppleDouble
78
+ .LSOverride
79
+
80
+ # Icon must end with two \r
81
+ Icon
82
+
83
+
84
+ # Thumbnails
85
+ ._*
86
+
87
+ # Files that might appear in the root of a volume
88
+ .DocumentRevisions-V100
89
+ .fseventsd
90
+ .Spotlight-V100
91
+ .TemporaryItems
92
+ .Trashes
93
+ .VolumeIcon.icns
94
+ .com.apple.timemachine.donotpresent
95
+
96
+ # Directories potentially created on remote AFP share
97
+ .AppleDB
98
+ .AppleDesktop
99
+ Network Trash Folder
100
+ Temporary Items
101
+ .apdisk
102
+
103
+ ### OSX ###
104
+
105
+ # Icon must end with two \r
106
+
107
+
108
+ # Thumbnails
109
+
110
+ # Files that might appear in the root of a volume
111
+
112
+ # Directories potentially created on remote AFP share
113
+
114
+ ### Rails ###
115
+ *.rbc
116
+ capybara-*.html
117
+ .rspec
118
+ /log
119
+ /tmp
120
+ /db/*.sqlite3
121
+ /db/*.sqlite3-journal
122
+ /public/system
123
+ /coverage/
124
+ /spec/tmp
125
+ **.orig
126
+ rerun.txt
127
+ pickle-email-*.html
128
+
129
+ # TODO Comment out this rule if you are OK with secrets being uploaded to the repo
130
+ config/initializers/secret_token.rb
131
+
132
+ # Only include if you have production secrets in this file, which is no longer a Rails default
133
+ # config/secrets.yml
134
+
135
+ # dotenv
136
+ # TODO Comment out this rule if environment variables can be committed
137
+ .env
138
+
139
+ ## Environment normalization:
140
+ /.bundle
141
+ /vendor/bundle
142
+
143
+ # these should all be checked in to normalize the environment:
144
+ # Gemfile.lock, .ruby-version, .ruby-gemset
145
+
146
+ # unless supporting rvm < 1.11.0 or doing something fancy, ignore this:
147
+ .rvmrc
148
+
149
+ # if using bower-rails ignore default bower_components path bower.json files
150
+ /vendor/assets/bower_components
151
+ *.bowerrc
152
+ bower.json
153
+
154
+ # Ignore pow environment settings
155
+ .powenv
156
+
157
+ # Ignore Byebug command history file.
158
+ .byebug_history
159
+
160
+ ### Ruby ###
161
+ *.gem
162
+ /.config
163
+ /InstalledFiles
164
+ /pkg/
165
+ /spec/reports/
166
+ /spec/examples.txt
167
+ /test/tmp/
168
+ /test/version_tmp/
169
+ /tmp/
170
+
171
+ # Used by dotenv library to load environment variables.
172
+ # .env
173
+
174
+ ## Specific to RubyMotion:
175
+ .dat*
176
+ .repl_history
177
+ build/
178
+ *.bridgesupport
179
+ build-iPhoneOS/
180
+ build-iPhoneSimulator/
181
+
182
+ ## Specific to RubyMotion (use of CocoaPods):
183
+ #
184
+ # We recommend against adding the Pods directory to your .gitignore. However
185
+ # you should judge for yourself, the pros and cons are mentioned at:
186
+ # https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control
187
+ #
188
+ # vendor/Pods/
189
+
190
+ ## Documentation cache and generated files:
191
+ /.yardoc/
192
+ /_yardoc/
193
+ /doc/
194
+ /rdoc/
195
+
196
+ ## Environment normalization:
197
+ /.bundle/
198
+ /lib/bundler/man/
199
+
200
+ # for a library or gem, you might want to ignore these files since the code is
201
+ # intended to run in multiple environments; otherwise, check them in:
202
+ # Gemfile.lock
203
+ # .ruby-version
204
+ # .ruby-gemset
205
+
206
+ # unless supporting rvm < 1.11.0 or doing something fancy, ignore this:
207
+
208
+ ### RubyMine ###
209
+ # Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio and Webstorm
210
+ # Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839
211
+
212
+ # User-specific stuff:
213
+ .idea/**/workspace.xml
214
+ .idea/**/tasks.xml
215
+
216
+ # Sensitive or high-churn files:
217
+ .idea/**/dataSources/
218
+ .idea/**/dataSources.ids
219
+ .idea/**/dataSources.xml
220
+ .idea/**/dataSources.local.xml
221
+ .idea/**/sqlDataSources.xml
222
+ .idea/**/dynamic.xml
223
+ .idea/**/uiDesigner.xml
224
+
225
+ # Gradle:
226
+ .idea/**/gradle.xml
227
+ .idea/**/libraries
228
+
229
+ # Mongo Explorer plugin:
230
+ .idea/**/mongoSettings.xml
231
+
232
+ ## File-based project format:
233
+ *.iws
234
+
235
+ ## Plugin-specific files:
236
+
237
+ # IntelliJ
238
+ /out/
239
+
240
+ # mpeltonen/sbt-idea plugin
241
+ .idea_modules/
242
+
243
+ # JIRA plugin
244
+ atlassian-ide-plugin.xml
245
+
246
+ # Crashlytics plugin (for Android Studio and IntelliJ)
247
+ com_crashlytics_export_strings.xml
248
+ crashlytics.properties
249
+ crashlytics-build.properties
250
+ fabric.properties
251
+
252
+ ### RubyMine Patch ###
253
+ # Comment Reason: https://github.com/joeblau/gitignore.io/issues/186#issuecomment-215987721
254
+
255
+ # *.iml
256
+ # modules.xml
257
+ # .idea/misc.xml
258
+ # *.ipr
259
+
260
+ ### SublimeText ###
261
+ # cache files for sublime text
262
+ *.tmlanguage.cache
263
+ *.tmPreferences.cache
264
+ *.stTheme.cache
265
+
266
+ # workspace files are user-specific
267
+ *.sublime-workspace
268
+
269
+ # project files should be checked into the repository, unless a significant
270
+ # proportion of contributors will probably not be using SublimeText
271
+ # *.sublime-project
272
+
273
+ # sftp configuration file
274
+ sftp-config.json
275
+
276
+ # Package control specific files
277
+ Package Control.last-run
278
+ Package Control.ca-list
279
+ Package Control.ca-bundle
280
+ Package Control.system-ca-bundle
281
+ Package Control.cache/
282
+ Package Control.ca-certs/
283
+ Package Control.merged-ca-bundle
284
+ Package Control.user-ca-bundle
285
+ oscrypto-ca-bundle.crt
286
+ bh_unicode_properties.cache
287
+
288
+ # Sublime-github package stores a github token in this file
289
+ # https://packagecontrol.io/packages/sublime-github
290
+ GitHub.sublime-settings
291
+
292
+ ### Vim ###
293
+ # swap
294
+ [._]*.s[a-v][a-z]
295
+ [._]*.sw[a-p]
296
+ [._]s[a-v][a-z]
297
+ [._]sw[a-p]
298
+ # session
299
+ Session.vim
300
+ # temporary
301
+ .netrwhist
302
+ # auto-generated tag files
303
+ tags
304
+
305
+ ### Windows ###
306
+ # Windows thumbnail cache files
307
+ Thumbs.db
308
+ ehthumbs.db
309
+ ehthumbs_vista.db
310
+
311
+ # Folder config file
312
+ Desktop.ini
313
+
314
+ # Recycle Bin used on file shares
315
+ $RECYCLE.BIN/
316
+
317
+ # Windows Installer files
318
+ *.cab
319
+ *.msi
320
+ *.msm
321
+ *.msp
322
+
323
+ # Windows shortcuts
324
+ *.lnk
325
+
326
+ # End of https://www.gitignore.io/api/ruby,rubymine,rails,emacs,vim,sublimetext,osx,macos,linux,windows
@@ -0,0 +1,12 @@
1
+ AllCops:
2
+ Exclude:
3
+ - wor-requests.gemspec
4
+
5
+ Documentation:
6
+ Enabled: false
7
+
8
+ LineLength:
9
+ Max: 99
10
+
11
+ FrozenStringLiteralComment:
12
+ Enabled: false
@@ -0,0 +1,14 @@
1
+ language: ruby
2
+ rvm:
3
+ - 2.2.2
4
+ - 2.3.3
5
+ - 2.4.0
6
+
7
+ install:
8
+ - gem install bundler
9
+ - bundle install --retry=3
10
+
11
+ script:
12
+ - bundle exec rspec
13
+ - bundle exec rubocop -R --format simple
14
+ - bundle exec codeclimate-test-reporter
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in wor-requests.gemspec
4
+ gemspec
@@ -0,0 +1,21 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2017 Wolox
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in
13
+ all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ THE SOFTWARE.
@@ -0,0 +1,102 @@
1
+ # Wolox on Rails - Requests
2
+ [![Gem Version](https://badge.fury.io/rb/wor-requests.svg)](https://badge.fury.io/rb/wor-requests)
3
+ [![Dependency Status](https://gemnasium.com/badges/github.com/Wolox/wor-requests.svg)](https://gemnasium.com/github.com/Wolox/wor-requests)
4
+ [![Build Status](https://travis-ci.org/Wolox/wor-requests.svg)](https://travis-ci.org/Wolox/wor-requests)
5
+ [![Code Climate](https://codeclimate.com/github/Wolox/wor-requests/badges/gpa.svg)](https://codeclimate.com/github/Wolox/wor-requests)
6
+ [![Test Coverage](https://codeclimate.com/github/Wolox/wor-requests/badges/coverage.svg)](https://codeclimate.com/github/Wolox/wor-requests/coverage)
7
+
8
+ Make external requests in you service objects, with easy logging and error handling!
9
+
10
+ ## Installation
11
+
12
+ Add this line to your application's Gemfile:
13
+
14
+ ```ruby
15
+ gem 'wor-requests'
16
+ ```
17
+
18
+ And then execute:
19
+
20
+ $ bundle
21
+
22
+ Or install it yourself as:
23
+
24
+ $ gem install wor-requests
25
+
26
+ Then you can run `rails generate wor:requests:install` to create the initializer:
27
+
28
+ ```ruby
29
+ # config/initializers/wor_requests.rb
30
+
31
+ Wor::Requests.configure do |config|
32
+ config.logger = Rails.logger
33
+ end
34
+ ```
35
+
36
+ ## Usage
37
+
38
+ To write your first Service using Wor-requests you can write something like this:
39
+
40
+ ```ruby
41
+ require 'wor/requests'
42
+
43
+ class GithubService < Wor::Requests::Base
44
+ def repositories(username)
45
+ get(
46
+ attempting_to: "get repositories of #{username}",
47
+ path: "/users/#{username}/repos"
48
+ )
49
+ rescue Wor::Requests::RequestError => e
50
+ puts e.message
51
+ end
52
+
53
+ protected
54
+
55
+ def base_url
56
+ 'https://api.github.com'
57
+ end
58
+ end
59
+
60
+ puts GithubService.new.repositories('alebian')
61
+ ```
62
+
63
+ Or, even easier, run `rails generate wor:requests:service NAME` in your Rails root
64
+
65
+ ## Contributing
66
+
67
+ 1. Fork it
68
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
69
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
70
+ 4. Run rubocop lint (`rubocop -R --format simple`)
71
+ 5. Run rspec tests (`bundle exec rspec`)
72
+ 6. Push your branch (`git push origin my-new-feature`)
73
+ 7. Create a new Pull Request
74
+
75
+ ## About ##
76
+
77
+ This project is maintained by [Diego Raffo](https://github.com/enanodr) along with [Michel Agopian](https://github.com/mishuagopian) and it was written by [Wolox](http://www.wolox.com.ar).
78
+ ![Wolox](https://raw.githubusercontent.com/Wolox/press-kit/master/logos/logo_banner.png)
79
+
80
+ ## License
81
+
82
+ **wor-requests** is available under the MIT [license](https://raw.githubusercontent.com/Wolox/wor-requests/master/LICENSE.md).
83
+
84
+ Copyright (c) 2017 Wolox
85
+
86
+ Permission is hereby granted, free of charge, to any person obtaining a copy
87
+ of this software and associated documentation files (the "Software"), to deal
88
+ in the Software without restriction, including without limitation the rights
89
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
90
+ copies of the Software, and to permit persons to whom the Software is
91
+ furnished to do so, subject to the following conditions:
92
+
93
+ The above copyright notice and this permission notice shall be included in
94
+ all copies or substantial portions of the Software.
95
+
96
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
97
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
98
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
99
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
100
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
101
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
102
+ THE SOFTWARE.
@@ -0,0 +1,6 @@
1
+ require 'bundler/gem_tasks'
2
+ require 'rspec/core/rake_task'
3
+
4
+ RSpec::Core::RakeTask.new(:spec)
5
+
6
+ task default: :spec
@@ -0,0 +1,17 @@
1
+ class <%= class_name %>Service < Wor::Requests::Base
2
+ # An example of how to get all repositories for the specified user in github.com
3
+ # def repositories(username)
4
+ # get(
5
+ # attempting_to: "get repositories of #{username}",
6
+ # path: "/users/#{username}/repos"
7
+ # )
8
+ # rescue Wor::Requests::RequestError => e
9
+ # puts e.message
10
+ # end
11
+
12
+ # protected
13
+
14
+ # def base_url
15
+ # 'https://api.github.com'
16
+ # end
17
+ end
@@ -0,0 +1,3 @@
1
+ Wor::Requests.configure do |config|
2
+ config.logger = Rails.logger
3
+ end
@@ -0,0 +1,14 @@
1
+ module Wor
2
+ module Requests
3
+ module Generators
4
+ class InstallGenerator < Rails::Generators::Base
5
+ source_root File.expand_path('../../../templates', __FILE__)
6
+ desc 'Creates Wor-requests initializer for your application'
7
+
8
+ def copy_initializer
9
+ template 'wor_requests.rb', 'config/initializers/wor_requests.rb'
10
+ end
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,14 @@
1
+ module Wor
2
+ module Requests
3
+ module Generators
4
+ class ServiceGenerator < Rails::Generators::NamedBase
5
+ source_root File.expand_path('../../../templates', __FILE__)
6
+ desc 'Creates Wor-requests service for your application'
7
+
8
+ def create_service
9
+ template 'base_service.rb.erb', "app/services/#{plural_name}_service.rb"
10
+ end
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,40 @@
1
+ require_relative 'requests/base'
2
+ require_relative 'requests/request_error'
3
+ require_relative 'requests/version'
4
+ require 'logger'
5
+
6
+ module Wor
7
+ module Requests
8
+ VALID_RESPONSE_TYPES = [:json].freeze
9
+
10
+ @config = {
11
+ logger: Logger.new(STDOUT),
12
+ default_response_type: :json
13
+ }
14
+
15
+ def self.configure
16
+ yield self
17
+ end
18
+
19
+ def self.logger=(logger)
20
+ @config[:logger] = logger
21
+ end
22
+
23
+ def self.default_response_type=(type)
24
+ return unless VALID_RESPONSE_TYPES.include?(type)
25
+ @config[:default_response_type] = type
26
+ end
27
+
28
+ def self.config
29
+ @config
30
+ end
31
+
32
+ def self.logger
33
+ @config[:logger]
34
+ end
35
+
36
+ def self.default_response_type
37
+ @config[:default_response_type]
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,160 @@
1
+ require 'uri'
2
+ require 'httparty'
3
+ require 'json'
4
+
5
+ # rubocop:disable ClassLength
6
+ module Wor
7
+ module Requests
8
+ class Base
9
+ VALID_HTTP_VERBS = %i(get post patch put delete).freeze
10
+
11
+ # According to RFC 7231
12
+ COMMON_ATTRIBUTES = %i(path headers attempting_to response_type).freeze
13
+ HAS_QUERY = [:query].freeze
14
+ HAS_BODY = [:body].freeze
15
+ HTTP_COMPLETE = (COMMON_ATTRIBUTES + HAS_QUERY + HAS_BODY).freeze
16
+ HTTP_QUERY_ONLY = (COMMON_ATTRIBUTES + HAS_QUERY).freeze
17
+ GET_ATTRIBUTES = HTTP_QUERY_ONLY
18
+ POST_ATTRIBUTES = HTTP_COMPLETE
19
+ PATCH_ATTRIBUTES = HTTP_COMPLETE
20
+ PUT_ATTRIBUTES = HTTP_COMPLETE
21
+ DELETE_ATTRIBUTES = HTTP_QUERY_ONLY
22
+
23
+ # Define the methods:
24
+ # - get(opts = {}, &block)
25
+ # - post(opts = {}, &block)
26
+ # - patch(opts = {}, &block)
27
+ # - put(opts = {}, &block)
28
+ # - delete(opts = {}, &block)
29
+ VALID_HTTP_VERBS.each do |method|
30
+ define_method(method) do |opts = {}, &block|
31
+ method_attributes = constantize("#{method.upcase}_ATTRIBUTES")
32
+ unpermitted_attributes = opts.keys - method_attributes
33
+ unless unpermitted_attributes.empty?
34
+ raise Wor::Requests::InvalidOptionsError.new(method_attributes, unpermitted_attributes)
35
+ end
36
+
37
+ request(opts.merge(method: method), &block)
38
+ end
39
+ end
40
+
41
+ def request(options = {}, &block)
42
+ validate_method!(options[:method])
43
+
44
+ log_attempt(options[:attempting_to])
45
+ resp = HTTParty.send(options[:method], uri(options[:path]), request_parameters(options))
46
+
47
+ return after_success(resp, options, &block) if resp.success?
48
+ after_error(resp, options)
49
+ end
50
+
51
+ def logger
52
+ Wor::Requests.logger
53
+ end
54
+
55
+ protected
56
+
57
+ def base_url
58
+ raise NoMethodError, "Subclass must implement method: '#{__method__}'"
59
+ end
60
+
61
+ def external_api_name
62
+ self.class.name
63
+ end
64
+
65
+ def default_response_type
66
+ Wor::Requests.default_response_type
67
+ end
68
+
69
+ private
70
+
71
+ def after_success(response, options)
72
+ log_success(options[:attempting_to])
73
+
74
+ return yield(response) if block_given?
75
+ handle_response(response, options[:response_type])
76
+ end
77
+
78
+ def after_error(response, options)
79
+ log_error(response, options[:attempting_to])
80
+ raise Wor::Requests::RequestError.new(response), exception_message
81
+ end
82
+
83
+ def uri(path)
84
+ URI.join(formatted_base_url, formatted_path(path))
85
+ end
86
+
87
+ def formatted_base_url
88
+ base_url.last != '/' ? "#{base_url}/" : base_url
89
+ end
90
+
91
+ def formatted_path(path)
92
+ return '' if path.nil?
93
+ return path if path.first != '/'
94
+ path.slice!(0)
95
+ path
96
+ end
97
+
98
+ def log_success(attempt)
99
+ return unless present?(attempt)
100
+ logger.info "SUCCESS: #{attempt}"
101
+ end
102
+
103
+ def log_attempt(attempt)
104
+ return unless present?(attempt)
105
+ logger.info "ATTEMPTING TO: #{attempt}"
106
+ end
107
+
108
+ def log_error(response, attempting_to)
109
+ return unless present?(attempting_to)
110
+ response_error = "ERROR when trying to #{attempting_to}. "
111
+ response_error << "Got status code: #{response.code}. "
112
+ if present?(response.body)
113
+ response_error << "Response error: #{JSON.parse(response.body)}"
114
+ end
115
+ logger.error response_error
116
+ rescue => e
117
+ logger.error("#{response_error} ERROR while parsing response body: #{e.message}.")
118
+ end
119
+
120
+ def exception_message
121
+ "#{external_api_name} got an error. See logs for more information."
122
+ end
123
+
124
+ def request_parameters(options_hash)
125
+ answer = {}
126
+ answer[:body] = options_hash[:body] if present?(options_hash[:body])
127
+ answer[:query] = options_hash[:query] if present?(options_hash[:query])
128
+ answer[:headers] = options_hash[:headers] if present?(options_hash[:headers])
129
+ answer
130
+ end
131
+
132
+ def present?(object)
133
+ !object.nil?
134
+ end
135
+
136
+ def constantize(string)
137
+ self.class.class_eval(string)
138
+ end
139
+
140
+ def validate_method!(method)
141
+ return true if VALID_HTTP_VERBS.include?(method)
142
+ raise ArgumentError, "#{method} is not a valid method."
143
+ end
144
+
145
+ def response_type(type)
146
+ return type if Wor::Requests::VALID_RESPONSE_TYPES.include?(type)
147
+ default_response_type
148
+ end
149
+
150
+ def handle_response(response, response_type)
151
+ case response_type(response_type)
152
+ when :json
153
+ JSON.parse(response.body)
154
+ else
155
+ response.body
156
+ end
157
+ end
158
+ end
159
+ end
160
+ end
@@ -0,0 +1,13 @@
1
+ module Wor
2
+ module Requests
3
+ class InvalidOptionsError < StandardError
4
+ attr_reader :valid
5
+ attr_reader :invalid
6
+
7
+ def initialize(valid, invalid)
8
+ @valid = valid
9
+ @invalid = invalid
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,11 @@
1
+ module Wor
2
+ module Requests
3
+ class RequestError < StandardError
4
+ attr_reader :response
5
+
6
+ def initialize(response)
7
+ @response = response
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,5 @@
1
+ module Wor
2
+ module Requests
3
+ VERSION = '0.1.0'.freeze
4
+ end
5
+ end
@@ -0,0 +1,37 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'wor/requests/version'
5
+ require 'date'
6
+
7
+ Gem::Specification.new do |spec|
8
+ spec.name = 'wor-requests'
9
+ spec.version = Wor::Requests::VERSION
10
+ spec.platform = Gem::Platform::RUBY
11
+ spec.date = Date.today
12
+ spec.authors = ['draffo', 'mishuagopian']
13
+ spec.email = ['diego.raffo@wolox.com.ar', 'michel.agopian@wolox.com.ar']
14
+
15
+ spec.summary = 'Make external requests in you service objects, with easy logging and error handling!'
16
+ spec.description = 'Make external requests in you service objects, with easy logging and error handling!'
17
+ spec.homepage = 'https://github.com/Wolox/wor-requests'
18
+ spec.license = 'MIT'
19
+
20
+ spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec)/}) }
21
+ spec.test_files = spec.files.grep(%r{^(test|spec)/})
22
+ spec.require_paths = ['lib']
23
+
24
+ spec.add_dependency 'httparty', '~> 0.13'
25
+ spec.add_dependency 'railties', '>= 4.1.0', '< 5.1'
26
+
27
+ spec.add_development_dependency 'faker'
28
+ spec.add_development_dependency 'webmock'
29
+ spec.add_development_dependency 'byebug', '~> 9.0'
30
+ spec.add_development_dependency 'rubocop', '~> 0.47.0'
31
+ spec.add_development_dependency 'bundler', '~> 1.13'
32
+ spec.add_development_dependency 'rake', '~> 10.0'
33
+ spec.add_development_dependency 'rspec', '~> 3.0'
34
+ spec.add_development_dependency 'codeclimate-test-reporter', '~> 1.0.0'
35
+ spec.add_development_dependency 'generator_spec'
36
+ spec.add_development_dependency 'simplecov'
37
+ end
metadata ADDED
@@ -0,0 +1,240 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: wor-requests
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - draffo
8
+ - mishuagopian
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2017-05-03 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: httparty
16
+ requirement: !ruby/object:Gem::Requirement
17
+ requirements:
18
+ - - "~>"
19
+ - !ruby/object:Gem::Version
20
+ version: '0.13'
21
+ type: :runtime
22
+ prerelease: false
23
+ version_requirements: !ruby/object:Gem::Requirement
24
+ requirements:
25
+ - - "~>"
26
+ - !ruby/object:Gem::Version
27
+ version: '0.13'
28
+ - !ruby/object:Gem::Dependency
29
+ name: railties
30
+ requirement: !ruby/object:Gem::Requirement
31
+ requirements:
32
+ - - ">="
33
+ - !ruby/object:Gem::Version
34
+ version: 4.1.0
35
+ - - "<"
36
+ - !ruby/object:Gem::Version
37
+ version: '5.1'
38
+ type: :runtime
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ requirements:
42
+ - - ">="
43
+ - !ruby/object:Gem::Version
44
+ version: 4.1.0
45
+ - - "<"
46
+ - !ruby/object:Gem::Version
47
+ version: '5.1'
48
+ - !ruby/object:Gem::Dependency
49
+ name: faker
50
+ requirement: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ type: :development
56
+ prerelease: false
57
+ version_requirements: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ - !ruby/object:Gem::Dependency
63
+ name: webmock
64
+ requirement: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ type: :development
70
+ prerelease: false
71
+ version_requirements: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ - !ruby/object:Gem::Dependency
77
+ name: byebug
78
+ requirement: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '9.0'
83
+ type: :development
84
+ prerelease: false
85
+ version_requirements: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: '9.0'
90
+ - !ruby/object:Gem::Dependency
91
+ name: rubocop
92
+ requirement: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: 0.47.0
97
+ type: :development
98
+ prerelease: false
99
+ version_requirements: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - "~>"
102
+ - !ruby/object:Gem::Version
103
+ version: 0.47.0
104
+ - !ruby/object:Gem::Dependency
105
+ name: bundler
106
+ requirement: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - "~>"
109
+ - !ruby/object:Gem::Version
110
+ version: '1.13'
111
+ type: :development
112
+ prerelease: false
113
+ version_requirements: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - "~>"
116
+ - !ruby/object:Gem::Version
117
+ version: '1.13'
118
+ - !ruby/object:Gem::Dependency
119
+ name: rake
120
+ requirement: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - "~>"
123
+ - !ruby/object:Gem::Version
124
+ version: '10.0'
125
+ type: :development
126
+ prerelease: false
127
+ version_requirements: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - "~>"
130
+ - !ruby/object:Gem::Version
131
+ version: '10.0'
132
+ - !ruby/object:Gem::Dependency
133
+ name: rspec
134
+ requirement: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - "~>"
137
+ - !ruby/object:Gem::Version
138
+ version: '3.0'
139
+ type: :development
140
+ prerelease: false
141
+ version_requirements: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - "~>"
144
+ - !ruby/object:Gem::Version
145
+ version: '3.0'
146
+ - !ruby/object:Gem::Dependency
147
+ name: codeclimate-test-reporter
148
+ requirement: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - "~>"
151
+ - !ruby/object:Gem::Version
152
+ version: 1.0.0
153
+ type: :development
154
+ prerelease: false
155
+ version_requirements: !ruby/object:Gem::Requirement
156
+ requirements:
157
+ - - "~>"
158
+ - !ruby/object:Gem::Version
159
+ version: 1.0.0
160
+ - !ruby/object:Gem::Dependency
161
+ name: generator_spec
162
+ requirement: !ruby/object:Gem::Requirement
163
+ requirements:
164
+ - - ">="
165
+ - !ruby/object:Gem::Version
166
+ version: '0'
167
+ type: :development
168
+ prerelease: false
169
+ version_requirements: !ruby/object:Gem::Requirement
170
+ requirements:
171
+ - - ">="
172
+ - !ruby/object:Gem::Version
173
+ version: '0'
174
+ - !ruby/object:Gem::Dependency
175
+ name: simplecov
176
+ requirement: !ruby/object:Gem::Requirement
177
+ requirements:
178
+ - - ">="
179
+ - !ruby/object:Gem::Version
180
+ version: '0'
181
+ type: :development
182
+ prerelease: false
183
+ version_requirements: !ruby/object:Gem::Requirement
184
+ requirements:
185
+ - - ">="
186
+ - !ruby/object:Gem::Version
187
+ version: '0'
188
+ description: Make external requests in you service objects, with easy logging and
189
+ error handling!
190
+ email:
191
+ - diego.raffo@wolox.com.ar
192
+ - michel.agopian@wolox.com.ar
193
+ executables: []
194
+ extensions: []
195
+ extra_rdoc_files: []
196
+ files:
197
+ - ".gitignore"
198
+ - ".rspec"
199
+ - ".rubocop.yml"
200
+ - ".travis.yml"
201
+ - Gemfile
202
+ - LICENSE.md
203
+ - README.md
204
+ - Rakefile
205
+ - lib/generators/templates/base_service.rb.erb
206
+ - lib/generators/templates/wor_requests.rb
207
+ - lib/generators/wor/requests/install_generator.rb
208
+ - lib/generators/wor/requests/service_generator.rb
209
+ - lib/wor/requests.rb
210
+ - lib/wor/requests/base.rb
211
+ - lib/wor/requests/invalid_options_error.rb
212
+ - lib/wor/requests/request_error.rb
213
+ - lib/wor/requests/version.rb
214
+ - wor-requests.gemspec
215
+ homepage: https://github.com/Wolox/wor-requests
216
+ licenses:
217
+ - MIT
218
+ metadata: {}
219
+ post_install_message:
220
+ rdoc_options: []
221
+ require_paths:
222
+ - lib
223
+ required_ruby_version: !ruby/object:Gem::Requirement
224
+ requirements:
225
+ - - ">="
226
+ - !ruby/object:Gem::Version
227
+ version: '0'
228
+ required_rubygems_version: !ruby/object:Gem::Requirement
229
+ requirements:
230
+ - - ">="
231
+ - !ruby/object:Gem::Version
232
+ version: '0'
233
+ requirements: []
234
+ rubyforge_project:
235
+ rubygems_version: 2.6.7
236
+ signing_key:
237
+ specification_version: 4
238
+ summary: Make external requests in you service objects, with easy logging and error
239
+ handling!
240
+ test_files: []