external_api_service 0.1.1
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/.coveralls.yml +1 -0
- data/.gitignore +9 -0
- data/.rspec +2 -0
- data/.travis.yml +17 -0
- data/Gemfile +3 -0
- data/README.md +61 -0
- data/Rakefile +13 -0
- data/bin/console +14 -0
- data/bin/setup +7 -0
- data/external_api_service.gemspec +32 -0
- data/lib/external_api_service/http_client.rb +39 -0
- data/lib/external_api_service/https_client.rb +44 -0
- data/lib/external_api_service/uri_builder.rb +11 -0
- data/lib/external_api_service/version.rb +3 -0
- data/lib/external_api_service.rb +21 -0
- metadata +145 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: c8a6d1ed464dd884eb7ecec6f783d78521006391
|
4
|
+
data.tar.gz: 12c9a87d3e9d9740133cddadb0e7cbe7c94def6d
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 00b068a699b4a932442f4b7a1e93760420235e2a05402c1cad9a2e7e41297b40cfc08d4a79357d81e0622ca0a6b620c9aef6dc6be6de44cba862a523062248a6
|
7
|
+
data.tar.gz: abe663289c6bf5ad6d8f4926a486a9c03a971987a495a599a2a7432a54fe46b2c751ff816f4e061d010d3203f2ff1f190c70d1ff271d8495d981625dfe369631
|
data/.coveralls.yml
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
service_name: travis-ci
|
data/.gitignore
ADDED
data/.rspec
ADDED
data/.travis.yml
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
before_install:
|
2
|
+
- gem update --system
|
3
|
+
- gem --version
|
4
|
+
- gem install bundler
|
5
|
+
|
6
|
+
language: ruby
|
7
|
+
rvm:
|
8
|
+
- 2.2.0
|
9
|
+
|
10
|
+
script: 'bundle exec rake'
|
11
|
+
|
12
|
+
notifications:
|
13
|
+
email:
|
14
|
+
recipients:
|
15
|
+
- nick.rakochy@gmail.com
|
16
|
+
on_failure: change
|
17
|
+
on_success: never
|
data/Gemfile
ADDED
data/README.md
ADDED
@@ -0,0 +1,61 @@
|
|
1
|
+
[](https://travis-ci.org/nrakochy/external_api_service.svg?branch=master)
|
2
|
+
[](https://coveralls.io/r/nrakochy/external_api_service?branch=master)
|
3
|
+
[](http://badge.fury.io/rb/external_api_service)
|
4
|
+
|
5
|
+
# ExternalApiService
|
6
|
+
|
7
|
+
## Installation
|
8
|
+
|
9
|
+
Add this line to your application's Gemfile:
|
10
|
+
|
11
|
+
```ruby
|
12
|
+
gem 'external_api_service'
|
13
|
+
```
|
14
|
+
|
15
|
+
And then execute:
|
16
|
+
|
17
|
+
$ bundle
|
18
|
+
|
19
|
+
Or install it yourself as:
|
20
|
+
|
21
|
+
$ gem install external_api_service
|
22
|
+
|
23
|
+
## Usage
|
24
|
+
To use, you need to require the service module wherever you are wanting to use it:
|
25
|
+
|
26
|
+
require ‘ExternalApiService’
|
27
|
+
|
28
|
+
To make a GET request, you need an endpoint (required), and any query params in a Hash (optional). The endpoint must return `JSON`.
|
29
|
+
It will work with `HTTPS` or `HTTP`. Call `get_service`:
|
30
|
+
|
31
|
+
# no params
|
32
|
+
url = “https://data.cityofchicago.org/Buildings/Problem-Landlord-List-Map/dip3-ud6z”
|
33
|
+
ExternalApiService.get_service(url)
|
34
|
+
|
35
|
+
# with params
|
36
|
+
url = “https://my.endpoint/path”
|
37
|
+
params = { sample_category: “sample_category_name” }
|
38
|
+
ExternalApiService.get_service(url, params)
|
39
|
+
|
40
|
+
`get_service` will transform the JSON to Ruby Hash with symbolized names:
|
41
|
+
|
42
|
+
# First entry from the Chicago Problem Landlord List in Array of Hashes (“https://data.cityofchicago.org/Buildings/Problem-Landlord-List-Map/dip3-ud6z”)
|
43
|
+
|
44
|
+
[{:respondent=>”Ravine Properties, LLC”, :secondary_address=>”5849 W ARTHINGTON ST”,
|
45
|
+
:location=>{:needs_recoding=>false, :longitude=>”-87.7716557532”, :latitude=>”41.8690630014”},
|
46
|
+
:census_tracts=>”17031831400”, :census_blocks=>”170318314002042”, :x_coordinate=>”1137233.9789750562”,
|
47
|
+
:street_block_id=>”7445”, :ward=>”29”, :address=>”1001 S MAYFIELD AVE”, :y_coordinate=>”1895377.068646989”,
|
48
|
+
:community_area=>”AUSTIN”, :longitude=>”-87.7716557532”, :latitude=>”41.8690630014”, :community_area_number=>”25”}]
|
49
|
+
|
50
|
+
## Features To-Do
|
51
|
+
Does not support `JSONP`.
|
52
|
+
|
53
|
+
Only makes GET requests. Probably need to update to make POST requests as well.
|
54
|
+
|
55
|
+
## Contributing
|
56
|
+
|
57
|
+
1. Fork it ( https://github.com/[my-github-username]/external_api_service/fork )
|
58
|
+
2. Create your feature branch (`git checkout -b my-new-feature`)
|
59
|
+
3. Commit your changes (`git commit -am 'Add some feature'`)
|
60
|
+
4. Push to the branch (`git push origin my-new-feature`)
|
61
|
+
5. Create a new Pull Request
|
data/Rakefile
ADDED
@@ -0,0 +1,13 @@
|
|
1
|
+
begin
|
2
|
+
require 'rspec/core/rake_task'
|
3
|
+
require 'bundler/gem_tasks'
|
4
|
+
require 'coveralls/rake/task'
|
5
|
+
|
6
|
+
Coveralls::RakeTask.new
|
7
|
+
RSpec::Core::RakeTask.new(:spec) do |task|
|
8
|
+
task.rspec_opts = ['--color', '--format documentation']
|
9
|
+
end
|
10
|
+
|
11
|
+
task :default => [:spec, 'coveralls:push']
|
12
|
+
rescue
|
13
|
+
end
|
data/bin/console
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require "bundler/setup"
|
4
|
+
require "external_api_service"
|
5
|
+
|
6
|
+
# You can add fixtures and/or initialization code here to make experimenting
|
7
|
+
# with your gem easier. You can also use a different console, if you like.
|
8
|
+
|
9
|
+
# (If you use this, don't forget to add pry to your Gemfile!)
|
10
|
+
# require "pry"
|
11
|
+
# Pry.start
|
12
|
+
|
13
|
+
require "irb"
|
14
|
+
IRB.start
|
data/bin/setup
ADDED
@@ -0,0 +1,32 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'external_api_service/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = "external_api_service"
|
8
|
+
spec.version = ExternalApiService::VERSION
|
9
|
+
spec.authors = ["nrakochy"]
|
10
|
+
spec.email = ["nick.rakochy@gmail.com"]
|
11
|
+
spec.summary = %q{Make a GET request to an external endpoint using only Ruby standard lib - No external dependencies}
|
12
|
+
|
13
|
+
# Prevent pushing this gem to RubyGems.org by setting 'allowed_push_host', or
|
14
|
+
# delete this section to allow pushing this gem to any host.
|
15
|
+
if spec.respond_to?(:metadata)
|
16
|
+
spec.metadata['allowed_push_host'] = "https://rubygems.org"
|
17
|
+
else
|
18
|
+
raise "RubyGems 2.0 or newer is required to protect against public gem pushes."
|
19
|
+
end
|
20
|
+
|
21
|
+
spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
|
22
|
+
spec.bindir = "exe"
|
23
|
+
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
24
|
+
spec.require_paths = ["lib"]
|
25
|
+
|
26
|
+
spec.add_development_dependency "bundler", "~> 1.9"
|
27
|
+
spec.add_development_dependency "rake", "~> 10.0"
|
28
|
+
spec.add_development_dependency "rspec", "~> 3.2.0"
|
29
|
+
spec.add_development_dependency 'coveralls', '~> 0.8.1'
|
30
|
+
spec.add_development_dependency 'webmock', '~> 1.21.0'
|
31
|
+
spec.add_development_dependency 'yard', '~> 0.8.7.6'
|
32
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
require 'net/http'
|
2
|
+
require 'json'
|
3
|
+
|
4
|
+
class HTTP_Client
|
5
|
+
|
6
|
+
def get(endpoint_uri)
|
7
|
+
response = get_request(endpoint_uri)
|
8
|
+
parse_response(response)
|
9
|
+
end
|
10
|
+
|
11
|
+
def get_request(endpoint)
|
12
|
+
Net::HTTP.start(endpoint.host, endpoint.port) do |client|
|
13
|
+
retries = 5
|
14
|
+
begin
|
15
|
+
new_request = Net::HTTP::Get.new(endpoint)
|
16
|
+
client.request(new_request)
|
17
|
+
rescue Exception => ex
|
18
|
+
retries -= 1
|
19
|
+
retries > 0 ? retry : error_response(422, ex)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
def parse_response(response)
|
25
|
+
if (response.code != "200" || response.code == nil)
|
26
|
+
{ error: response }
|
27
|
+
else
|
28
|
+
JSON.parse(response.body, symbolize_names: true)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
private
|
33
|
+
|
34
|
+
def error_response(err_code, exception)
|
35
|
+
error = Struct.new(:code, :exception)
|
36
|
+
error.new(err_code, exception)
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
@@ -0,0 +1,44 @@
|
|
1
|
+
require 'net/http'
|
2
|
+
require 'json'
|
3
|
+
require 'thread'
|
4
|
+
|
5
|
+
class HTTPS_Client
|
6
|
+
|
7
|
+
def get_queue(url_queue)
|
8
|
+
url_queue.map{|uri| get(uri)}
|
9
|
+
end
|
10
|
+
|
11
|
+
def get(endpoint_uri)
|
12
|
+
response = get_request(endpoint_uri)
|
13
|
+
parse_response(response)
|
14
|
+
end
|
15
|
+
|
16
|
+
def get_request(endpoint)
|
17
|
+
Net::HTTP.start(endpoint.host, endpoint.port, :use_ssl => endpoint.scheme == 'https') do |client|
|
18
|
+
retries = 5
|
19
|
+
begin
|
20
|
+
new_request = Net::HTTP::Get.new(endpoint)
|
21
|
+
client.request(new_request)
|
22
|
+
rescue Exception => ex
|
23
|
+
retries -= 1
|
24
|
+
retries > 0 ? retry : error_response(422, ex)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
def parse_response(response)
|
30
|
+
if (response.code != "200" || response.code == nil)
|
31
|
+
{ error: response }
|
32
|
+
else
|
33
|
+
JSON.parse(response.body, symbolize_names: true)
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
private
|
38
|
+
|
39
|
+
def error_response(err_code, exception)
|
40
|
+
error = Struct.new(:code, :exception)
|
41
|
+
error.new(err_code, exception)
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
@@ -0,0 +1,21 @@
|
|
1
|
+
require 'external_api_service/http_client'
|
2
|
+
require 'external_api_service/https_client'
|
3
|
+
require 'external_api_service/uri_builder'
|
4
|
+
|
5
|
+
module ExternalApiService
|
6
|
+
|
7
|
+
# Make a GET request to external endpoint
|
8
|
+
# @param url is required
|
9
|
+
# @param query is optional. Query must be formatted as Ruby hash.
|
10
|
+
#
|
11
|
+
# @return Will transform the JSON to Ruby Hash with symbolized names
|
12
|
+
#
|
13
|
+
# @example
|
14
|
+
# ExternalApiService.get_service("sample_endpoint", {sample_hash: "sample_request"})
|
15
|
+
|
16
|
+
def self.get_service(url, queries = nil)
|
17
|
+
uri = URI_Builder.new.build_uri(url, queries)
|
18
|
+
uri.scheme.include?("https") ? HTTPS_Client.new.get(uri) : HTTP_Client.new.get(uri)
|
19
|
+
end
|
20
|
+
|
21
|
+
end
|
metadata
ADDED
@@ -0,0 +1,145 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: external_api_service
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- nrakochy
|
8
|
+
autorequire:
|
9
|
+
bindir: exe
|
10
|
+
cert_chain: []
|
11
|
+
date: 2015-06-04 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: bundler
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '1.9'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '1.9'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rake
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '10.0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '10.0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: rspec
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: 3.2.0
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: 3.2.0
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: coveralls
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - "~>"
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: 0.8.1
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - "~>"
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: 0.8.1
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: webmock
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - "~>"
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: 1.21.0
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - "~>"
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: 1.21.0
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: yard
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - "~>"
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: 0.8.7.6
|
90
|
+
type: :development
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - "~>"
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: 0.8.7.6
|
97
|
+
description:
|
98
|
+
email:
|
99
|
+
- nick.rakochy@gmail.com
|
100
|
+
executables: []
|
101
|
+
extensions: []
|
102
|
+
extra_rdoc_files: []
|
103
|
+
files:
|
104
|
+
- ".coveralls.yml"
|
105
|
+
- ".gitignore"
|
106
|
+
- ".rspec"
|
107
|
+
- ".travis.yml"
|
108
|
+
- Gemfile
|
109
|
+
- README.md
|
110
|
+
- Rakefile
|
111
|
+
- bin/console
|
112
|
+
- bin/setup
|
113
|
+
- external_api_service.gemspec
|
114
|
+
- lib/external_api_service.rb
|
115
|
+
- lib/external_api_service/http_client.rb
|
116
|
+
- lib/external_api_service/https_client.rb
|
117
|
+
- lib/external_api_service/uri_builder.rb
|
118
|
+
- lib/external_api_service/version.rb
|
119
|
+
homepage:
|
120
|
+
licenses: []
|
121
|
+
metadata:
|
122
|
+
allowed_push_host: https://rubygems.org
|
123
|
+
post_install_message:
|
124
|
+
rdoc_options: []
|
125
|
+
require_paths:
|
126
|
+
- lib
|
127
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
128
|
+
requirements:
|
129
|
+
- - ">="
|
130
|
+
- !ruby/object:Gem::Version
|
131
|
+
version: '0'
|
132
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
133
|
+
requirements:
|
134
|
+
- - ">="
|
135
|
+
- !ruby/object:Gem::Version
|
136
|
+
version: '0'
|
137
|
+
requirements: []
|
138
|
+
rubyforge_project:
|
139
|
+
rubygems_version: 2.4.5
|
140
|
+
signing_key:
|
141
|
+
specification_version: 4
|
142
|
+
summary: Make a GET request to an external endpoint using only Ruby standard lib -
|
143
|
+
No external dependencies
|
144
|
+
test_files: []
|
145
|
+
has_rdoc:
|