amorail 0.7.0 → 0.7.2

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 3b18605e272eb7a0c72af69e2d017f54753ff715d474d79cc9071791a036cd6d
4
- data.tar.gz: d77fee259b877786fd18a044aaa52aff432be6936834095b5d8ab2d857d0df11
3
+ metadata.gz: ae6f74bb08bbf43aa99b6275ba276971bf8e9933bfdc89c363cd6e03d964c0f5
4
+ data.tar.gz: 33aa412d6f02256a6e98f0e7e138eca8ac88603633a3940858c0a2f865c6d689
5
5
  SHA512:
6
- metadata.gz: ab1e1221b40f406909ed76f4b444b7f7f7805d8f04c1e386030563471172175149ff718438bb4ee97d9bee28f2a3d9b9a78733828f8ab2d7b62edca6f631f56e
7
- data.tar.gz: 4034fbcc9fea9004e159e62ac910ce9bfbe301ea76013f7d62d05a26cae8df2084c2836a4e4c65707cc4451fc8380fc163c5afe580068bdb8c4a40f79f632ff3
6
+ metadata.gz: e0dc543509ca614983d4bb92eae450d7202e18a146a89ac5a52f0be77436d5c878b41b3d922760490e74a690ae1b1603a015b76821b7cecd7e0c3f3111e690d2
7
+ data.tar.gz: 7a7efb60d5746c933d0b043fe0465427854b4a1ece3947c1f55062e11fd50ac8c2ef7d4faa34759807ba6e0adecb852d2af9b52cd00cf0d7faa3a5561c924cf8
@@ -5,19 +5,21 @@ on:
5
5
  branches:
6
6
  - master
7
7
  pull_request:
8
-
9
8
  jobs:
10
9
  build:
11
-
12
10
  runs-on: ubuntu-latest
11
+ strategy:
12
+ matrix:
13
+ # TODO: Adds 3.0 and 3.1 after updating
14
+ # ruby: [2.5, 2.7, 3.0, 3.1]
15
+ ruby: [2.5, 2.7]
13
16
 
14
17
  steps:
15
- - uses: actions/checkout@v2
16
- - name: Set up Ruby 2.5
17
- uses: ruby/setup-ruby@v1
18
- with:
19
- ruby-version: 2.5
20
- bundler-cache: true
21
- bundler: 1.13.6
22
- - name: Build and test
23
- run: bundle exec rspec
18
+ - uses: actions/checkout@v2
19
+ - name: Set up Ruby
20
+ uses: ruby/setup-ruby@v1
21
+ with:
22
+ ruby-version: ${{ matrix.ruby }}
23
+ bundler-cache: true # runs 'bundle install' and caches installed gems automatically
24
+ - name: Run tests
25
+ run: bundle exec rspec
data/.rubocop.yml CHANGED
@@ -23,10 +23,6 @@ Style/BlockDelimiters:
23
23
  Exclude:
24
24
  - 'spec/**/*.rb'
25
25
 
26
- Metrics/MethodLength:
27
- Exclude:
28
- - 'spec/**/*.rb'
29
-
30
26
  Rails/Date:
31
27
  Enabled: false
32
28
 
data/CHANGELOG.md CHANGED
@@ -2,6 +2,20 @@
2
2
 
3
3
  ## master (unreleased)
4
4
 
