kintone 0.0.5 → 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.
Files changed (39) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +10 -0
  3. data/.travis.yml +2 -1
  4. data/README.md +166 -6
  5. data/kintone.gemspec +4 -2
  6. data/lib/kintone.rb +1 -0
  7. data/lib/kintone/api.rb +30 -3
  8. data/lib/kintone/api/guest.rb +17 -0
  9. data/lib/kintone/command/apis.rb +22 -0
  10. data/lib/kintone/command/app.rb +11 -0
  11. data/lib/kintone/command/guests.rb +15 -0
  12. data/lib/kintone/command/record.rb +6 -2
  13. data/lib/kintone/command/records.rb +9 -5
  14. data/lib/kintone/command/space_guests.rb +11 -0
  15. data/lib/kintone/command/space_members.rb +16 -0
  16. data/lib/kintone/command/space_thread.rb +14 -0
  17. data/lib/kintone/query.rb +146 -0
  18. data/lib/kintone/query/extension.rb +23 -0
  19. data/lib/kintone/type.rb +6 -0
  20. data/lib/kintone/type/extension/enumerable.rb +5 -0
  21. data/lib/kintone/type/extension/hash.rb +5 -0
  22. data/lib/kintone/type/extension/object.rb +5 -0
  23. data/lib/kintone/type/record.rb +11 -0
  24. data/lib/kintone/version.rb +1 -1
  25. data/spec/kintone/api/guest_spec.rb +41 -2
  26. data/spec/kintone/api_spec.rb +83 -20
  27. data/spec/kintone/command/apis_spec.rb +113 -0
  28. data/spec/kintone/command/app_spec.rb +33 -0
  29. data/spec/kintone/command/guests_spec.rb +65 -0
  30. data/spec/kintone/command/record_spec.rb +55 -37
  31. data/spec/kintone/command/records_spec.rb +50 -18
  32. data/spec/kintone/command/space_guests_spec.rb +34 -0
  33. data/spec/kintone/command/space_members_spec.rb +80 -0
  34. data/spec/kintone/command/space_spec.rb +1 -1
  35. data/spec/kintone/command/space_thread_spec.rb +52 -0
  36. data/spec/kintone/query_spec.rb +294 -0
  37. data/spec/kintone/type/record_spec.rb +38 -0
  38. data/spec/spec_helper.rb +1 -0
  39. metadata +67 -10
