amorail 0.4.0 → 0.7.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.
- checksums.yaml +5 -5
- data/.github/workflows/rspec.yml +23 -0
- data/.gitignore +2 -1
- data/.rubocop.yml +3 -0
- data/CHANGELOG.md +19 -0
- data/README.md +49 -8
- data/RELEASING.md +43 -0
- data/amorail.gemspec +5 -3
- data/lib/amorail.rb +27 -6
- data/lib/amorail/access_token.rb +44 -0
- data/lib/amorail/client.rb +84 -23
- data/lib/amorail/config.rb +14 -8
- data/lib/amorail/entities/company.rb +2 -0
- data/lib/amorail/entities/contact.rb +3 -0
- data/lib/amorail/entities/contact_link.rb +2 -0
- data/lib/amorail/entities/elementable.rb +4 -2
- data/lib/amorail/entities/lead.rb +3 -0
- data/lib/amorail/entities/leadable.rb +3 -0
- data/lib/amorail/entities/note.rb +2 -0
- data/lib/amorail/entities/task.rb +2 -0
- data/lib/amorail/entities/webhook.rb +44 -0
- data/lib/amorail/entity.rb +17 -3
- data/lib/amorail/entity/finders.rb +5 -2
- data/lib/amorail/entity/params.rb +3 -2
- data/lib/amorail/entity/persistence.rb +5 -0
- data/lib/amorail/exceptions.rb +2 -0
- data/lib/amorail/property.rb +7 -3
- data/lib/amorail/railtie.rb +3 -1
- data/lib/amorail/store_adapters.rb +15 -0
- data/lib/amorail/store_adapters/abstract_store_adapter.rb +23 -0
- data/lib/amorail/store_adapters/memory_store_adapter.rb +50 -0
- data/lib/amorail/store_adapters/redis_store_adapter.rb +83 -0
- data/lib/amorail/version.rb +3 -1
- data/lib/tasks/amorail.rake +2 -0
- data/spec/access_token_spec.rb +59 -0
- data/spec/client_spec.rb +36 -24
- data/spec/company_spec.rb +2 -0
- data/spec/contact_link_spec.rb +2 -0
- data/spec/contact_spec.rb +2 -0
- data/spec/entity_spec.rb +2 -0
- data/spec/fixtures/amorail_test.yml +5 -3
- data/spec/fixtures/authorize.json +6 -0
- data/spec/fixtures/webhooks/list.json +24 -0
- data/spec/fixtures/webhooks/subscribe.json +17 -0
- data/spec/fixtures/webhooks/unsubscribe.json +17 -0
- data/spec/helpers/webmock_helpers.rb +80 -13
- data/spec/lead_spec.rb +2 -0
- data/spec/my_contact_spec.rb +2 -0
- data/spec/note_spec.rb +2 -0
- data/spec/property_spec.rb +2 -0
- data/spec/spec_helper.rb +4 -2
- data/spec/store_adapters/memory_store_adapter_spec.rb +56 -0
- data/spec/store_adapters/redis_store_adapter_spec.rb +67 -0
- data/spec/support/elementable_example.rb +2 -0
- data/spec/support/entity_class_example.rb +2 -0
- data/spec/support/leadable_example.rb +2 -0
- data/spec/support/my_contact.rb +2 -0
- data/spec/support/my_entity.rb +2 -0
- data/spec/task_spec.rb +2 -0
- data/spec/webhook_spec.rb +61 -0
- metadata +48 -17
- data/.travis.yml +0 -9
data/spec/lead_spec.rb
CHANGED
data/spec/my_contact_spec.rb
CHANGED
data/spec/note_spec.rb
CHANGED
data/spec/property_spec.rb
CHANGED
data/spec/spec_helper.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
|
2
4
|
$LOAD_PATH.unshift(File.dirname(__FILE__))
|
3
5
|
|
@@ -10,9 +12,9 @@ require 'helpers/webmock_helpers'
|
|
10
12
|
|
11
13
|
# Cleanup Amorail env
|
12
14
|
ENV.delete_if { |k, _| k =~ /amorail/i }
|
13
|
-
ENV["AMORAIL_CONF"] = File.expand_path("
|
15
|
+
ENV["AMORAIL_CONF"] = File.expand_path("fixtures/amorail_test.yml", __dir__)
|
14
16
|
|
15
|
-
Dir[File.expand_path("
|
17
|
+
Dir[File.expand_path("support/**/*.rb", __dir__)].each { |f| require f }
|
16
18
|
|
17
19
|
RSpec.configure do |config|
|
18
20
|
config.mock_with :rspec
|
@@ -0,0 +1,56 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
describe Amorail::StoreAdapters::MemoryStoreAdapter do
|
6
|
+
let!(:expiration) { Time.now.to_i + 86_000 }
|
7
|
+
let(:store) { Amorail::StoreAdapters.build_by_name(:memory) }
|
8
|
+
|
9
|
+
describe '#initialize' do
|
10
|
+
it 'raises error on unknow option' do
|
11
|
+
expect { Amorail::StoreAdapters::MemoryStoreAdapter.new(something: 'something') }.to raise_error(ArgumentError)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
describe '#persist_access' do
|
16
|
+
subject { store.persist_access('secret', 'token', 'refresh_token', expiration) }
|
17
|
+
|
18
|
+
it 'save record to memory' do
|
19
|
+
expect { subject }.to change { store.fetch_access('secret') }.from(
|
20
|
+
{}
|
21
|
+
).to(
|
22
|
+
{ token: 'token', refresh_token: 'refresh_token', expiration: expiration }
|
23
|
+
)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
describe '#fetch_access' do
|
28
|
+
context 'when token not expired' do
|
29
|
+
it 'returns valid data' do
|
30
|
+
store.persist_access('secret', 'token', 'refresh_token', expiration)
|
31
|
+
expect(store.fetch_access('secret')).to eq({ token: 'token', refresh_token: 'refresh_token', expiration: expiration })
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
context 'when token is expired' do
|
36
|
+
it 'returns blank hash' do
|
37
|
+
store.persist_access('secret', 'token', 'refresh_token', Time.now.to_i - 10_000)
|
38
|
+
expect(store.fetch_access('secret')).to eq({})
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
describe '#update_access' do
|
44
|
+
let!(:upd_expiration) { Time.now.to_i + 92_000 }
|
45
|
+
subject { store.update_access('secret', 'upd_token', 'upd_refresh', upd_expiration) }
|
46
|
+
|
47
|
+
it 'refresh token data' do
|
48
|
+
store.persist_access('secret', 'token', 'refresh_token', expiration)
|
49
|
+
expect { subject }.to change { store.fetch_access('secret') }.from(
|
50
|
+
{ token: 'token', refresh_token: 'refresh_token', expiration: expiration }
|
51
|
+
).to(
|
52
|
+
{ token: 'upd_token', refresh_token: 'upd_refresh', expiration: upd_expiration }
|
53
|
+
)
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
@@ -0,0 +1,67 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
describe Amorail::StoreAdapters::RedisStoreAdapter do
|
6
|
+
before :each do
|
7
|
+
Amorail.config.reload
|
8
|
+
end
|
9
|
+
|
10
|
+
let(:store) { Amorail::StoreAdapters.build_by_name(:redis) }
|
11
|
+
|
12
|
+
describe '#initialize' do
|
13
|
+
it 'raises error on mixed redis options' do
|
14
|
+
expect { Amorail::StoreAdapters::RedisStoreAdapter.new(redis_url: 'redis://127.0.0.1:6379/0',
|
15
|
+
redis_port: '8082') }.to raise_error(ArgumentError)
|
16
|
+
end
|
17
|
+
|
18
|
+
it 'raises error on unknown options' do
|
19
|
+
expect { Amorail::StoreAdapters::RedisStoreAdapter.new(redis_url: 'redis://127.0.0.1:6379/0',
|
20
|
+
something: 'smth') }.to raise_error(ArgumentError)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
describe 'configuration' do
|
25
|
+
let(:adapter) { Amorail::StoreAdapters::RedisStoreAdapter.new }
|
26
|
+
|
27
|
+
it 'set default url' do
|
28
|
+
expect(adapter.storage.id).to eq('redis://127.0.0.1:6379/0')
|
29
|
+
end
|
30
|
+
|
31
|
+
it 'set url from env variable' do
|
32
|
+
ENV['REDIS_URL'] = 'redis://localhost:2020/'
|
33
|
+
adapter = Amorail::StoreAdapters::RedisStoreAdapter.new
|
34
|
+
expect(adapter.storage.id).to eq('redis://localhost:2020/0')
|
35
|
+
|
36
|
+
ENV.delete('REDIS_URL')
|
37
|
+
adapter = Amorail::StoreAdapters::RedisStoreAdapter.new
|
38
|
+
expect(adapter.storage.id).to eq('redis://127.0.0.1:6379/0')
|
39
|
+
end
|
40
|
+
|
41
|
+
it 'configuration via host post and db' do
|
42
|
+
adapter = Amorail::StoreAdapters::RedisStoreAdapter.new(
|
43
|
+
redis_host: '127.0.0.2',
|
44
|
+
redis_port: '6372',
|
45
|
+
redis_db_name: '2'
|
46
|
+
)
|
47
|
+
expect(adapter.storage.id).to eq('redis://127.0.0.2:6372/2')
|
48
|
+
end
|
49
|
+
|
50
|
+
it 'configuration via host port and db in module' do
|
51
|
+
Amorail.config.redis_host = '127.0.0.2'
|
52
|
+
Amorail.config.redis_port = '6372'
|
53
|
+
Amorail.config.redis_db_name = '2'
|
54
|
+
expect(adapter.storage.id).to eq('redis://127.0.0.2:6372/2')
|
55
|
+
end
|
56
|
+
|
57
|
+
it 'configuration via redis url' do
|
58
|
+
adapter = Amorail::StoreAdapters::RedisStoreAdapter.new(redis_url: 'redis://127.0.0.2:6322')
|
59
|
+
expect(adapter.storage.id).to eq('redis://127.0.0.2:6322/0')
|
60
|
+
end
|
61
|
+
|
62
|
+
it 'configuration via redis url in module' do
|
63
|
+
Amorail.config.redis_url = 'redis://127.0.0.2:6322'
|
64
|
+
expect(adapter.storage.id).to eq('redis://127.0.0.2:6322/0')
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
data/spec/support/my_contact.rb
CHANGED
data/spec/support/my_entity.rb
CHANGED
data/spec/task_spec.rb
CHANGED
@@ -0,0 +1,61 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
describe Amorail::Webhook do
|
6
|
+
before { mock_api }
|
7
|
+
|
8
|
+
describe '.list' do
|
9
|
+
context 'there are some webhooks' do
|
10
|
+
before { webhooks_list_stub(Amorail.config.api_endpoint) }
|
11
|
+
|
12
|
+
it 'loads webhooks' do
|
13
|
+
res = described_class.list
|
14
|
+
expect(res.size).to eq 2
|
15
|
+
expect(res.first.id).to eq '1'
|
16
|
+
expect(res.first.url).to eq 'http://example.org'
|
17
|
+
expect(res.first.events).to eq ['add_contact']
|
18
|
+
expect(res.first.disabled).to eq false
|
19
|
+
expect(res.last.id).to eq '2'
|
20
|
+
expect(res.last.url).to eq 'http://example.com'
|
21
|
+
expect(res.last.events).to eq ['add_contact', 'add_company']
|
22
|
+
expect(res.last.disabled).to eq true
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
context 'there are not any webhooks' do
|
27
|
+
before { webhooks_list_stub(Amorail.config.api_endpoint, empty: true) }
|
28
|
+
|
29
|
+
it 'returns an empty array' do
|
30
|
+
res = described_class.list
|
31
|
+
expect(res).to eq []
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
describe '.subscribe' do
|
37
|
+
it 'creates webhooks' do
|
38
|
+
webhooks = [
|
39
|
+
{ url: 'http://example.org', events: ['add_contact'] },
|
40
|
+
{ url: 'http://example.com', events: ['add_contact', 'add_company'] }
|
41
|
+
]
|
42
|
+
stub = webhooks_subscribe_stub(Amorail.config.api_endpoint, webhooks)
|
43
|
+
res = described_class.subscribe(webhooks)
|
44
|
+
expect(stub).to have_been_requested
|
45
|
+
expect(res.first.url).to eq 'http://example.org'
|
46
|
+
expect(res.last.url).to eq 'http://example.com'
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
describe '.unsubscribe' do
|
51
|
+
it 'removes webhooks' do
|
52
|
+
webhooks = [
|
53
|
+
{ url: 'http://example.org', events: ['add_contact'] },
|
54
|
+
{ url: 'http://example.com', events: ['add_contact', 'add_company'] }
|
55
|
+
]
|
56
|
+
stub = webhooks_unsubscribe_stub(Amorail.config.api_endpoint, webhooks)
|
57
|
+
described_class.unsubscribe(webhooks)
|
58
|
+
expect(stub).to have_been_requested
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
metadata
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: amorail
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.7.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- alekseenkoss
|
8
8
|
- palkan
|
9
|
-
autorequire:
|
9
|
+
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2021-07-16 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: bundler
|
@@ -113,22 +113,16 @@ dependencies:
|
|
113
113
|
name: anyway_config
|
114
114
|
requirement: !ruby/object:Gem::Requirement
|
115
115
|
requirements:
|
116
|
-
- - "~>"
|
117
|
-
- !ruby/object:Gem::Version
|
118
|
-
version: '0'
|
119
116
|
- - ">="
|
120
117
|
- !ruby/object:Gem::Version
|
121
|
-
version: '0
|
118
|
+
version: '1.0'
|
122
119
|
type: :runtime
|
123
120
|
prerelease: false
|
124
121
|
version_requirements: !ruby/object:Gem::Requirement
|
125
122
|
requirements:
|
126
|
-
- - "~>"
|
127
|
-
- !ruby/object:Gem::Version
|
128
|
-
version: '0'
|
129
123
|
- - ">="
|
130
124
|
- !ruby/object:Gem::Version
|
131
|
-
version: '0
|
125
|
+
version: '1.0'
|
132
126
|
- !ruby/object:Gem::Dependency
|
133
127
|
name: faraday
|
134
128
|
requirement: !ruby/object:Gem::Requirement
|
@@ -185,6 +179,20 @@ dependencies:
|
|
185
179
|
- - ">="
|
186
180
|
- !ruby/object:Gem::Version
|
187
181
|
version: '0'
|
182
|
+
- !ruby/object:Gem::Dependency
|
183
|
+
name: redis
|
184
|
+
requirement: !ruby/object:Gem::Requirement
|
185
|
+
requirements:
|
186
|
+
- - ">="
|
187
|
+
- !ruby/object:Gem::Version
|
188
|
+
version: '0'
|
189
|
+
type: :runtime
|
190
|
+
prerelease: false
|
191
|
+
version_requirements: !ruby/object:Gem::Requirement
|
192
|
+
requirements:
|
193
|
+
- - ">="
|
194
|
+
- !ruby/object:Gem::Version
|
195
|
+
version: '0'
|
188
196
|
description: Ruby API client for AmoCRM. You can integrate your system with it.
|
189
197
|
email:
|
190
198
|
- alekseenkoss@gmail.com
|
@@ -193,15 +201,18 @@ executables: []
|
|
193
201
|
extensions: []
|
194
202
|
extra_rdoc_files: []
|
195
203
|
files:
|
204
|
+
- ".github/workflows/rspec.yml"
|
196
205
|
- ".gitignore"
|
197
206
|
- ".rubocop.yml"
|
198
|
-
-
|
207
|
+
- CHANGELOG.md
|
199
208
|
- Gemfile
|
200
209
|
- LICENSE.txt
|
201
210
|
- README.md
|
211
|
+
- RELEASING.md
|
202
212
|
- Rakefile
|
203
213
|
- amorail.gemspec
|
204
214
|
- lib/amorail.rb
|
215
|
+
- lib/amorail/access_token.rb
|
205
216
|
- lib/amorail/client.rb
|
206
217
|
- lib/amorail/config.rb
|
207
218
|
- lib/amorail/entities/company.rb
|
@@ -212,6 +223,7 @@ files:
|
|
212
223
|
- lib/amorail/entities/leadable.rb
|
213
224
|
- lib/amorail/entities/note.rb
|
214
225
|
- lib/amorail/entities/task.rb
|
226
|
+
- lib/amorail/entities/webhook.rb
|
215
227
|
- lib/amorail/entity.rb
|
216
228
|
- lib/amorail/entity/finders.rb
|
217
229
|
- lib/amorail/entity/params.rb
|
@@ -219,8 +231,13 @@ files:
|
|
219
231
|
- lib/amorail/exceptions.rb
|
220
232
|
- lib/amorail/property.rb
|
221
233
|
- lib/amorail/railtie.rb
|
234
|
+
- lib/amorail/store_adapters.rb
|
235
|
+
- lib/amorail/store_adapters/abstract_store_adapter.rb
|
236
|
+
- lib/amorail/store_adapters/memory_store_adapter.rb
|
237
|
+
- lib/amorail/store_adapters/redis_store_adapter.rb
|
222
238
|
- lib/amorail/version.rb
|
223
239
|
- lib/tasks/amorail.rake
|
240
|
+
- spec/access_token_spec.rb
|
224
241
|
- spec/client_spec.rb
|
225
242
|
- spec/company_spec.rb
|
226
243
|
- spec/contact_link_spec.rb
|
@@ -229,6 +246,7 @@ files:
|
|
229
246
|
- spec/fixtures/accounts/response_1.json
|
230
247
|
- spec/fixtures/accounts/response_2.json
|
231
248
|
- spec/fixtures/amorail_test.yml
|
249
|
+
- spec/fixtures/authorize.json
|
232
250
|
- spec/fixtures/contacts/create.json
|
233
251
|
- spec/fixtures/contacts/find_many.json
|
234
252
|
- spec/fixtures/contacts/find_one.json
|
@@ -240,23 +258,29 @@ files:
|
|
240
258
|
- spec/fixtures/leads/links.json
|
241
259
|
- spec/fixtures/leads/update.json
|
242
260
|
- spec/fixtures/leads/update_errors.json
|
261
|
+
- spec/fixtures/webhooks/list.json
|
262
|
+
- spec/fixtures/webhooks/subscribe.json
|
263
|
+
- spec/fixtures/webhooks/unsubscribe.json
|
243
264
|
- spec/helpers/webmock_helpers.rb
|
244
265
|
- spec/lead_spec.rb
|
245
266
|
- spec/my_contact_spec.rb
|
246
267
|
- spec/note_spec.rb
|
247
268
|
- spec/property_spec.rb
|
248
269
|
- spec/spec_helper.rb
|
270
|
+
- spec/store_adapters/memory_store_adapter_spec.rb
|
271
|
+
- spec/store_adapters/redis_store_adapter_spec.rb
|
249
272
|
- spec/support/elementable_example.rb
|
250
273
|
- spec/support/entity_class_example.rb
|
251
274
|
- spec/support/leadable_example.rb
|
252
275
|
- spec/support/my_contact.rb
|
253
276
|
- spec/support/my_entity.rb
|
254
277
|
- spec/task_spec.rb
|
278
|
+
- spec/webhook_spec.rb
|
255
279
|
homepage: ''
|
256
280
|
licenses:
|
257
281
|
- MIT
|
258
282
|
metadata: {}
|
259
|
-
post_install_message:
|
283
|
+
post_install_message:
|
260
284
|
rdoc_options: []
|
261
285
|
require_paths:
|
262
286
|
- lib
|
@@ -264,19 +288,19 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
264
288
|
requirements:
|
265
289
|
- - ">="
|
266
290
|
- !ruby/object:Gem::Version
|
267
|
-
version:
|
291
|
+
version: 2.5.0
|
268
292
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
269
293
|
requirements:
|
270
294
|
- - ">="
|
271
295
|
- !ruby/object:Gem::Version
|
272
296
|
version: '0'
|
273
297
|
requirements: []
|
274
|
-
|
275
|
-
|
276
|
-
signing_key:
|
298
|
+
rubygems_version: 3.0.8
|
299
|
+
signing_key:
|
277
300
|
specification_version: 4
|
278
301
|
summary: Ruby API client for AmoCRM
|
279
302
|
test_files:
|
303
|
+
- spec/access_token_spec.rb
|
280
304
|
- spec/client_spec.rb
|
281
305
|
- spec/company_spec.rb
|
282
306
|
- spec/contact_link_spec.rb
|
@@ -285,6 +309,7 @@ test_files:
|
|
285
309
|
- spec/fixtures/accounts/response_1.json
|
286
310
|
- spec/fixtures/accounts/response_2.json
|
287
311
|
- spec/fixtures/amorail_test.yml
|
312
|
+
- spec/fixtures/authorize.json
|
288
313
|
- spec/fixtures/contacts/create.json
|
289
314
|
- spec/fixtures/contacts/find_many.json
|
290
315
|
- spec/fixtures/contacts/find_one.json
|
@@ -296,15 +321,21 @@ test_files:
|
|
296
321
|
- spec/fixtures/leads/links.json
|
297
322
|
- spec/fixtures/leads/update.json
|
298
323
|
- spec/fixtures/leads/update_errors.json
|
324
|
+
- spec/fixtures/webhooks/list.json
|
325
|
+
- spec/fixtures/webhooks/subscribe.json
|
326
|
+
- spec/fixtures/webhooks/unsubscribe.json
|
299
327
|
- spec/helpers/webmock_helpers.rb
|
300
328
|
- spec/lead_spec.rb
|
301
329
|
- spec/my_contact_spec.rb
|
302
330
|
- spec/note_spec.rb
|
303
331
|
- spec/property_spec.rb
|
304
332
|
- spec/spec_helper.rb
|
333
|
+
- spec/store_adapters/memory_store_adapter_spec.rb
|
334
|
+
- spec/store_adapters/redis_store_adapter_spec.rb
|
305
335
|
- spec/support/elementable_example.rb
|
306
336
|
- spec/support/entity_class_example.rb
|
307
337
|
- spec/support/leadable_example.rb
|
308
338
|
- spec/support/my_contact.rb
|
309
339
|
- spec/support/my_entity.rb
|
310
340
|
- spec/task_spec.rb
|
341
|
+
- spec/webhook_spec.rb
|