catalog-api-client 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 3b7b985d70756f8b90456994d607b93b373d28dc
4
+ data.tar.gz: d9a38398cf14865782fe9bc217ef08b2406be425
5
+ SHA512:
6
+ metadata.gz: 7bf8cfc620f13a324e6c01a5537475d645f4d4f5401aef53335ace0e7940959ed94798a3a5470067ec8a0d634f96407ebc9a0dd5c486e8b3753cedf80b5c7fac
7
+ data.tar.gz: b94d37a509b66e1484c24d83bc665f2446e6ee3fe8d607e1a3e384223a7995079860e884232c8c0f6029fa0bbf682d0ef4a8a803c99b35e267071c92aec749f6
@@ -0,0 +1,107 @@
1
+ require 'catalog/api/version'
2
+ require 'rest-client'
3
+ require 'securerandom'
4
+ require 'link_header'
5
+
6
+ module Catalog
7
+ module Api
8
+ class Client
9
+ def initialize(opts = {})
10
+ if opts[:host].include? ':'
11
+ @host, @port = opts[:host].split(':')
12
+ else
13
+ @host = opts[:host]
14
+ end
15
+ @scheme = opts[:scheme] || 'https'
16
+ @port ||= (@scheme == 'https') ? 443 : 80
17
+ @token = opts[:token]
18
+ @version = opts[:version] || 'v1'
19
+ @auth_header = {
20
+ Authorization: "Token token=#{@token}",
21
+ content_type: 'application/json'
22
+ }
23
+ @api_path = "/api/#{@version}"
24
+ end
25
+
26
+ [:get, :post, :put, :delete].each do |method|
27
+ define_method method do |resource, options = { resource_id: nil, request_body: nil }|
28
+ delegate(method, resource, options)
29
+ end
30
+ end
31
+
32
+ private
33
+
34
+ def delegate(method, resource, options)
35
+ paginate?(method, options) ? paginated_request(options, resource) : request(method, resource, options)
36
+ end
37
+
38
+ def paginate?(method, options)
39
+ (method.eql? :get) && (options[:resource_id].nil?)
40
+ end
41
+
42
+ def request(method, resource, options)
43
+ path = uri(resource, options[:resource_id])
44
+ call_api(method, path, options[:request_body]).last # return response body w/o header
45
+ end
46
+
47
+ def paginated_request(options, resource)
48
+ path = uri(resource)
49
+ headers, body = call_api(:get, path)
50
+ return body if body.empty?
51
+
52
+ cur_page_index = 1
53
+ path = next_page(headers)
54
+ while path && pages?(cur_page_index, options[:max_pages])
55
+ headers, paginated_body = call_api(:get, path)
56
+ body.concat paginated_body
57
+ cur_page_index += 1
58
+ path = next_page(headers)
59
+ end
60
+
61
+ body
62
+ end
63
+
64
+ def uri(resource, resource_id = nil)
65
+ URI::Generic.build(
66
+ scheme: @scheme,
67
+ host: @host,
68
+ port: @port.to_i,
69
+ path: [@api_path, resource, resource_id].compact.join('/')
70
+ ).to_s
71
+ end
72
+
73
+ def headers_and_body(response)
74
+ parsed_response = JSON.parse(response) rescue {}
75
+ headers = response.headers
76
+ body = if parsed_response.size == 1
77
+ parsed_response.first.last
78
+ else
79
+ parsed_response
80
+ end
81
+ [headers, body]
82
+ end
83
+
84
+ def pages?(cur_page_index, max_page)
85
+ max_page.nil? || cur_page_index < max_page
86
+ end
87
+
88
+ def call_api(method, path, request_body = nil)
89
+ response =
90
+ case method
91
+ when :delete, :get
92
+ RestClient.send(method, path, @auth_header)
93
+ when :post, :put
94
+ RestClient.send(method, path, request_body, @auth_header)
95
+ else
96
+ fail "Invalid method: #{method}"
97
+ end
98
+ headers_and_body(response)
99
+ end
100
+
101
+ def next_page(headers)
102
+ links = LinkHeader.parse(headers[:link]).links
103
+ next_link = links.find { |link| link['rel'] == 'next' } and next_link.href
104
+ end
105
+ end
106
+ end
107
+ end
@@ -0,0 +1,5 @@
1
+ module Catalog
2
+ module Api
3
+ VERSION = '0.1.0'
4
+ end
5
+ end
metadata ADDED
@@ -0,0 +1,132 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: catalog-api-client
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Santosh Natarajan
8
+ - Dave Donahue
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2015-11-11 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: bundler
16
+ requirement: !ruby/object:Gem::Requirement
17
+ requirements:
18
+ - - "~>"
19
+ - !ruby/object:Gem::Version
20
+ version: '1.7'
21
+ type: :development
22
+ prerelease: false
23
+ version_requirements: !ruby/object:Gem::Requirement
24
+ requirements:
25
+ - - "~>"
26
+ - !ruby/object:Gem::Version
27
+ version: '1.7'
28
+ - !ruby/object:Gem::Dependency
29
+ name: rake
30
+ requirement: !ruby/object:Gem::Requirement
31
+ requirements:
32
+ - - "~>"
33
+ - !ruby/object:Gem::Version
34
+ version: '10.0'
35
+ type: :development
36
+ prerelease: false
37
+ version_requirements: !ruby/object:Gem::Requirement
38
+ requirements:
39
+ - - "~>"
40
+ - !ruby/object:Gem::Version
41
+ version: '10.0'
42
+ - !ruby/object:Gem::Dependency
43
+ name: rspec
44
+ requirement: !ruby/object:Gem::Requirement
45
+ requirements:
46
+ - - ">="
47
+ - !ruby/object:Gem::Version
48
+ version: '0'
49
+ type: :development
50
+ prerelease: false
51
+ version_requirements: !ruby/object:Gem::Requirement
52
+ requirements:
53
+ - - ">="
54
+ - !ruby/object:Gem::Version
55
+ version: '0'
56
+ - !ruby/object:Gem::Dependency
57
+ name: webmock
58
+ requirement: !ruby/object:Gem::Requirement
59
+ requirements:
60
+ - - ">="
61
+ - !ruby/object:Gem::Version
62
+ version: '0'
63
+ type: :development
64
+ prerelease: false
65
+ version_requirements: !ruby/object:Gem::Requirement
66
+ requirements:
67
+ - - ">="
68
+ - !ruby/object:Gem::Version
69
+ version: '0'
70
+ - !ruby/object:Gem::Dependency
71
+ name: link_header
72
+ requirement: !ruby/object:Gem::Requirement
73
+ requirements:
74
+ - - ">="
75
+ - !ruby/object:Gem::Version
76
+ version: '0'
77
+ type: :runtime
78
+ prerelease: false
79
+ version_requirements: !ruby/object:Gem::Requirement
80
+ requirements:
81
+ - - ">="
82
+ - !ruby/object:Gem::Version
83
+ version: '0'
84
+ - !ruby/object:Gem::Dependency
85
+ name: rest-client
86
+ requirement: !ruby/object:Gem::Requirement
87
+ requirements:
88
+ - - ">="
89
+ - !ruby/object:Gem::Version
90
+ version: '0'
91
+ type: :runtime
92
+ prerelease: false
93
+ version_requirements: !ruby/object:Gem::Requirement
94
+ requirements:
95
+ - - ">="
96
+ - !ruby/object:Gem::Version
97
+ version: '0'
98
+ description: " Ruby client for catalog api "
99
+ email:
100
+ - snatarajan@instructure.com
101
+ - ddonahue@instructure.com
102
+ executables: []
103
+ extensions: []
104
+ extra_rdoc_files: []
105
+ files:
106
+ - lib/catalog/api/client.rb
107
+ - lib/catalog/api/version.rb
108
+ homepage: https://github.com/instructure/catalog_api_client
109
+ licenses:
110
+ - MIT
111
+ metadata: {}
112
+ post_install_message:
113
+ rdoc_options: []
114
+ require_paths:
115
+ - lib
116
+ required_ruby_version: !ruby/object:Gem::Requirement
117
+ requirements:
118
+ - - ">="
119
+ - !ruby/object:Gem::Version
120
+ version: '0'
121
+ required_rubygems_version: !ruby/object:Gem::Requirement
122
+ requirements:
123
+ - - ">="
124
+ - !ruby/object:Gem::Version
125
+ version: '0'
126
+ requirements: []
127
+ rubyforge_project:
128
+ rubygems_version: 2.4.5
129
+ signing_key:
130
+ specification_version: 4
131
+ summary: Ruby client for catalog api
132
+ test_files: []