5
+ ## 0.7.2 (2024-01-08)
6
+
7
+ ### Fixes
8
+
9
+ - Fixed refreshing tokin with redis storage ([@VladimirMikhailov][]) [#56](https://github.com/teachbase/amorail/pull/56)
10
+
11
+ ## 0.7.1 (2021-09-25)
12
+
13
+ ### Features
14
+
15
+ - Adds multiple option to property ([@lHydra][])
16
+
17
+ See spec/support/my_contact.rb and spec/my_contact_spec.rb
18
+
5
19
  ## 0.7.0 (2021-07-16)
6
20
 
7
21
  ### Features
@@ -17,3 +31,4 @@
17
31
  [@palkan]: https://github.com/palkan
18
32
  [@AlexanderShvaykin]: https://github.com/AlexanderShvaykin
19
33
  [@lHydra]: https://github.com/lHydra
34
+ [@VladimirMikhailov]: https://github.com/VladimirMikhailov
data/amorail.gemspec CHANGED
@@ -19,12 +19,12 @@ Gem::Specification.new do |spec|
19
19
  spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
20
20
  spec.require_paths = ["lib"]
21
21
 
22
- spec.add_development_dependency "bundler", "~> 1.7"
22
+ spec.add_development_dependency "bundler", "~> 2.3"
23
23
  spec.add_development_dependency "rake", "~> 10.0"
24
24
  spec.add_development_dependency "rspec", "~> 3.4"
25
25
  spec.add_development_dependency "webmock"
26
26
  spec.add_development_dependency "pry"
27
- spec.add_development_dependency "shoulda-matchers", "~> 2.0"
27
+ spec.add_development_dependency "shoulda-matchers"
28
28
  spec.add_development_dependency "rubocop", "~> 0.49"
29
29
  spec.add_dependency "anyway_config", ">= 1.0"
30
30
  spec.add_dependency "faraday"
data/dip.yml ADDED
@@ -0,0 +1,16 @@
1
+ version: "7.6"
2
+
3
+ compose:
4
+ files:
5
+ - docker-compose.yml
6
+
7
+ interaction:
8
+ sh:
9
+ description: Open a Bash shell within a Rails container (with dependencies up)
10
+ service: ruby
11
+ command: /bin/bash
12
+
13
+ rspec:
14
+ description: Run specs
15
+ service: ruby
16
+ command: rspec
@@ -0,0 +1,14 @@
1
+ version: "3.8"
2
+
3
+ services:
4
+ ruby:
5
+ image: ruby:2.5
6
+ stdin_open: true
7
+ tty: true
8
+ volumes:
9
+ - /teachbase/.git
10
+ - .:/app:cached
11
+ - bundle:/usr/local/bundle
12
+ working_dir: /app
13
+ volumes:
14
+ bundle:
@@ -83,8 +83,8 @@ module Amorail
83
83
  end
84
84
 
85
85
  def safe_request(method, url, params = {})
86
- authorize if access_token.blank?
87
86
  refresh_token! if access.expired?
87
+ authorize if access_token.blank?
88
88
  public_send(method, url, params)
89
89
  end
90
90
 
@@ -23,8 +23,17 @@ module Amorail # :nodoc: all
23
23
  custom_fields = []
24
24
  self.class.properties.each do |k, v|
25
25
  prop_id = props.send(k).id
26
- prop_val = { value: send(v.fetch(:method_name, k)) }.merge(v)
27
- custom_fields << { id: prop_id, values: [prop_val] }
26
+ prop_values = send(v.fetch(:method_name, k))
27
+
28
+ if prop_values.is_a?(Array)
29
+ prop_val = prop_values.map do |value|
30
+ { value: value }.merge(v)
31
+ end
32
+ else
33
+ prop_val = [{ value: prop_values }.merge(v)]
34
+ end
35
+
36
+ custom_fields << { id: prop_id, values: prop_val }
28
37
  end
29
38
 
30
39
  custom_fields
@@ -1,6 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'active_model'
4
+ require 'active_support/core_ext/array'
4
5
 
5
6
  module Amorail
6
7
  # Core class for all Amo entities (company, contact, etc)
@@ -34,7 +35,12 @@ module Amorail
34
35
 
35
36
  def amo_property(name, options = {})
36
37
  properties[name] = options
37
- attr_accessor(options.fetch(:method_name, name))
38
+ var_name = options.fetch(:method_name, name)
39
+ define_method "#{var_name}=" do |value|
40
+ var_value = options[:multiple] ? Array.wrap(value) : Array.wrap(value).first
41
+ instance_variable_set("@#{var_name}", var_value)
42
+ end
43
+ attr_reader(var_name)
38
44
  end
39
45
 
40
46
  def attributes
@@ -93,7 +99,7 @@ module Amorail
93
99
  next if fname.nil?
94
100
 
95
101
  fname = "#{fname.downcase}="
96
- fval = f.fetch('values').first.fetch('value')
102
+ fval = f.fetch('values').map { |v| v['value'] }
97
103
  send(fname, fval) if respond_to?(fname)
98
104
  end
99
105
  end
@@ -38,7 +38,7 @@ module Amorail
38
38
  if !access_expired?(key)
39
39
  storage[key]
40
40
  else
41
- {}
41
+ { refresh_token: storage[key][:refresh_token] }
42
42
  end
43
43
  end
44
44
 
@@ -19,7 +19,7 @@ module Amorail
19
19
  def fetch_access(secret)
20
20
  token = storage.get(access_key(secret))
21
21
  refresh_token = storage.get(refresh_key(secret))
22
- token.nil? ? {} : { token: token, refresh_token: refresh_token }
22
+ { token: token, refresh_token: refresh_token }.compact
23
23
  end
24
24
 
25
25
  def persist_access(secret, token, refresh_token, expiration)
@@ -61,7 +61,7 @@ module Amorail
61
61
  end
62
62
 
63
63
  def build_redis_url(redis_host: nil, redis_port: nil, redis_db_name: nil)
64
- redis_db_name ||= Amorail.config.redis_db_name
64
+ redis_db_name ||= Amorail.config.redis_db_name.to_s
65
65
  return URI.join(Amorail.config.redis_url, redis_db_name).to_s if Amorail.config.redis_url
66
66
 
67
67
  redis_host ||= Amorail.config.redis_host
@@ -2,5 +2,5 @@
2
2
 
3
3
  # Amorail version
4
4
  module Amorail
5
- VERSION = '0.7.0'
5
+ VERSION = '0.7.2'
6
6
  end
data/lib/amorail.rb CHANGED
@@ -38,7 +38,7 @@ module Amorail
38
38
  end
39
39
 
40
40
  def with_client(client)
41
- client = Client.new(client) unless client.is_a?(Client)
41
+ client = Client.new(**client) unless client.is_a?(Client)
42
42
  ClientRegistry.client = client
43
43
  yield
44
44
  ensure
@@ -61,9 +61,15 @@ module Amorail
61
61
  end
62
62
 
63
63
  class ClientRegistry # :nodoc:
64
- extend ActiveSupport::PerThreadRegistry
64
+ class << self
65
+ def client=(value)
66
+ Thread.current["attr_#{name}_client"] = value
67
+ end
65
68
 
66
- attr_accessor :client
69
+ def client
70
+ Thread.current["attr_#{name}_client"]
71
+ end
72
+ end
67
73
  end
68
74
 
69
75
  require 'amorail/railtie' if defined?(Rails)
data/spec/client_spec.rb CHANGED
@@ -132,4 +132,39 @@ describe Amorail::Client do
132
132
  expect(results[2]).to eq 'some_id_3'
133
133
  end
134
134
  end
135
+
136
+ describe '#safe_request' do
137
+ subject(:safe_request) { client.safe_request(:get, '/private/api/v2/json/accounts/current') }
138
+
139
+ let(:response) { instance_double('Faraday::Response', body: {}, status: 200) }
140
+ let(:client) { described_class.new }
141
+ let(:access_token) { 'eyJ0eXAiOiJKf2QihCJhbGciOiJSUzI1NiIsImp0aSI6IjMxMT' }
142
+
143
+ # We need to refresh the token store before the initial safe_request
144
+ # to test that it performs authorization
145
+ before { Amorail.token_store = :memory }
146
+
147
+ it 'authorizes the client if there is no access token' do
148
+ expect { safe_request }.to change { client.access_token }.from(nil).to(start_with(access_token))
149
+ end
150
+
151
+ context 'when access token is expired' do
152
+ let(:renewed_access_token) { '50d084c7efbd911f0a9d03bb387f3ad4dc092be253' }
153
+
154
+ before do
155
+ Amorail.token_store.persist_access(
156
+ Amorail.config.client_secret,
157
+ 'old_access_token',
158
+ 'refresh_token',
159
+ Time.now.to_i - 10
160
+ )
161
+ end
162
+
163
+ it 'refreshes authorization token' do
164
+ expect { safe_request }.to change { client.access_token }.from(nil).to(
165
+ start_with(renewed_access_token)
166
+ )
167
+ end
168
+ end
169
+ end
135
170
  end
data/spec/contact_spec.rb CHANGED
@@ -168,10 +168,12 @@ describe Amorail::Contact do
168
168
  it "update params" do
169
169
  contact.save!
170
170
  contact.name = "foo"
171
+ contact.phone = "123456789"
171
172
 
172
173
  contact_update_stub(Amorail.config.api_endpoint)
173
174
  expect(contact.save!).to be_truthy
174
175
  expect(contact.name).to eq "foo"
176
+ expect(contact.phone).to eq "123456789"
175
177
  end
176
178
 
177
179
  it "raise error if id is blank?" do
@@ -0,0 +1,6 @@
1
+ {
2
+ "token_type": "Bearer",
3
+ "expires_in": 86400,
4
+ "access_token": "50d084c7efbd911f0a9d03bb387f3ad4dc092be253fc5af0564c38454f473c075ecb8b3dc9e65a257196cc0c44a07acea7720140739a86015a701403",
5
+ "refresh_token": "c17d6c45e63efda9e20edb9ab08eb04cd89cf83acd203a8a4796160886e334561c54e8193f25a27004c732fe784b2bf9f1b4357d3c4a284e30164764"
6
+ }
@@ -27,6 +27,10 @@
27
27
  {
28
28
  "value": "1111 111 111",
29
29
  "enum": "3392086"
30
+ },
31
+ {
32
+ "value": "2222 222 222",
33
+ "enum": "3392086"
30
34
  }
31
35
  ]