@@ -0,0 +1,34 @@
1
+ require 'spec_helper'
2
+ require 'kintone/command/space_guests'
3
+ require 'kintone/api'
4
+
5
+ describe Kintone::Command::SpaceGuests do
6
+ let(:target) { Kintone::Command::SpaceGuests.new(guest) }
7
+ let(:guest) { api.guest(guest_id) }
8
+ let(:guest_id) { 1 }
9
+ let(:api) { Kintone::Api.new('example.cybozu.com', 'Administrator', 'cybozu') }
10
+
11
+ describe '#update' do
12
+ before(:each) do
13
+ stub_request(
14
+ :put,
15
+ 'https://example.cybozu.com/k/guest/1/v1/space/guests.json'
16
+ )
17
+ .with(body: { id: id, guests: guests }.to_json)
18
+ .to_return(body: '{}', status: 200)
19
+ end
20
+
21
+ subject { target.update(id, guests) }
22
+
23
+ let(:id) { 10 }
24
+ let(:guests) do
25
+ [
26
+ 'guest1@example.com',
27
+ 'guest2@example.com',
28
+ 'guest3@example.com'
29
+ ]
30
+ end
31
+
32
+ it { is_expected.to be_truthy }
33
+ end
34
+ end
@@ -0,0 +1,80 @@
1
+ require 'spec_helper'
2
+ require 'kintone/command/space_members'
3
+ require 'kintone/api'
4
+
5
+ describe Kintone::Command::SpaceMembers do
6
+ let(:target) { Kintone::Command::SpaceMembers.new(api) }
7
+ let(:api) { Kintone::Api.new('example.cybozu.com', 'Administrator', 'cybozu') }
8
+
9
+ describe '#get' do
10
+ before(:each) do
11
+ stub_request(
12
+ :get,
13
+ 'https://example.cybozu.com/k/v1/space/members.json'
14
+ )
15
+ .with(query: { id: id })
16
+ .to_return(body: response_data.to_json, status: 200)
17
+ end
18
+
19
+ subject { target.get(id) }
20
+
21
+ let(:id) { 1 }
22
+
23
+ def response_data
24
+ {
25
+ 'members' => members
26
+ }
27
+ end
28
+
29
+ def members
30
+ [
31
+ {
32
+ 'entity' => { 'type' => 'USER', 'code' => 'user1' },
33
+ 'isAdmin' => false,
34
+ 'isImplicit' => true
35
+ }
36
+ ]
37
+ end
38
+
39
+ it { expect(subject).to match members }
40
+ end
41
+
42
+ describe '#update' do
43
+ before(:each) do
44
+ stub_request(
45
+ :put,
46
+ 'https://example.cybozu.com/k/v1/space/members.json'
47
+ )
48
+ .with(body: request_data.to_json)
49
+ .to_return(body: '{}', status: 200)
50
+ end
51
+
52
+ subject { target.update(id, members) }
53
+
54
+ let(:id) { 1 }
55
+ let(:members) do
56
+ [
57
+ {
58
+ 'entity' => { 'type' => 'USER', 'code' => 'user1' },
59
+ 'isAdmin' => false,
60
+ 'isImplicit' => true
61
+ }
62
+ ]
63
+ end
64
+
65
+ def request_data
66
+ {
67
+ 'id' => 1,
68
+ 'members' => [
69
+ {
70
+ 'entity' => { 'type' => 'USER', 'code' => 'user1' },
71
+ 'isAdmin' => false,
72
+ 'isImplicit' => true
73
+ }
74
+ ]
75
+ }
76
+ end
77
+
78
+ it { expect(subject).to be_truthy }
79
+ end
80
+ end
@@ -41,7 +41,7 @@ describe Kintone::Command::Space do
41
41
  :delete,
42
42
  'https://example.cybozu.com/k/v1/space.json'
43
43
  )
44
- .with(query: { id: 1 })
44
+ .with(body: { id: 1 }.to_json)
45
45
  .to_return(body: '{}', status: 200)
46
46
  end
47
47
 
