timetree 0.0.1 → 0.1.4

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,79 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'faraday'
4
+ require 'faraday_middleware'
5
+
6
+ module TimeTree
7
+ # Command for HTTP request.
8
+ class HttpCommand
9
+ def initialize(host, client)
10
+ @host = host
11
+ @client = client
12
+ @logger = TimeTree.configuration.logger
13
+ end
14
+
15
+ # @param path [String] String or URI to access.
16
+ # @param params [Hash] Hash of URI query unencoded key/value pairs.
17
+ def get(path, params = {})
18
+ logger.info "GET #{connection.build_url("#{@host}#{path}", params)}"
19
+ res = connection.get path, params
20
+ @client.update_ratelimit(res)
21
+ logger.debug "Response status:#{res.status}, body:#{res.body}"
22
+ res
23
+ end
24
+
25
+ # @param path [String] String or URI to access.
26
+ # @param body_params [Hash]
27
+ # The request bodythat will eventually be converted to JSON.
28
+ def post(path, body_params = {})
29
+ @logger.debug "POST #{@host}#{path} body:#{body_params}"
30
+ headers = { 'Content-Type' => 'application/json' }
31
+ res = connection.run_request :post, path, body_params.to_json, headers
32
+ @client.update_ratelimit(res)
33
+ logger.debug "Response status:#{res.status}, body:#{res.body}"
34
+ res
35
+ end
36
+
37
+ # @param path [String] String or URI to access.
38
+ # @param body_params [Hash]
39
+ # The request bodythat will eventually be converted to JSON.
40
+ def put(path, body_params = {})
41
+ logger.debug "PUT #{@host}#{path} body:#{body_params}"
42
+ headers = { 'Content-Type' => 'application/json' }
43
+ res = connection.run_request :put, path, body_params.to_json, headers
44
+ @client.update_ratelimit(res)
45
+ logger.debug "Response status:#{res.status}, body:#{res.body}"
46
+ res
47
+ end
48
+
49
+ # @param path [String] String or URI to access.
50
+ # @param params [Hash] Hash of URI query unencoded key/value pairs.
51
+ def delete(path, params = {})
52
+ @logger.debug "DELETE #{@host}#{path} params:#{params}"
53
+ res = connection.delete path, params
54
+ @client.update_ratelimit(res)
55
+ logger.debug "Response status:#{res.status}, body:#{res.body}"
56
+ res
57
+ end
58
+
59
+ private
60
+
61
+ attr_reader :logger
62
+
63
+ def connection
64
+ Faraday.new(
65
+ url: @host,
66
+ headers: base_request_headers
67
+ ) do |builder|
68
+ builder.response :json, parser_options: { symbolize_names: true }, content_type: /\bjson$/
69
+ end
70
+ end
71
+
72
+ def base_request_headers
73
+ {
74
+ 'Accept' => 'application/vnd.timetree.v1+json',
75
+ 'Authorization' => "Bearer #{@client.token}"
76
+ }
77
+ end
78
+ end
79
+ end
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ module TimeTree
4
+ # Model for TimeTree color theme.
5
+ class Label < BaseModel
6
+ # @return [String]
7
+ attr_accessor :name
8
+ # @return [String]
9
+ attr_accessor :color
10
+ end
11
+ end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ module TimeTree
4
+ # Model for TimeTree user.
5
+ class User < BaseModel
6
+ # @return [String]
7
+ attr_accessor :name
8
+ # @return [String]
9
+ attr_accessor :description
10
+ # @return [String]
11
+ attr_accessor :image_url
12
+ end
13
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module TimeTree
4
- VERSION = '0.0.1'
4
+ VERSION = '0.1.4'
5
5
  end
@@ -17,7 +17,7 @@ Gem::Specification.new do |spec|
17
17
  spec.metadata['homepage_uri'] = spec.homepage
18
18
  spec.metadata['source_code_uri'] = 'https://github.com/koshilife/timetree-api-ruby-client'
