timetree 0.0.1 → 0.1.4
Sign up to get free protection for your applications and to get access to all the features.
- 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
|