amorail 0.7.0 → 0.7.2

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