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.
- checksums.yaml +4 -4
- data/.gitignore +1 -0
- data/CHANGELOG.md +24 -0
- data/README.md +63 -7
- data/lib/timetree.rb +9 -12
- data/lib/timetree/activity.rb +46 -0
- data/lib/timetree/api_error.rb +29 -0
- data/lib/timetree/base_model.rb +144 -0
- data/lib/timetree/calendar.rb +80 -0
- data/lib/timetree/client.rb +187 -108
- data/lib/timetree/configuration.rb +5 -1
- data/lib/timetree/event.rb +134 -0
- data/lib/timetree/http_command.rb +79 -0
- data/lib/timetree/label.rb +11 -0
- data/lib/timetree/user.rb +13 -0
- data/lib/timetree/version.rb +1 -1
- data/timetree.gemspec +3 -1
- metadata +39 -4
- data/lib/timetree/models.rb +0 -282
@@ -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,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
|
data/lib/timetree/version.rb
CHANGED
data/timetree.gemspec
CHANGED
@@ -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'] =
|
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.
|
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-
|
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/
|
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:
|
data/lib/timetree/models.rb
DELETED
@@ -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
|