tempo-ruby 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,46 @@
1
+ # frozen_string_literal: true
2
+
3
+ #
4
+ # Whenever a collection from a has_many relationship is accessed, an instance
5
+ # of this class is returned. This instance wraps the Array of instances in
6
+ # the collection with an extra build method, which allows new instances to be
7
+ # built on the collection with the correct properties.
8
+ #
9
+ # In practice, instances of this class behave exactly like an Array.
10
+ #
11
+ module Tempo
12
+ class HasManyProxy
13
+ attr_reader :target_class, :parent
14
+ attr_accessor :collection
15
+
16
+ def initialize(parent, target_class, collection = [])
17
+ @parent = parent
18
+ @target_class = target_class
19
+ @collection = collection
20
+ end
21
+
22
+ # Builds an instance of this class with the correct parent.
23
+ # For example, issue.comments.build(attrs) will initialize a
24
+ # comment as follows:
25
+ #
26
+ # Tempo::resource::Member.new(team.client,
27
+ # :attrs => attrs,
28
+ # :team => team)
29
+ def build(attrs = {})
30
+ resource = target_class.new(parent.client, :attrs => attrs, parent.to_sym => parent)
31
+ collection << resource
32
+ resource
33
+ end
34
+
35
+ # Forces an HTTP request to fetch all instances of the target class that
36
+ # are associated with the parent
37
+ def all
38
+ target_class.all(parent.client, parent.to_sym => parent)
39
+ end
40
+
41
+ # Delegate any missing methods to the collection that this proxy wraps
42
+ def method_missing(method_name, *args, &block)
43
+ collection.send(method_name, *args, &block)
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,61 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'json'
4
+ require 'net/https'
5
+ require 'cgi/cookie'
6
+ require 'uri'
7
+
8
+ module Tempo
9
+ class HttpClient < RequestClient
10
+ def initialize(options)
11
+ @options = { Authorization: "Bearer #{options.delete(:api_key)}" }.merge(options)
12
+ @cookies = {}
13
+ end
14
+
15
+ def make_request(http_method, url, body = '', headers = {})
16
+ # When a proxy is enabled, Net::HTTP expects that the request path omits the domain name
17
+ path = request_path(url)
18
+ request = Net::HTTP.const_get(http_method.to_s.capitalize).new(path, headers)
19
+ request.body = body unless body.nil?
20
+
21
+ execute_request(request)
22
+ end
23
+
24
+ def basic_auth_http_conn
25
+ http_conn(uri)
26
+ end
27
+
28
+ def http_conn(uri)
29
+ http_conn = Net::HTTP.new(uri.host, uri.port)
30
+ http_conn.use_ssl = false
31
+ http_conn.read_timeout = @options[:read_timeout]
32
+ http_conn
33
+ end
34
+
35
+ def uri
36
+ URI.parse(@options[:site])
37
+ end
38
+
39
+ def authenticated?
40
+ @authenticated
41
+ end
42
+
43
+ private
44
+
45
+ def execute_request(request)
46
+ response = basic_auth_http_conn.request(request)
47
+ @authenticated = response.is_a? Net::HTTPOK
48
+ store_cookies(response) if options[:use_cookies]
49
+
50
+ response
51
+ end
52
+
53
+ def request_path(url)
54
+ parsed_uri = URI(url)
55
+
56
+ return url unless parsed_uri.is_a?(URI::HTTP)
57
+
58
+ parsed_uri.request_uri
59
+ end
60
+ end
61
+ end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'forwardable'
4
+
5
+ module Tempo
6
+ class HTTPError < StandardError
7
+ extend Forwardable
8
+
9
+ def_instance_delegators :@response, :code
10
+ attr_reader :response, :message
11
+
12
+ def initialize(response)
13
+ @response = response
14
+ @message = response.try(:message).presence || response.try(:body)
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,22 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'json'
4
+ require 'net/https'
5
+
6
+ module Tempo
7
+ class RequestClient
8
+ # Returns the response if the request was successful (HTTP::2xx) and
9
+ # raises a Tempo::HTTPError if it was not successful, with the response
10
+ # attached.
11
+
12
+ def request(*args)
13
+ response = make_request(*args)
14
+ raise HTTPError, response unless response.is_a?(Net::HTTPSuccess)
15
+ response
16
+ end
17
+
18
+ def make_request(*args)
19
+ raise NotImplementedError
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,22 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Tempo
4
+ module Resource
5
+ class TeamFactory < Tempo::BaseFactory; end
6
+
7
+ class Team < Tempo::Base
8
+ def self.singular_path(client, key, prefix = '/')
9
+ collection_path(client, prefix) + key
10
+ end
11
+
12
+ def members(params = {})
13
+ path = path_base(client) + "teams/#{id}/members"
14
+ response = client.get(url_with_query_params(path, params))
15
+ json = self.class.parse_json(response.body)
16
+ results = json['results']
17
+
18
+ results.map { |issue| client.TeamMember.build(issue) }
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Tempo
4
+ module Resource
5
+ class TeamMemberFactory < Tempo::BaseFactory; end
6
+
7
+ class TeamMember < Tempo::Base; end
8
+ end
9
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Tempo
4
+ VERSION = '0.1.0'
5
+ end
data/lib/tempo_ruby.rb ADDED
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'active_support'
4
+
5
+ require 'tempo/base'
6
+ require 'tempo/version'
7
+ require 'tempo/base_factory'
8
+ require 'tempo/has_many_proxy'
9
+ require 'tempo/http_error'
10
+
11
+ require 'tempo/request_client'
12
+ require 'tempo/http_client'
13
+ require 'tempo/client'
14
+
15
+ require 'tempo/resource/team'
16
+ require 'tempo/resource/team_member'
@@ -0,0 +1,49 @@
1
+ # frozen_string_literal: true
2
+
3
+ lib = ::File.expand_path('lib', __dir__)
4
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
5
+ require 'tempo/version'
6
+
7
+ Gem::Specification.new do |spec|
8
+ spec.name = 'tempo-ruby'
9
+ spec.version = Tempo::VERSION
10
+ spec.authors = ['Ivan Vasylyshyn']
11
+ spec.email = ['vanyavasylyshyn@gmail.com']
12
+
13
+ spec.summary = %(tempo-ruby)
14
+ spec.description = %(🚀 Ruby Tempo Client)
15
+ spec.homepage = 'https://github.com/vanyavasylyshyn/tempo-ruby'
16
+ spec.license = 'MIT'
17
+
18
+ spec.metadata = {
19
+ 'homepage_uri' => 'https://github.com/vanyavasylyshyn/tempo-ruby',
20
+ 'changelog_uri' => 'https://github.com/vanyavasylyshyn/tempo-ruby/blob/main/CHANGELOG.md',
21
+ 'source_code_uri' => 'https://github.com/vanyavasylyshyn/tempo-ruby',
22
+ 'documentation_uri' => 'https://github.com/vanyavasylyshyn/tempo-ruby/blob/main/README.md',
23
+ 'bug_tracker_uri' => 'https://github.com/vanyavasylyshyn/tempo-ruby/issues'
24
+ }
25
+
26
+ spec.required_ruby_version = Gem::Requirement.new('>= 2.7.0')
27
+
28
+ spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
29
+ spec.bindir = 'exe'
30
+ spec.executables = spec.files.grep(%r{\Aexe/}) { |f| File.basename(f) }
31
+ spec.require_paths = ['lib']
32
+
33
+ spec.add_runtime_dependency 'activesupport', '~> 6.1.4.1'
34
+
35
+ spec.add_development_dependency 'bundler-audit', '~> 0.9.0.1'
36
+ spec.add_development_dependency 'fasterer', '~> 0.9.0'
37
+ spec.add_development_dependency 'ffaker', '~> 2.20'
38
+ spec.add_development_dependency 'overcommit', '~> 0.58.0'
39
+ spec.add_development_dependency 'pry-byebug', '~> 3.9'
40
+ spec.add_development_dependency 'rake', '~> 13.0', '>= 13.0.6'
41
+ spec.add_development_dependency 'reek', '~> 6.0', '>= 6.0.6'
42
+ spec.add_development_dependency 'rspec', '~> 3.10'
43
+ spec.add_development_dependency 'rubocop', '~> 1.24'
44
+ spec.add_development_dependency 'rubocop-performance', '~> 1.13'
45
+ spec.add_development_dependency 'rubocop-rake', '~> 0.6.0'
46
+ spec.add_development_dependency 'rubocop-rspec', '~> 2.7'
47
+ spec.add_development_dependency 'simplecov', '~> 0.17.1'
48
+ spec.add_development_dependency 'webmock', '~> 3.12.2'
49
+ end
metadata ADDED
@@ -0,0 +1,299 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: tempo-ruby
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Ivan Vasylyshyn
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2022-05-01 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: activesupport
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: 6.1.4.1
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: 6.1.4.1
27
+ - !ruby/object:Gem::Dependency
28
+ name: bundler-audit
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: 0.9.0.1
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: 0.9.0.1
41
+ - !ruby/object:Gem::Dependency
42
+ name: fasterer
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: 0.9.0
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: 0.9.0
55
+ - !ruby/object:Gem::Dependency
56
+ name: ffaker
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '2.20'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '2.20'
69
+ - !ruby/object:Gem::Dependency
70
+ name: overcommit
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: 0.58.0
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: 0.58.0
83
+ - !ruby/object:Gem::Dependency
84
+ name: pry-byebug
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: '3.9'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: '3.9'
97
+ - !ruby/object:Gem::Dependency
98
+ name: rake
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - "~>"
102
+ - !ruby/object:Gem::Version
103
+ version: '13.0'
104
+ - - ">="
105
+ - !ruby/object:Gem::Version
106
+ version: 13.0.6
107
+ type: :development
108
+ prerelease: false
109
+ version_requirements: !ruby/object:Gem::Requirement
110
+ requirements:
111
+ - - "~>"
112
+ - !ruby/object:Gem::Version
113
+ version: '13.0'
114
+ - - ">="
115
+ - !ruby/object:Gem::Version
116
+ version: 13.0.6
117
+ - !ruby/object:Gem::Dependency
118
+ name: reek
119
+ requirement: !ruby/object:Gem::Requirement
120
+ requirements:
121
+ - - "~>"
122
+ - !ruby/object:Gem::Version
123
+ version: '6.0'
124
+ - - ">="
125
+ - !ruby/object:Gem::Version
126
+ version: 6.0.6
127
+ type: :development
128
+ prerelease: false
129
+ version_requirements: !ruby/object:Gem::Requirement
130
+ requirements:
131
+ - - "~>"
132
+ - !ruby/object:Gem::Version
133
+ version: '6.0'
134
+ - - ">="
135
+ - !ruby/object:Gem::Version
136
+ version: 6.0.6
137
+ - !ruby/object:Gem::Dependency
138
+ name: rspec
139
+ requirement: !ruby/object:Gem::Requirement
140
+ requirements:
141
+ - - "~>"
142
+ - !ruby/object:Gem::Version
143
+ version: '3.10'
144
+ type: :development
145
+ prerelease: false
146
+ version_requirements: !ruby/object:Gem::Requirement
147
+ requirements:
148
+ - - "~>"
149
+ - !ruby/object:Gem::Version
150
+ version: '3.10'
151
+ - !ruby/object:Gem::Dependency
152
+ name: rubocop
153
+ requirement: !ruby/object:Gem::Requirement
154
+ requirements:
155
+ - - "~>"
156
+ - !ruby/object:Gem::Version
157
+ version: '1.24'
158
+ type: :development
159
+ prerelease: false
160
+ version_requirements: !ruby/object:Gem::Requirement
161
+ requirements:
162
+ - - "~>"
163
+ - !ruby/object:Gem::Version
164
+ version: '1.24'
165
+ - !ruby/object:Gem::Dependency
166
+ name: rubocop-performance
167
+ requirement: !ruby/object:Gem::Requirement
168
+ requirements:
169
+ - - "~>"
170
+ - !ruby/object:Gem::Version
171
+ version: '1.13'
172
+ type: :development
173
+ prerelease: false
174
+ version_requirements: !ruby/object:Gem::Requirement
175
+ requirements:
176
+ - - "~>"
177
+ - !ruby/object:Gem::Version
178
+ version: '1.13'
179
+ - !ruby/object:Gem::Dependency
180
+ name: rubocop-rake
181
+ requirement: !ruby/object:Gem::Requirement
182
+ requirements:
183
+ - - "~>"
184
+ - !ruby/object:Gem::Version
185
+ version: 0.6.0
186
+ type: :development
187
+ prerelease: false
188
+ version_requirements: !ruby/object:Gem::Requirement
189
+ requirements:
190
+ - - "~>"
191
+ - !ruby/object:Gem::Version
192
+ version: 0.6.0
193
+ - !ruby/object:Gem::Dependency
194
+ name: rubocop-rspec
195
+ requirement: !ruby/object:Gem::Requirement
196
+ requirements:
197
+ - - "~>"
198
+ - !ruby/object:Gem::Version
199
+ version: '2.7'
200
+ type: :development
201
+ prerelease: false
202
+ version_requirements: !ruby/object:Gem::Requirement
203
+ requirements:
204
+ - - "~>"
205
+ - !ruby/object:Gem::Version
206
+ version: '2.7'
207
+ - !ruby/object:Gem::Dependency
208
+ name: simplecov
209
+ requirement: !ruby/object:Gem::Requirement
210
+ requirements:
211
+ - - "~>"
212
+ - !ruby/object:Gem::Version
213
+ version: 0.17.1
214
+ type: :development
215
+ prerelease: false
216
+ version_requirements: !ruby/object:Gem::Requirement
217
+ requirements:
218
+ - - "~>"
219
+ - !ruby/object:Gem::Version
220
+ version: 0.17.1
221
+ - !ruby/object:Gem::Dependency
222
+ name: webmock
223
+ requirement: !ruby/object:Gem::Requirement
224
+ requirements:
225
+ - - "~>"
226
+ - !ruby/object:Gem::Version
227
+ version: 3.12.2
228
+ type: :development
229
+ prerelease: false
230
+ version_requirements: !ruby/object:Gem::Requirement
231
+ requirements:
232
+ - - "~>"
233
+ - !ruby/object:Gem::Version
234
+ version: 3.12.2
235
+ description: "\U0001F680 Ruby Tempo Client"
236
+ email:
237
+ - vanyavasylyshyn@gmail.com
238
+ executables: []
239
+ extensions: []
240
+ extra_rdoc_files: []
241
+ files:
242
+ - ".circleci/config.yml"
243
+ - ".fasterer.yml"
244
+ - ".gitignore"
245
+ - ".overcommit.yml"
246
+ - ".reek.yml"
247
+ - ".rspec"
248
+ - ".rubocop.yml"
249
+ - ".ruby-gemset"
250
+ - CHANGELOG.md
251
+ - CODE_OF_CONDUCT.md
252
+ - Gemfile
253
+ - Gemfile.lock
254
+ - LICENSE.txt
255
+ - README.md
256
+ - Rakefile
257
+ - bin/console
258
+ - bin/setup
259
+ - lib/tempo/base.rb
260
+ - lib/tempo/base_factory.rb
261
+ - lib/tempo/client.rb
262
+ - lib/tempo/has_many_proxy.rb
263
+ - lib/tempo/http_client.rb
264
+ - lib/tempo/http_error.rb
265
+ - lib/tempo/request_client.rb
266
+ - lib/tempo/resource/team.rb
267
+ - lib/tempo/resource/team_member.rb
268
+ - lib/tempo/version.rb
269
+ - lib/tempo_ruby.rb
270
+ - tempo-ruby.gemspec
271
+ homepage: https://github.com/vanyavasylyshyn/tempo-ruby
272
+ licenses:
273
+ - MIT
274
+ metadata:
275
+ homepage_uri: https://github.com/vanyavasylyshyn/tempo-ruby
276
+ changelog_uri: https://github.com/vanyavasylyshyn/tempo-ruby/blob/main/CHANGELOG.md
277
+ source_code_uri: https://github.com/vanyavasylyshyn/tempo-ruby
278
+ documentation_uri: https://github.com/vanyavasylyshyn/tempo-ruby/blob/main/README.md
279
+ bug_tracker_uri: https://github.com/vanyavasylyshyn/tempo-ruby/issues
280
+ post_install_message:
281
+ rdoc_options: []
282
+ require_paths:
283
+ - lib
284
+ required_ruby_version: !ruby/object:Gem::Requirement
285
+ requirements:
286
+ - - ">="
287
+ - !ruby/object:Gem::Version
288
+ version: 2.7.0
289
+ required_rubygems_version: !ruby/object:Gem::Requirement
290
+ requirements:
291
+ - - ">="
292
+ - !ruby/object:Gem::Version
293
+ version: '0'
294
+ requirements: []
295
+ rubygems_version: 3.3.12
296
+ signing_key:
297
+ specification_version: 4
298
+ summary: tempo-ruby
299
+ test_files: []