32
36
  },
@@ -54,7 +54,7 @@ module AmoWebMock
54
54
  .to_return(
55
55
  status: 200,
56
56
  body: File.read('./spec/fixtures/authorize.json'),
57
- headers: {}
57
+ headers: { 'Content-Type' => 'application/json' }
58
58
  )
59
59
  end
60
60
 
@@ -65,8 +65,8 @@ module AmoWebMock
65
65
  )
66
66
  .to_return(
67
67
  status: 200,
68
- body: File.read('./spec/fixtures/authorize.json'),
69
- headers: {}
68
+ body: File.read('./spec/fixtures/authorize_refresh_token.json'),
69
+ headers: { 'Content-Type' => 'application/json' }
70
70
  )
71
71
  end
72
72
 
@@ -14,7 +14,7 @@ describe MyContact do
14
14
  end
15
15
 
16
16
  describe "#params" do
17
- let(:company) do
17
+ let(:contact) do
18
18
  described_class.new(
19
19
  name: 'Test inc',
20
20
  phone: '12345678',
@@ -23,7 +23,7 @@ describe MyContact do
23
23
  )
24
24
  end
25
25
 
26
- subject { company.params }
26
+ subject { contact.params }
27
27
 
28
28
  specify { is_expected.to include(:last_modified) }
