3scale-api 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/README.md +52 -0
- data/lib/3scale/api.rb +14 -0
- data/lib/3scale/api/client.rb +144 -0
- data/lib/3scale/api/http_client.rb +94 -0
- data/lib/3scale/api/version.rb +5 -0
- data/lib/three_scale/api.rb +1 -0
- metadata +106 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: e87913474e0e2e316880dd063c559bbee086470b
|
4
|
+
data.tar.gz: 6f734f9eb252fe2cb0c99e12d0cb6c21694d7932
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 73ea2d8cade0bb30df5dd0f5d7d79a70bbf26911accc042d6c7ac063ea5ef2c1fa03be8197919e3499743974f1c8b01acbf0cab29aa3ff3a1f4483983d67be2c
|
7
|
+
data.tar.gz: 530916190be47420386900d6de3489062dedf9ef33f44d88f8ad906039373dcff847e7816686d7ee66905e0ea739999a96c8b91be25d094db3c4d62195065928
|
data/README.md
ADDED
@@ -0,0 +1,52 @@
|
|
1
|
+
# ThreeScale::API
|
2
|
+
|
3
|
+
|
4
|
+
This gem aims to expose all [3scale](http://3scale.net) APIs with a Ruby interface.
|
5
|
+
|
6
|
+
|
7
|
+
## Installation
|
8
|
+
|
9
|
+
Add this line to your application's Gemfile:
|
10
|
+
|
11
|
+
```ruby
|
12
|
+
gem '3scale-api'
|
13
|
+
```
|
14
|
+
|
15
|
+
And then execute:
|
16
|
+
|
17
|
+
$ bundle
|
18
|
+
|
19
|
+
Or install it yourself as:
|
20
|
+
|
21
|
+
$ gem install 3scale-api
|
22
|
+
|
23
|
+
## Usage
|
24
|
+
|
25
|
+
|
26
|
+
```ruby
|
27
|
+
require '3scale/api'
|
28
|
+
client = ThreeScale::API.new(endpoint: 'https://foo-admin.3scale.net', provider_key: 'foobar')
|
29
|
+
|
30
|
+
services = client.list_services
|
31
|
+
```
|
32
|
+
|
33
|
+
## Design
|
34
|
+
|
35
|
+
Design decisions:
|
36
|
+
|
37
|
+
* 0 runtime dependencies
|
38
|
+
* thread safety
|
39
|
+
* tested
|
40
|
+
|
41
|
+
## Development
|
42
|
+
|
43
|
+
After checking out the repo, run `bin/setup` to install dependencies. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
|
44
|
+
|
45
|
+
To run tests run `rake` or `rspec`.
|
46
|
+
|
47
|
+
To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
|
48
|
+
|
49
|
+
## Contributing
|
50
|
+
|
51
|
+
Bug reports and pull requests are welcome on GitHub at https://github.com/3scale/3scale-api-ruby.
|
52
|
+
|
data/lib/3scale/api.rb
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
require '3scale/api/version'
|
2
|
+
|
3
|
+
module ThreeScale
|
4
|
+
module API
|
5
|
+
autoload :Client, '3scale/api/client'
|
6
|
+
autoload :HttpClient, '3scale/api/http_client'
|
7
|
+
|
8
|
+
def self.new(endpoint:, provider_key:)
|
9
|
+
http_client = HttpClient.new(endpoint: endpoint,
|
10
|
+
provider_key: provider_key)
|
11
|
+
Client.new(http_client)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,144 @@
|
|
1
|
+
module ThreeScale
|
2
|
+
module API
|
3
|
+
class Client
|
4
|
+
|
5
|
+
attr_reader :http_client
|
6
|
+
|
7
|
+
# @param [ThreeScale::API::HttpClient] http_client
|
8
|
+
|
9
|
+
def initialize(http_client)
|
10
|
+
@http_client = http_client
|
11
|
+
end
|
12
|
+
|
13
|
+
# @api public
|
14
|
+
# @return [Hash]
|
15
|
+
# @param [Fixnum] id Service ID
|
16
|
+
def show_service(id)
|
17
|
+
response = http_client.get("/admin/api/services/#{id}")
|
18
|
+
extract(entity: 'service', from: response)
|
19
|
+
end
|
20
|
+
|
21
|
+
# @api public
|
22
|
+
# @return [Array<Hash>]
|
23
|
+
def list_services
|
24
|
+
response = http_client.get('/admin/api/services')
|
25
|
+
extract(collection: 'services', entity: 'service', from: response)
|
26
|
+
end
|
27
|
+
|
28
|
+
# @api public
|
29
|
+
# @return [Hash]
|
30
|
+
# @param [Hash] attributes Service Attributes
|
31
|
+
# @option attributes [String] :name Service Name
|
32
|
+
def create_service(attributes)
|
33
|
+
response = http_client.post('/admin/api/services', body: { service: attributes })
|
34
|
+
extract(entity: 'service', from: response)
|
35
|
+
end
|
36
|
+
|
37
|
+
# @api public
|
38
|
+
# @return [Array<Hash>]
|
39
|
+
# @param [Fixnum] service_id Service ID
|
40
|
+
def list_metrics(service_id)
|
41
|
+
response = http_client.get("/admin/api/services/#{service_id}/metrics")
|
42
|
+
extract(collection: 'metrics', entity: 'metric', from: response)
|
43
|
+
end
|
44
|
+
|
45
|
+
# @api public
|
46
|
+
# @return [Hash]
|
47
|
+
# @param [Fixnum] service_id Service ID
|
48
|
+
# @param [Hash] attributes Metric Attributes
|
49
|
+
# @option attributes [String] :name Metric Name
|
50
|
+
def create_metric(service_id, attributes)
|
51
|
+
response = http_client.post("/admin/api/services/#{service_id}/metrics", body: { metric: attributes })
|
52
|
+
extract(entity: 'metric', from: response)
|
53
|
+
end
|
54
|
+
|
55
|
+
# @api public
|
56
|
+
# @return [Array<Hash>]
|
57
|
+
# @param [Fixnum] service_id Service ID
|
58
|
+
# @param [Fixnum] metric_id Metric ID
|
59
|
+
def list_methods(service_id, metric_id)
|
60
|
+
response = http_client.get("/admin/api/services/#{service_id}/metrics/#{metric_id}/methods")
|
61
|
+
extract(collection: 'methods', entity: 'method', from: response)
|
62
|
+
end
|
63
|
+
|
64
|
+
# @api public
|
65
|
+
# @return [Hash]
|
66
|
+
# @param [Fixnum] service_id Service ID
|
67
|
+
# @param [Fixnum] metric_id Metric ID
|
68
|
+
# @param [Hash] attributes Metric Attributes
|
69
|
+
# @option attributes [String] :name Method Name
|
70
|
+
def create_method(service_id, metric_id, attributes)
|
71
|
+
response = http_client.post("/admin/api/services/#{service_id}/metrics/#{metric_id}/methods",
|
72
|
+
body: { metric: attributes })
|
73
|
+
extract(entity: 'method', from: response)
|
74
|
+
end
|
75
|
+
|
76
|
+
# @api public
|
77
|
+
# @return [Array<Hash>]
|
78
|
+
# @param [Fixnum] service_id Service ID
|
79
|
+
def list_service_application_plans(service_id)
|
80
|
+
response = http_client.get("/admin/api/services/#{service_id}/application_plans")
|
81
|
+
|
82
|
+
extract(collection: 'plans', entity: 'application_plan', from: response)
|
83
|
+
end
|
84
|
+
|
85
|
+
# @api public
|
86
|
+
# @return [Hash]
|
87
|
+
# @param [Fixnum] service_id Service ID
|
88
|
+
# @param [Hash] attributes Metric Attributes
|
89
|
+
# @option attributes [String] :name Application Plan Name
|
90
|
+
def create_application_plan(service_id, attributes)
|
91
|
+
response = http_client.post("/admin/api/services/#{service_id}/application_plans",
|
92
|
+
body: { application_plan: attributes })
|
93
|
+
extract(entity: 'application_plan', from: response)
|
94
|
+
end
|
95
|
+
|
96
|
+
# @api public
|
97
|
+
# @return [Array<Hash>]
|
98
|
+
# @param [Fixnum] application_plan_id Application Plan ID
|
99
|
+
def list_application_plan_limits(application_plan_id)
|
100
|
+
response = http_client.get("/admin/api/application_plans/#{application_plan_id}/limits")
|
101
|
+
|
102
|
+
extract(collection: 'limits', entity: 'limit', from: response)
|
103
|
+
end
|
104
|
+
|
105
|
+
# @api public
|
106
|
+
# @return [Hash]
|
107
|
+
# @param [Fixnum] application_plan_id Application Plan ID
|
108
|
+
# @param [Hash] attributes Metric Attributes
|
109
|
+
# @param [Fixnum] metric_id Metric ID
|
110
|
+
# @option attributes [String] :period Usage Limit period
|
111
|
+
# @option attributes [String] :value Usage Limit value
|
112
|
+
def create_application_plan_limit(application_plan_id, metric_id, attributes)
|
113
|
+
response = http_client.post("/admin/api/application_plans/#{application_plan_id}/metrics/#{metric_id}/limits",
|
114
|
+
body: { usage_limit: attributes })
|
115
|
+
extract(entity: 'limit', from: response)
|
116
|
+
end
|
117
|
+
|
118
|
+
# @param [Fixnum] application_plan_id Application Plan ID
|
119
|
+
# @param [Fixnum] metric_id Metric ID
|
120
|
+
# @param [Fixnum] limit_id Usage Limit ID
|
121
|
+
def delete_application_plan_limit(application_plan_id, metric_id, limit_id)
|
122
|
+
http_client.delete("/admin/api/application_plans/#{application_plan_id}/metrics/#{metric_id}/limits/#{limit_id}")
|
123
|
+
true
|
124
|
+
end
|
125
|
+
|
126
|
+
protected
|
127
|
+
|
128
|
+
def extract(collection: nil, entity: , from: )
|
129
|
+
if collection
|
130
|
+
from = from.fetch(collection)
|
131
|
+
end
|
132
|
+
|
133
|
+
case from
|
134
|
+
when Array then from.map { |e| e.fetch(entity) }
|
135
|
+
when Hash then from.fetch(entity) { from }
|
136
|
+
when nil then nil # raise exception?
|
137
|
+
else
|
138
|
+
raise "unknown #{from}"
|
139
|
+
end
|
140
|
+
|
141
|
+
end
|
142
|
+
end
|
143
|
+
end
|
144
|
+
end
|
@@ -0,0 +1,94 @@
|
|
1
|
+
require 'json'
|
2
|
+
|
3
|
+
module ThreeScale
|
4
|
+
module API
|
5
|
+
class HttpClient
|
6
|
+
attr_reader :endpoint, :admin_domain, :provider_key, :headers, :format
|
7
|
+
|
8
|
+
def initialize(endpoint: , provider_key: , format: :json)
|
9
|
+
@endpoint = URI(endpoint).freeze
|
10
|
+
@admin_domain = @endpoint.host.freeze
|
11
|
+
@provider_key = provider_key.freeze
|
12
|
+
@http = Net::HTTP.new(admin_domain, @endpoint.port)
|
13
|
+
@http.use_ssl = @endpoint.is_a?(URI::HTTPS)
|
14
|
+
|
15
|
+
@headers = {
|
16
|
+
'Accept' => "application/#{format}",
|
17
|
+
'Content-Type' => "application/#{format}",
|
18
|
+
'Authorization' => 'Basic ' + [":#{@provider_key}"].pack('m').delete("\r\n")
|
19
|
+
}
|
20
|
+
|
21
|
+
if debug?
|
22
|
+
@http.set_debug_output($stdout)
|
23
|
+
@headers['Accept-Encoding'] = 'identity'
|
24
|
+
end
|
25
|
+
|
26
|
+
@headers.freeze
|
27
|
+
|
28
|
+
@format = format
|
29
|
+
end
|
30
|
+
|
31
|
+
def get(path)
|
32
|
+
parse @http.get("#{path}.#{format}", headers)
|
33
|
+
end
|
34
|
+
|
35
|
+
def post(path, body: )
|
36
|
+
parse @http.post("#{path}.#{format}", serialize(body), headers)
|
37
|
+
end
|
38
|
+
|
39
|
+
def delete(path)
|
40
|
+
parse @http.delete("#{path}.#{format}", headers)
|
41
|
+
end
|
42
|
+
|
43
|
+
# @param [::Net::HTTPResponse] response
|
44
|
+
def parse(response)
|
45
|
+
case response
|
46
|
+
when Net::HTTPUnprocessableEntity, Net::HTTPSuccess then parser.decode(response.body)
|
47
|
+
when Net::HTTPForbidden then forbidden!(response)
|
48
|
+
else "Can't handle #{response.inspect}"
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
class ForbiddenError < StandardError; end
|
53
|
+
|
54
|
+
def forbidden!(response)
|
55
|
+
raise ForbiddenError, response
|
56
|
+
end
|
57
|
+
|
58
|
+
def serialize(body)
|
59
|
+
case body
|
60
|
+
when String then body
|
61
|
+
else parser.encode(body)
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
def parser
|
66
|
+
case format
|
67
|
+
when :json then JSONParser
|
68
|
+
else "unknown format #{format}"
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
protected
|
73
|
+
|
74
|
+
def debug?
|
75
|
+
ENV.fetch('3SCALE_DEBUG', '0') == '1'
|
76
|
+
end
|
77
|
+
|
78
|
+
module JSONParser
|
79
|
+
module_function
|
80
|
+
|
81
|
+
def decode(string)
|
82
|
+
case string
|
83
|
+
when ' '.freeze, ''.freeze then nil
|
84
|
+
else ::JSON.parse(string)
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
def encode(query)
|
89
|
+
::JSON.generate(query)
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|
94
|
+
end
|
@@ -0,0 +1 @@
|
|
1
|
+
require '3scale/api'
|
metadata
ADDED
@@ -0,0 +1,106 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: 3scale-api
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Michal Cichra
|
8
|
+
autorequire:
|
9
|
+
bindir: exe
|
10
|
+
cert_chain: []
|
11
|
+
date: 2016-03-11 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.11'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '1.11'
|
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.4'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '3.4'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: webmock
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - "~>"
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '1.24'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - "~>"
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '1.24'
|
69
|
+
description: 'API Client to access your 3scale APIs: Account Management API'
|
70
|
+
email:
|
71
|
+
- michal@3scale.net
|
72
|
+
executables: []
|
73
|
+
extensions: []
|
74
|
+
extra_rdoc_files: []
|
75
|
+
files:
|
76
|
+
- README.md
|
77
|
+
- lib/3scale/api.rb
|
78
|
+
- lib/3scale/api/client.rb
|
79
|
+
- lib/3scale/api/http_client.rb
|
80
|
+
- lib/3scale/api/version.rb
|
81
|
+
- lib/three_scale/api.rb
|
82
|
+
homepage: https://github.com/3scale/3scale-api-ruby.
|
83
|
+
licenses: []
|
84
|
+
metadata: {}
|
85
|
+
post_install_message:
|
86
|
+
rdoc_options: []
|
87
|
+
require_paths:
|
88
|
+
- lib
|
89
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
90
|
+
requirements:
|
91
|
+
- - ">="
|
92
|
+
- !ruby/object:Gem::Version
|
93
|
+
version: '0'
|
94
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
95
|
+
requirements:
|
96
|
+
- - ">="
|
97
|
+
- !ruby/object:Gem::Version
|
98
|
+
version: '0'
|
99
|
+
requirements: []
|
100
|
+
rubyforge_project:
|
101
|
+
rubygems_version: 2.5.1
|
102
|
+
signing_key:
|
103
|
+
specification_version: 4
|
104
|
+
summary: API Client for 3scale APIs
|
105
|
+
test_files: []
|
106
|
+
has_rdoc:
|