@@ -0,0 +1,52 @@
1
+ require 'spec_helper'
2
+ require 'kintone/command/space_thread'
3
+ require 'kintone/api'
4
+
5
+ describe Kintone::Command::SpaceThread do
6
+ let(:target) { Kintone::Command::SpaceThread.new(api) }
7
+ let(:api) { Kintone::Api.new('example.cybozu.com', 'Administrator', 'cybozu') }
8
+
9
+ describe '#update' do
10
+ before(:each) do
11
+ stub_request(
12
+ :put,
13
+ 'https://example.cybozu.com/k/v1/space/thread.json'
14
+ )
15
+ .with(body: request_body)
16
+ .to_return(body: '{}', status: 200)
17
+ end
18
+
19
+ subject { target.update(id, name: name, body: body) }
20
+
21
+ let(:id) { 1 }
22
+
23
+ where(:name, :body, :request_body) do
24
+ [
25
+ [
26
+ 'example thread',
27
+ '<b>awesome thread!</b>',
28
+ '{"id":1,"name":"example thread","body":"<b>awesome thread!</b>"}'
29
+ ],
30
+ [
31
+ nil,
32
+ '<b>awesome thread!</b>',
33
+ '{"id":1,"body":"<b>awesome thread!</b>"}'
34
+ ],
35
+ [
36
+ 'example thread',
37
+ nil,
38
+ '{"id":1,"name":"example thread"}'
39
+ ],
40
+ [
41
+ nil,
42
+ nil,
43
+ '{"id":1}'
44
+ ]
45
+ ]
46
+ end
47
+
48
+ with_them do
49
+ it { expect(subject).to be_truthy }
50
+ end
51
+ end
52
+ end
@@ -0,0 +1,294 @@
1
+ require 'spec_helper'
2
+ require 'kintone/query'
3
+
4
+ describe Kintone::Query do
5
+ describe '#to_s' do
6
+ subject { target.to_s }
7
+
8
+ context '==' do
9
+ where(:target, :result) do
10
+ [
11
+ [Kintone::Query.new { field(:text) == '"Hello, world."' }, 'text = "Hello, world."'],
12
+ [Kintone::Query.new { field(:text) == 'Hello, world.' }, 'text = "Hello, world."'],
13
+ [Kintone::Query.new { field('作成日時') == now }, '作成日時 = NOW()'],
14
+ [Kintone::Query.new { field('作成日時') == today }, '作成日時 = TODAY()'],
15
+ [Kintone::Query.new { field('作成日時') == this_month }, '作成日時 = THIS_MONTH()'],
16
+ [Kintone::Query.new { field('作成日時') == last_month }, '作成日時 = LAST_MONTH()'],
17
+ [Kintone::Query.new { field('作成日時') == this_year }, '作成日時 = THIS_YEAR()'],
18
+ [Kintone::Query.new { field(:number) == 100 }, 'number = 100']
19
+ ]
20
+ end
21
+
22
+ with_them do
23
+ it { expect(subject).to eq result }
24
+ end
25
+ end
26
+
27
+ context '!=' do
28
+ where(:target, :result) do
29
+ [
30
+ [Kintone::Query.new { field(:text) != '"Hello, world."' }, 'text != "Hello, world."'],
31
+ [Kintone::Query.new { field(:text) != 'Hello, world.' }, 'text != "Hello, world."'],
32
+ [Kintone::Query.new { field('作成日時') != now }, '作成日時 != NOW()'],
33
+ [Kintone::Query.new { field('作成日時') != today }, '作成日時 != TODAY()'],
34
+ [Kintone::Query.new { field('作成日時') != this_month }, '作成日時 != THIS_MONTH()'],
35
+ [Kintone::Query.new { field('作成日時') != last_month }, '作成日時 != LAST_MONTH()'],
36
+ [Kintone::Query.new { field('作成日時') != this_year }, '作成日時 != THIS_YEAR()'],
37
+ [Kintone::Query.new { field(:number) != 100 }, 'number != 100']
38
+ ]
39
+ end
40
+
41
+ with_them do
42
+ it { expect(subject).to eq result }
43
+ end
44
+ end
45
+
46
+ context '>' do
47
+ where(:target, :result) do
48
+ [
49
+ [Kintone::Query.new { field(:text) > '"Hello, world."' }, 'text > "Hello, world."'],
50
+ [Kintone::Query.new { field(:text) > 'Hello, world.' }, 'text > "Hello, world."'],
51
+ [Kintone::Query.new { field('作成日時') > now }, '作成日時 > NOW()'],
52
+ [Kintone::Query.new { field('作成日時') > today }, '作成日時 > TODAY()'],
53
+ [Kintone::Query.new { field('作成日時') > this_month }, '作成日時 > THIS_MONTH()'],
54
+ [Kintone::Query.new { field('作成日時') > last_month }, '作成日時 > LAST_MONTH()'],
55
+ [Kintone::Query.new { field('作成日時') > this_year }, '作成日時 > THIS_YEAR()'],
56
+ [Kintone::Query.new { field(:number) > 100 }, 'number > 100']
57
+ ]
58
+ end
59
+
60
+ with_them do
61
+ it { expect(subject).to eq result }
62
+ end
63
+ end
64
+
65
+ context '<' do
66
+ where(:target, :result) do
67
+ [
68
+ [Kintone::Query.new { field(:text) < '"Hello, world."' }, 'text < "Hello, world."'],
69
+ [Kintone::Query.new { field(:text) < 'Hello, world.' }, 'text < "Hello, world."'],
70
+ [Kintone::Query.new { field('作成日時') < now }, '作成日時 < NOW()'],
71
+ [Kintone::Query.new { field('作成日時') < today }, '作成日時 < TODAY()'],
72
+ [Kintone::Query.new { field('作成日時') < this_month }, '作成日時 < THIS_MONTH()'],
73
+ [Kintone::Query.new { field('作成日時') < last_month }, '作成日時 < LAST_MONTH()'],
74
+ [Kintone::Query.new { field('作成日時') < this_year }, '作成日時 < THIS_YEAR()'],
75
+ [Kintone::Query.new { field(:number) < 100 }, 'number < 100']
76
+ ]
77
+ end
78
+
79
+ with_them do
80
+ it { expect(subject).to eq result }
81
+ end
82
+ end
83
+
84
+ context '>=' do
85
+ where(:target, :result) do
86
+ [
87
+ [Kintone::Query.new { field(:text) >= '"Hello, world."' }, 'text >= "Hello, world."'],
88
+ [Kintone::Query.new { field(:text) >= 'Hello, world.' }, 'text >= "Hello, world."'],
89
+ [Kintone::Query.new { field('作成日時') >= now }, '作成日時 >= NOW()'],
90
+ [Kintone::Query.new { field('作成日時') >= today }, '作成日時 >= TODAY()'],
91
+ [Kintone::Query.new { field('作成日時') >= this_month }, '作成日時 >= THIS_MONTH()'],
92
+ [Kintone::Query.new { field('作成日時') >= last_month }, '作成日時 >= LAST_MONTH()'],
93
+ [Kintone::Query.new { field('作成日時') >= this_year }, '作成日時 >= THIS_YEAR()'],
94
+ [Kintone::Query.new { field(:number) >= 100 }, 'number >= 100']
95
+ ]
96
+ end
97
+
98
+ with_them do
99
+ it { expect(subject).to eq result }
100
+ end
101
+ end
102
+
103
+ context '<=' do
104
+ where(:target, :result) do
105
+ [
106
+ [Kintone::Query.new { field(:text) <= '"Hello, world."' }, 'text <= "Hello, world."'],
107
+ [Kintone::Query.new { field(:text) <= 'Hello, world.' }, 'text <= "Hello, world."'],
108
+ [Kintone::Query.new { field('作成日時') <= now }, '作成日時 <= NOW()'],
109
+ [Kintone::Query.new { field('作成日時') <= today }, '作成日時 <= TODAY()'],
110
+ [Kintone::Query.new { field('作成日時') <= this_month }, '作成日時 <= THIS_MONTH()'],
111
+ [Kintone::Query.new { field('作成日時') <= last_month }, '作成日時 <= LAST_MONTH()'],
112
+ [Kintone::Query.new { field('作成日時') <= this_year }, '作成日時 <= THIS_YEAR()'],
113
+ [Kintone::Query.new { field(:number) <= 100 }, 'number <= 100']
114
+ ]
115
+ end
116
+
117
+ with_them do
118
+ it { expect(subject).to eq result }
119
+ end
120
+ end
121
+
122
+ context 'in' do
123
+ where(:target, :result) do
124
+ [
125
+ [Kintone::Query.new { field(:dropdown).in(['"A"', '"B"']) }, 'dropdown in ("A", "B")'],
126
+ [Kintone::Query.new { field(:dropdown).in(%w(A B)) }, 'dropdown in ("A", "B")'],
127
+ [Kintone::Query.new { field(:dropdown).in([:A, :B]) }, 'dropdown in ("A", "B")'],
128
+ [Kintone::Query.new { field(:dropdown).in([100, 200]) }, 'dropdown in (100, 200)'],
129
+ [Kintone::Query.new { field('作成者').in([login_user]) }, '作成者 in (LOGINUSER())']
130
+ ]
131
+ end
132
+
133
+ with_them do
134
+ it { expect(subject).to eq result }
135
+ end
136
+ end
137
+
138
+ context 'not in' do
139
+ where(:target, :result) do
140
+ [
141
+ [
142
+ Kintone::Query.new { field(:dropdown).not_in(['"A"', '"B"']) },
143
+ 'dropdown not in ("A", "B")'
144
+ ],
145
+ [
146
+ Kintone::Query.new { field(:dropdown).not_in(%w(A B)) },
147
+ 'dropdown not in ("A", "B")'
148
+ ],
149
+ [
150
+ Kintone::Query.new { field(:dropdown).not_in([:A, :B]) },
151
+ 'dropdown not in ("A", "B")'
152
+ ],
153
+ [
154
+ Kintone::Query.new { field(:dropdown).not_in([100, 200]) },
155
+ 'dropdown not in (100, 200)'
156
+ ],
157
+ [
158
+ Kintone::Query.new { field('作成者').not_in([login_user]) },
159
+ '作成者 not in (LOGINUSER())'
160
+ ]
161
+ ]
162
+ end
163
+
164
+ with_them do
165
+ it { expect(subject).to eq result }
166
+ end
167
+ end
168
+
169
+ context 'like' do
170
+ where(:target, :result) do
171
+ [
172
+ [Kintone::Query.new { field(:text).like('Hello') }, 'text like "Hello"'],
173
+ [Kintone::Query.new { field(:text).like('"Hello"') }, 'text like "Hello"'],
174
+ [Kintone::Query.new { field(:text).like(:Hello) }, 'text like "Hello"']
175
+ ]
176
+ end
177
+
178
+ with_them do
179
+ it { expect(subject).to eq result }
180
+ end
181
+ end
182
+
183
+ context 'not like' do
184
+ where(:target, :result) do
185
+ [
186
+ [Kintone::Query.new { field(:text).not_like('Hello') }, 'text not like "Hello"'],
187
+ [Kintone::Query.new { field(:text).not_like('"Hello"') }, 'text not like "Hello"'],
188
+ [Kintone::Query.new { field(:text).not_like(:Hello) }, 'text not like "Hello"']
189
+ ]
190
+ end
191
+
192
+ with_them do
193
+ it { expect(subject).to eq result }
194
+ end
195
+ end
196
+
197
+ context 'and!' do
198
+ let(:target) do
199
+ Kintone::Query.new do
200
+ field(:text).like 'Hello'
201
+ and!
202
+ field(:number) > 100
203
+ end
204
+ end
205
+
206
+ def result
207
+ 'text like "Hello" and number > 100'
208
+ end
209
+
210
+ it { expect(subject).to eq result }
211
+ end
212
+
213
+ context 'or!' do
214
+ let(:target) do
215
+ Kintone::Query.new do
216
+ field(:text).like 'Hello'
217
+ or!
218
+ field(:number) > 100
219
+ end
220
+ end
221
+
222
+ def result
223
+ 'text like "Hello" or number > 100'
224
+ end
225
+
226
+ it { expect(subject).to eq result }
227
+ end
228
+
229
+ context 'precede' do
230
+ let(:target) do
231
+ Kintone::Query.new do
232
+ precede do
233
+ field(:text).like 'Hello'
234
+ or!
235
+ field(:number) > 100
236
+ end
237
+ and!
238
+ precede do
239
+ field(:text2).not_like 'Hello'
240
+ and!
241
+ field(:number2) <= 100
242
+ end
243
+ end
244
+ end
245
+
246
+ def result
247
+ '(text like "Hello" or number > 100) and (text2 not like "Hello" and number2 <= 100)'
248
+ end
249
+
250
+ it { expect(subject).to eq result }
251
+ end
252
+
253
+ context 'order by' do
254
+ where(:target, :result) do
255
+ [
256
+ [Kintone::Query.new { order_by(:record_id, :asc) }, 'order by record_id asc'],
257
+ [Kintone::Query.new { order_by(:record_id, :desc) }, 'order by record_id desc'],
258
+ [Kintone::Query.new { order_by(:record_id) }, 'order by record_id asc'],
259
+ [Kintone::Query.new { order_by('作成日時', :desc) }, 'order by 作成日時 desc']
260
+ ]
261
+ end
262
+
263
+ with_them do
264
+ it { expect(subject).to eq result }
265
+ end
266
+ end
267
+
268
+ context 'limit' do
269
+ where(:target, :result) do
270
+ [
271
+ [Kintone::Query.new { limit(20) }, 'limit 20'],
272
+ [Kintone::Query.new { limit('20') }, 'limit 20']
273
+ ]
274
+ end
275
+
276
+ with_them do
277
+ it { expect(subject).to eq result }
278
+ end
279
+ end
280
+
281
+ context 'offset' do
282
+ where(:target, :result) do
283
+ [
284
+ [Kintone::Query.new { offset(30) }, 'offset 30'],
285
+ [Kintone::Query.new { offset('30') }, 'offset 30']
286
+ ]
287
+ end
288
+
289
+ with_them do
290
+ it { expect(subject).to eq result }
291
+ end
292
+ end
293
+ end
294
+ end