29
29
  specify { is_expected.to include(name: 'Test inc') }
@@ -43,6 +43,7 @@ describe MyContact do
43
43
  expect(obj.id).to eq 11
44
44
  expect(obj.company_name).to eq "Foo Inc."
45
45
  expect(obj.email).to eq "foo@tb.com"
46
+ expect(obj.phone).to eq ["1111 111 111", "2222 222 222"]
46
47
  expect(obj.teachbase_id).to eq 1123
47
48
  expect(obj.params[:id]).to eq 11
48
49
  end
data/spec/spec_helper.rb CHANGED
@@ -19,4 +19,5 @@ Dir[File.expand_path("support/**/*.rb", __dir__)].each { |f| require f }
19
19
  RSpec.configure do |config|
20
20
  config.mock_with :rspec
21
21
  include AmoWebMock
22
+ config.include(Shoulda::Matchers::ActiveModel)
22
23
  end
@@ -35,7 +35,7 @@ describe Amorail::StoreAdapters::MemoryStoreAdapter do
35
35
  context 'when token is expired' do
36
36
  it 'returns blank hash' do
37
37
  store.persist_access('secret', 'token', 'refresh_token', Time.now.to_i - 10_000)
38
- expect(store.fetch_access('secret')).to eq({})
38
+ expect(store.fetch_access('secret')).to eq(refresh_token: 'refresh_token')
39
39
  end