19
19
  spec.metadata['changelog_uri'] = "#{spec.metadata['source_code_uri']}/blob/master/CHANGELOG.md"
20
- spec.metadata['documentation_uri'] = 'https://www.rubydoc.info/gems/timetree/'
20
+ spec.metadata['documentation_uri'] = "https://www.rubydoc.info/gems/timetree/#{spec.version}"
21
21
 
22
22
  # Specify which files should be added to the gem when it is released.
23
23
  # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
@@ -30,10 +30,12 @@ Gem::Specification.new do |spec|
30
30
 
31
31
  spec.add_runtime_dependency 'faraday', '~> 1.0.1'
32
32
  spec.add_runtime_dependency 'faraday_middleware', '~> 1.0.0'
33
+ spec.add_runtime_dependency 'zeitwerk', '~> 2.3.0'
33
34
 
34
35
  spec.add_development_dependency 'bundler', '~> 2.0'
35
36
  spec.add_development_dependency 'minitest', '~> 5.14.0'
36
37
  spec.add_development_dependency 'minitest-reporters', '~> 1.4.2'
37
38
  spec.add_development_dependency 'rake', '~> 12.0'
38
39
  spec.add_development_dependency 'webmock', '~> 3.7.6'
40
+ spec.add_development_dependency 'simplecov', '~> 0.18.5'
39
41
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: timetree
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.1.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Kenji Koshikawa
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2020-06-21 00:00:00.000000000 Z
11
+ date: 2020-06-30 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: faraday
@@ -38,6 +38,20 @@ dependencies:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
40
  version: 1.0.0
41
+ - !ruby/object:Gem::Dependency
42
+ name: zeitwerk
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: 2.3.0
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: 2.3.0
41
55
  - !ruby/object:Gem::Dependency
42
56
  name: bundler
43
57
  requirement: !ruby/object:Gem::Requirement
@@ -108,6 +122,20 @@ dependencies:
108
122
  - - "~>"
109
123
  - !ruby/object:Gem::Version
110
124
  version: 3.7.6
125
+ - !ruby/object:Gem::Dependency
126
+ name: simplecov
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - "~>"
130
+ - !ruby/object:Gem::Version
131
+ version: 0.18.5
132
+ type: :development
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - "~>"
137
+ - !ruby/object:Gem::Version
138
+ version: 0.18.5
111
139
  description: Client for accessing TimeTree APIs
112
140
  email:
113
141
  - koshikawa2009@gmail.com
@@ -127,9 +155,16 @@ files:
127
155
  - bin/console
128
156
  - bin/setup
129
157
  - lib/timetree.rb
158
+ - lib/timetree/activity.rb
159
+ - lib/timetree/api_error.rb
160
+ - lib/timetree/base_model.rb
161
+ - lib/timetree/calendar.rb
130
162
  - lib/timetree/client.rb
131
163
  - lib/timetree/configuration.rb
132
- - lib/timetree/models.rb
164
+ - lib/timetree/event.rb
165
+ - lib/timetree/http_command.rb
166
+ - lib/timetree/label.rb
167
+ - lib/timetree/user.rb
133
168
  - lib/timetree/version.rb
134
169
  - timetree.gemspec
135
170
  homepage: https://github.com/koshilife/timetree-api-ruby-client
@@ -139,7 +174,7 @@ metadata:
139
174
  homepage_uri: https://github.com/koshilife/timetree-api-ruby-client
140
175
  source_code_uri: https://github.com/koshilife/timetree-api-ruby-client
141
176
  changelog_uri: https://github.com/koshilife/timetree-api-ruby-client/blob/master/CHANGELOG.md
142
- documentation_uri: https://www.rubydoc.info/gems/timetree/
177
+ documentation_uri: https://www.rubydoc.info/gems/timetree/0.1.4
143
178
  post_install_message:
144
179
  rdoc_options: []
145
180
  require_paths:
@@ -1,282 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'time'
4
-
5
- module TimeTree
6
- class BaseModel
7
- attr_reader :id
8
- attr_reader :type
9
- attr_accessor :relationships
10
-
11
- # @param data [Hash]
12
- # @param client [TimeTree::Client]
13
- # @return [TimeTree::BaseModel]
14
- def self.to_model(data, included: nil, client: nil)
15
- id = data[:id]
16
- type = data[:type]
17
- return if type.nil?
18
-
19
- attributes = data[:attributes] || {}
20
- relationships = data[:relationships] || {}
21
- params = {
22
- id: id,
23
- type: type,
24
- client: client,
25
- attributes: attributes,
26
- relationships: relationships,
27
- included: included
28
- }
29
-
30
- case type
31
- when 'user'
32
- User.new(**params)
33
- when 'label'
34
- Label.new(**params)
35
- when 'event'
36
- Event.new(**params)
37
- when 'calendar'
38
- Calendar.new(**params)
39
- when 'activity'
40
- Activity.new(**params)
41
- end
42
- end
43
-
44
- def initialize(id:, type:, client: nil, attributes: nil, relationships: nil, included: nil)
45
- @id = id
46
- @type = type
47
- @client = client
48
- set_attributes attributes
49
- set_relationships relationships, included
50
- end
51
-
52
- def inspect
53
- "\#<#{self.class}:#{object_id} id:#{id}>"
54
- end
55
-
56
- private
57
-
58
- def to_model(data)
59
- self.class.to_model data, client: @client
60
- end
61
-
62
- def set_attributes(attributes)
63
- return unless attributes.is_a? Hash
64
- return if attributes.empty?
65
-
66
- setter_methods = self.class.instance_methods.select { |method| method.to_s.end_with? '=' }
67
- attributes.each do |key, value|
68
- setter = "#{key.to_sym}=".to_sym
69
- next unless setter_methods.include? setter
70
-
71
- if defined?(self.class::TIME_FIELDS) && self.class::TIME_FIELDS.include?(key)
72
- value = Time.parse value
73
- end
74
- instance_variable_set "@#{key}", value
75
- end
76
- end
77
-
78
- def set_relationships(relationships, included)
79
- return unless relationships.is_a? Hash
80
- return if relationships.empty?
81
- return unless defined? self.class::RELATIONSHIPS
82
- return if self.class::RELATIONSHIPS.empty?
83
-
84
- self.class::RELATIONSHIPS.each do |key|
85
- relation = relationships[key]
86
- next unless relation
87
- next unless relation[:data]
88
-
89
- @relationships ||= {}
90
- @relationships[key] = relation[:data]
91
- end
92
-
93
- return if included.nil?
94
- return unless included.is_a? Array
95
- return if included.empty?
96
-
97
- set_relationship_data_if_included(included)
98
- end
99
-
100
- def set_relationship_data_if_included(included)
101
- @_relation_data_dic = {}
102
- included.each do |data|
103
- item = to_model(data)
104
- next unless item
105
-
106
- @_relation_data_dic[item.type] ||= {}
107
- @_relation_data_dic[item.type][item.id] = item
108
- end
109
- detect_relation_data = lambda { |type, id|
110
- return unless @_relation_data_dic[type]
111
-
112
- @_relation_data_dic[type][id]
113
- }
114
- @relationships.each do |key, id_data|
115
- relation_data = nil
116
- if id_data.is_a? Array
117
- relation_data = []
118
- id_data.each do |d|
119
- item = detect_relation_data.call(d[:type], d[:id])
120
- relation_data << item if item
121
- end
122
- elsif id_data.is_a? Hash
123
- relation_data = detect_relation_data.call(id_data[:type], id_data[:id])
124
- end
125
- instance_variable_set "@#{key}", relation_data if relation_data
126
- end
127
- end
128
- end
129
-
130
- class User < BaseModel
131
- attr_accessor :name
132
- attr_accessor :description
133
- attr_accessor :image_url
134
- end
135
-
136
- class Label < BaseModel
137
- attr_accessor :name
138
- attr_accessor :color
139
- end
140
-
141
- class Calendar < BaseModel
142
- attr_accessor :name
143
- attr_accessor :description
144
- attr_accessor :color
145
- attr_accessor :order
146
- attr_accessor :image_url
147
- attr_accessor :created_at
148
-
149
- TIME_FIELDS = %i[created_at].freeze
150
- RELATIONSHIPS = %i[labels members].freeze
151
-
152
- def event(event_id)
153
- return if @client.nil?
154
-
155
- @client.event id, event_id
156
- end
157
-
158
- def upcoming_events(days: 7, timezone: 'UTC')
159
- return if @client.nil?
160
-
161
- @client.upcoming_events id, days: days, timezone: timezone
162
- end
163
-
164
- def labels
165
- return @labels if defined? @labels
166
- return if @client.nil?
167
-
168
- @labels = @client.calendar_labels id
169
- end
170
-
171
- def members
172
- return @members if defined? @members
173
- return if @client.nil?
174
-
175
- @members = @client.calendar_members id
176
- end
177
- end
178
-
179
- class Event < BaseModel
180
- attr_accessor :category
181
- attr_accessor :title
182
- attr_accessor :all_day
183
- attr_accessor :start_at
184
- attr_accessor :start_timezone
185
- attr_accessor :end_at
186
- attr_accessor :end_timezone
187
- attr_accessor :recurrences
188
- attr_accessor :recurring_uuid
189
- attr_accessor :description
190
- attr_accessor :location
191
- attr_accessor :url
192
- attr_accessor :updated_at
193
- attr_accessor :created_at
194
- attr_accessor :calendar_id
195
-
196
- attr_reader :creator
197
- attr_reader :label
198
- attr_reader :attendees
199
-
200
- TIME_FIELDS = %i[start_at end_at updated_at created_at].freeze
201
- RELATIONSHIPS = %i[creator label attendees].freeze
202
-
203
- def create
204
- return if @client.nil?
205
-
206
- @client.create_event calendar_id, data_params
207
- end
208
-
209
- def create_comment(message)
210
- return if @client.nil?
211
-
212
- params = { type: 'activity', attributes: { calendar_id: calendar_id, event_id: id, content: message } }
213
- activity = to_model params
214
- return if activity.nil?
215
-
216
- activity.create
217
- end
218
-
219
- def update
220
- return if @client.nil?
221
- return if id.nil?
222
-
223
- @client.update_event calendar_id, id, data_params
224
- end
225
-
226
- def delete
227
- return if @client.nil?
228
- return if id.nil?
229
-
230
- @client.delete_event calendar_id, id
231
- end
232
-
233
- def data_params
234
- attributes_params = {
235
- category: category,
236
- title: title,
237
- all_day: all_day,
238
- start_at: start_at.iso8601,
239
- start_timezone: start_timezone,
240
- end_at: end_at.iso8601,
241
- end_timezone: end_timezone,
242
- description: description,
243
- location: location,
244
- url: url
245
- }
246
- relationhips_params = {}
247
- if @relationships[:label]
248
- label_data = { id: @relationships[:label], type: 'label' }
249
- relationhips_params[:label] = { data: label_data }
250
- end
251
- if @relationships[:attendees]
252
- attendees_data = @relationships[:attendees].map { |_id| { id: _id, type: 'user' } }
253
- relationhips_params[:attendees] = { data: attendees_data }
254
- end
255
- {
256
- data: { attributes: attributes_params, relationships: relationhips_params }
257
- }
258
- end
259
- end
260
-
261
- class Activity < BaseModel
262
- attr_accessor :content
263
- attr_accessor :updated_at
264
- attr_accessor :created_at
265
- attr_accessor :calendar_id
266
- attr_accessor :event_id
267
-
268
- TIME_FIELDS = %i[updated_at created_at].freeze
269
-
270
- def create
271
- return if @client.nil?
272
-
273
- @client.create_activity calendar_id, event_id, data_params
274
- end
275
-
276
- def data_params
277
- {
278
- data: { attributes: { content: content } }
279
- }
280
- end
281
- end
282
- end