40
40
  end
41
41
  end
@@ -2,4 +2,5 @@
2
2
 
3
3
  class MyContact < Amorail::Contact # :nodoc:
4
4
  amo_property :teachbase_id
5
+ amo_property :phone, enum: 'MOB', multiple: true
5
6
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: amorail
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.7.0
4
+ version: 0.7.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - alekseenkoss
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2021-07-16 00:00:00.000000000 Z
12
+ date: 2024-01-08 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: bundler
@@ -17,14 +17,14 @@ dependencies:
17
17
  requirements:
18
18
  - - "~>"
19
19
  - !ruby/object:Gem::Version
20
- version: '1.7'
20
+ version: '2.3'
21
21
  type: :development
22
22
  prerelease: false
23
23
  version_requirements: !ruby/object:Gem::Requirement
24
24
  requirements:
25
25
  - - "~>"
26
26
  - !ruby/object:Gem::Version
27
- version: '1.7'
27
+ version: '2.3'
28
28
  - !ruby/object:Gem::Dependency
29
29
  name: rake
30
30
  requirement: !ruby/object:Gem::Requirement
@@ -85,16 +85,16 @@ dependencies:
85
85
  name: shoulda-matchers
86
86
  requirement: !ruby/object:Gem::Requirement
87
87
  requirements:
88
- - - "~>"
88
+ - - ">="
89
89
  - !ruby/object:Gem::Version
90
- version: '2.0'
90
+ version: '0'
91
91
  type: :development
92
92
  prerelease: false
93
93
  version_requirements: !ruby/object:Gem::Requirement
94
94
  requirements:
95
- - - "~>"
95
+ - - ">="
96
96
  - !ruby/object:Gem::Version
97
- version: '2.0'
97
+ version: '0'
98
98
  - !ruby/object:Gem::Dependency
99
99
  name: rubocop
100
100
  requirement: !ruby/object:Gem::Requirement
@@ -211,6 +211,8 @@ files:
211
211
  - RELEASING.md
212
212
  - Rakefile
213
213
  - amorail.gemspec
214
+ - dip.yml
215
+ - docker-compose.yaml
214
216
  - lib/amorail.rb
215
217
  - lib/amorail/access_token.rb
216
218
  - lib/amorail/client.rb
@@ -247,6 +249,7 @@ files:
247
249
  - spec/fixtures/accounts/response_2.json
248
250
  - spec/fixtures/amorail_test.yml
249
251
  - spec/fixtures/authorize.json
252
+ - spec/fixtures/authorize_refresh_token.json
250
253
  - spec/fixtures/contacts/create.json
251
254
  - spec/fixtures/contacts/find_many.json
252
255
  - spec/fixtures/contacts/find_one.json
@@ -295,7 +298,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
295
298
  - !ruby/object:Gem::Version
296
299
  version: '0'
297
300
  requirements: []
298
- rubygems_version: 3.0.8
301
+ rubygems_version: 3.3.7
299
302
  signing_key:
300
303
  specification_version: 4
301
304
  summary: Ruby API client for AmoCRM
@@ -310,6 +313,7 @@ test_files:
310
313
  - spec/fixtures/accounts/response_2.json
311
314
  - spec/fixtures/amorail_test.yml
312
315
  - spec/fixtures/authorize.json
316
+ - spec/fixtures/authorize_refresh_token.json
313
317
  - spec/fixtures/contacts/create.json
314
318
  - spec/fixtures/contacts/find_many.json
315
319
  - spec/fixtures/contacts/find_one.json