amorail 0.3.4 → 0.3.5
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 +4 -4
- data/.rubocop.yml +16 -1
- data/README.md +7 -1
- data/Rakefile +7 -3
- data/amorail.gemspec +3 -2
- data/lib/amorail/entities/elementable.rb +37 -0
- data/lib/amorail/entities/note.rb +17 -0
- data/lib/amorail/entities/task.rb +9 -23
- data/lib/amorail/entity.rb +3 -1
- data/lib/amorail/entity/finders.rb +10 -10
- data/lib/amorail/property.rb +4 -0
- data/lib/amorail/railtie.rb +1 -0
- data/lib/amorail/version.rb +1 -1
- data/spec/contact_spec.rb +15 -0
- data/spec/helpers/webmock_helpers.rb +20 -0
- data/spec/note_spec.rb +26 -0
- data/spec/support/elementable_example.rb +52 -0
- data/spec/task_spec.rb +6 -28
- metadata +22 -3
- data/.hound.yml +0 -12
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 64a5f20666f547ec054a884b6a11907c10ba6d33
|
4
|
+
data.tar.gz: e7e11f93b5408ffea0f80f15f4e70f4ac03c5ebd
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e3f035e93ac4be0bb929e0ac7f0a0d0bf28bbf43df6d648720554daa5ebffa5a9b7aad22a2ab250629e67c699380743c96dcb207d5bc8300305bec64f8c82c80
|
7
|
+
data.tar.gz: 1f2ece52b8c8755d38d9c05eb74cef43e515daac3cd7223c8fdeb6b9c6fe9f79962972057b7af07fb714f4e86a0f55478ee4e0ce30a48874cb72a2bb7e35a9d8
|
data/.rubocop.yml
CHANGED
@@ -6,7 +6,9 @@ AllCops:
|
|
6
6
|
- 'spec/**/*.rb'
|
7
7
|
Exclude:
|
8
8
|
- 'bin/**/*'
|
9
|
-
|
9
|
+
- Rakefile
|
10
|
+
- Gemfile
|
11
|
+
- '*.gemspec'
|
10
12
|
DisplayCopNames: true
|
11
13
|
StyleGuideCopsOnly: false
|
12
14
|
|
@@ -39,5 +41,18 @@ Metrics/LineLength:
|
|
39
41
|
Exclude:
|
40
42
|
- 'spec/**/*.rb'
|
41
43
|
|
44
|
+
Metrics/BlockLength:
|
45
|
+
Exclude:
|
46
|
+
- 'spec/**/*.rb'
|
47
|
+
|
42
48
|
Style/WordArray:
|
43
49
|
Enabled: false
|
50
|
+
|
51
|
+
Style/SymbolArray:
|
52
|
+
Enabled: false
|
53
|
+
|
54
|
+
Style/SignalException:
|
55
|
+
Enabled: false
|
56
|
+
|
57
|
+
Layout/MultilineMethodCallBraceLayout:
|
58
|
+
Enabled: false
|
data/README.md
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
[](https://travis-ci.org/teachbase/amorail)
|
1
|
+
[](https://rubygems.org/gems/amorail) [](https://travis-ci.org/teachbase/amorail)
|
2
2
|
|
3
3
|
# Amorail
|
4
4
|
|
@@ -128,6 +128,12 @@ Or using query:
|
|
128
128
|
Amorail::Company.find_by_query("vip")
|
129
129
|
```
|
130
130
|
|
131
|
+
Or using arbitrary params:
|
132
|
+
|
133
|
+
```ruby
|
134
|
+
Amorail::Company.where(query: "test", limit_rows: 10)
|
135
|
+
```
|
136
|
+
|
131
137
|
Also you can update objects, e.g:
|
132
138
|
|
133
139
|
```ruby
|
data/Rakefile
CHANGED
@@ -1,11 +1,15 @@
|
|
1
1
|
require "bundler/gem_tasks"
|
2
2
|
require 'rspec/core/rake_task'
|
3
|
-
|
3
|
+
require "rubocop/rake_task"
|
4
4
|
|
5
|
-
|
5
|
+
Dir.glob('lib/tasks/*.rake').each { |r| import r }
|
6
6
|
|
7
|
-
|
7
|
+
RSpec::Core::RakeTask.new(:spec)
|
8
8
|
|
9
9
|
task :console do
|
10
10
|
sh 'pry -r ./lib/amorail.rb'
|
11
11
|
end
|
12
|
+
|
13
|
+
RuboCop::RakeTask.new
|
14
|
+
|
15
|
+
task default: [:rubocop, :spec]
|
data/amorail.gemspec
CHANGED
@@ -22,8 +22,9 @@ Gem::Specification.new do |spec|
|
|
22
22
|
spec.add_development_dependency "rake", "~> 10.0"
|
23
23
|
spec.add_development_dependency "rspec", "~> 3.4"
|
24
24
|
spec.add_development_dependency "webmock"
|
25
|
-
spec.add_development_dependency
|
26
|
-
spec.add_development_dependency
|
25
|
+
spec.add_development_dependency "pry"
|
26
|
+
spec.add_development_dependency "shoulda-matchers", "~> 2.0"
|
27
|
+
spec.add_development_dependency "rubocop", "~> 0.49"
|
27
28
|
spec.add_dependency "anyway_config", "~> 0", ">= 0.3"
|
28
29
|
spec.add_dependency "faraday"
|
29
30
|
spec.add_dependency "faraday_middleware"
|
@@ -0,0 +1,37 @@
|
|
1
|
+
module Amorail
|
2
|
+
# Provides common functionallity for entities
|
3
|
+
# that can be attached to another objects.
|
4
|
+
module Elementable
|
5
|
+
extend ActiveSupport::Concern
|
6
|
+
|
7
|
+
ELEMENT_TYPES = {
|
8
|
+
contact: 1,
|
9
|
+
lead: 2,
|
10
|
+
company: 3,
|
11
|
+
task: 4
|
12
|
+
}.freeze
|
13
|
+
|
14
|
+
included do
|
15
|
+
amo_field :element_id, :element_type
|
16
|
+
|
17
|
+
validates :element_id, :element_type,
|
18
|
+
presence: true
|
19
|
+
end
|
20
|
+
|
21
|
+
ELEMENT_TYPES.each do |type, value|
|
22
|
+
class_eval <<-CODE, __FILE__, __LINE__ + 1
|
23
|
+
def #{type}=(val) # def contact=(val)
|
24
|
+
#{type}! if val # contact! if val
|
25
|
+
end # end
|
26
|
+
|
27
|
+
def #{type}? # def contact?
|
28
|
+
self.element_type == #{value} # self.element_type == 1
|
29
|
+
end # end
|
30
|
+
|
31
|
+
def #{type}! # def contact!
|
32
|
+
self.element_type = #{value} # self.element_type = 1
|
33
|
+
end # end
|
34
|
+
CODE
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
require 'amorail/entities/elementable'
|
2
|
+
|
3
|
+
module Amorail
|
4
|
+
# AmoCRM note entity
|
5
|
+
class Note < Amorail::Entity
|
6
|
+
include Elementable
|
7
|
+
|
8
|
+
amo_names 'notes'
|
9
|
+
|
10
|
+
amo_field :note_type, :text
|
11
|
+
|
12
|
+
validates :note_type, :text,
|
13
|
+
presence: true
|
14
|
+
|
15
|
+
validates :element_type, inclusion: ELEMENT_TYPES.values
|
16
|
+
end
|
17
|
+
end
|
@@ -1,32 +1,18 @@
|
|
1
|
+
require 'amorail/entities/elementable'
|
2
|
+
|
1
3
|
module Amorail
|
2
4
|
# AmoCRM task entity
|
3
5
|
class Task < Amorail::Entity
|
4
|
-
|
5
|
-
|
6
|
-
amo_field :element_id, :element_type, :text,
|
7
|
-
:task_type, complete_till: :timestamp
|
6
|
+
include Elementable
|
8
7
|
|
9
|
-
|
10
|
-
:element_type, :complete_till,
|
11
|
-
:task_type,
|
12
|
-
presence: true
|
8
|
+
amo_names 'tasks'
|
13
9
|
|
14
|
-
|
10
|
+
amo_field :task_type, :text, complete_till: :timestamp
|
15
11
|
|
16
|
-
|
17
|
-
|
18
|
-
def #{prop[:name]}=(val)
|
19
|
-
#{prop[:name]}! if val
|
20
|
-
end
|
21
|
-
|
22
|
-
def #{prop[:name]}?
|
23
|
-
self.element_type == #{prop[:val]}
|
24
|
-
end
|
12
|
+
validates :task_type, :text, :complete_till,
|
13
|
+
presence: true
|
25
14
|
|
26
|
-
|
27
|
-
|
28
|
-
end
|
29
|
-
CODE
|
30
|
-
end
|
15
|
+
validates :element_type, inclusion:
|
16
|
+
ELEMENT_TYPES.reject { |type, _| type == :task }.values
|
31
17
|
end
|
32
18
|
end
|
data/lib/amorail/entity.rb
CHANGED
@@ -111,11 +111,13 @@ module Amorail
|
|
111
111
|
def handle_response(response, method)
|
112
112
|
return false unless response.status == 200
|
113
113
|
extract_method = "extract_data_#{method}"
|
114
|
+
return self unless respond_to?(extract_method, true)
|
115
|
+
|
114
116
|
reload_model(
|
115
117
|
send(extract_method,
|
116
118
|
response.body['response'][self.class.amo_response_name]
|
117
119
|
)
|
118
|
-
)
|
120
|
+
)
|
119
121
|
self
|
120
122
|
end
|
121
123
|
end
|
@@ -14,26 +14,26 @@ module Amorail # :nodoc: all
|
|
14
14
|
rec
|
15
15
|
end
|
16
16
|
|
17
|
-
|
18
|
-
|
19
|
-
|
17
|
+
# General method to load many records by proving some filters
|
18
|
+
def where(options)
|
20
19
|
response = client.safe_request(
|
21
20
|
:get,
|
22
21
|
remote_url('list'),
|
23
|
-
|
22
|
+
options
|
24
23
|
)
|
25
24
|
load_many(response)
|
26
25
|
end
|
27
26
|
|
27
|
+
def find_all(*ids)
|
28
|
+
ids = ids.first if ids.size == 1 && ids.first.is_a?(Array)
|
29
|
+
|
30
|
+
where(id: ids)
|
31
|
+
end
|
32
|
+
|
28
33
|
# Find AMO entities by query
|
29
34
|
# Returns array of matching entities.
|
30
35
|
def find_by_query(q)
|
31
|
-
|
32
|
-
:get,
|
33
|
-
remote_url('list'),
|
34
|
-
query: q
|
35
|
-
)
|
36
|
-
load_many(response)
|
36
|
+
where(query: q)
|
37
37
|
end
|
38
38
|
|
39
39
|
private
|
data/lib/amorail/property.rb
CHANGED
data/lib/amorail/railtie.rb
CHANGED
data/lib/amorail/version.rb
CHANGED
data/spec/contact_spec.rb
CHANGED
@@ -136,6 +136,21 @@ describe Amorail::Contact do
|
|
136
136
|
end
|
137
137
|
end
|
138
138
|
|
139
|
+
describe ".where" do
|
140
|
+
before { contacts_where_stub(Amorail.config.api_endpoint, query: 'xxx', limit_rows: 10, limit_offset: 100) }
|
141
|
+
|
142
|
+
it "loads entities" do
|
143
|
+
res = described_class.where(query: 'xxx', limit_rows: 10, limit_offset: 100)
|
144
|
+
expect(res.size).to eq 2
|
145
|
+
expect(res.first.id).to eq 101
|
146
|
+
expect(res.last.id).to eq 102
|
147
|
+
expect(res.first.company_name).to eq "Foo Inc."
|
148
|
+
expect(res.last.email).to eq "foo2@tb.com"
|
149
|
+
expect(res.first.phone).to eq "1111 111 111"
|
150
|
+
expect(res.first.params[:id]).to eq 101
|
151
|
+
end
|
152
|
+
end
|
153
|
+
|
139
154
|
describe "#save" do
|
140
155
|
before { contact_create_stub(Amorail.config.api_endpoint) }
|
141
156
|
|
@@ -150,6 +150,26 @@ module AmoWebMock
|
|
150
150
|
end
|
151
151
|
end
|
152
152
|
|
153
|
+
def contacts_where_stub(endpoint, success = true, **params)
|
154
|
+
if success
|
155
|
+
stub_request(
|
156
|
+
:get,
|
157
|
+
"#{endpoint}/private/api/v2/json/contacts/list"
|
158
|
+
).with(
|
159
|
+
query: params
|
160
|
+
).to_return(
|
161
|
+
body: File.read('./spec/fixtures/contact_find_query.json'),
|
162
|
+
headers: { 'Content-Type' => 'application/json' },
|
163
|
+
status: 200
|
164
|
+
)
|
165
|
+
else
|
166
|
+
stub_request(
|
167
|
+
:get,
|
168
|
+
"#{endpoint}/private/api/v2/json/contacts/list?query=#{query}")
|
169
|
+
.to_return(status: 204)
|
170
|
+
end
|
171
|
+
end
|
172
|
+
|
153
173
|
def company_create_stub(endpoint)
|
154
174
|
stub_request(:post, endpoint + '/private/api/v2/json/company/set')
|
155
175
|
.to_return(
|
data/spec/note_spec.rb
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Amorail::Note do
|
4
|
+
before { mock_api }
|
5
|
+
|
6
|
+
it_behaves_like 'elementable'
|
7
|
+
|
8
|
+
describe 'validations' do
|
9
|
+
it { is_expected.to validate_presence_of(:text) }
|
10
|
+
it { is_expected.to validate_presence_of(:note_type) }
|
11
|
+
it { is_expected.to validate_inclusion_of(:element_type).in_range(1..4) }
|
12
|
+
end
|
13
|
+
|
14
|
+
describe '.attributes' do
|
15
|
+
subject { described_class.attributes }
|
16
|
+
|
17
|
+
it_behaves_like 'entity_class'
|
18
|
+
|
19
|
+
specify do
|
20
|
+
is_expected.to include(
|
21
|
+
:text,
|
22
|
+
:note_type
|
23
|
+
)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
shared_examples 'elementable' do
|
2
|
+
describe 'validations' do
|
3
|
+
it { is_expected.to validate_presence_of(:element_id) }
|
4
|
+
it { is_expected.to validate_presence_of(:element_type) }
|
5
|
+
end
|
6
|
+
|
7
|
+
describe '.attributes' do
|
8
|
+
subject { described_class.attributes }
|
9
|
+
|
10
|
+
specify do
|
11
|
+
is_expected.to include(
|
12
|
+
:element_type,
|
13
|
+
:element_id
|
14
|
+
)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
describe '#params' do
|
19
|
+
subject { elementable.params }
|
20
|
+
|
21
|
+
let(:elementable) do
|
22
|
+
described_class.new(
|
23
|
+
element_id: 1,
|
24
|
+
element_type: 2
|
25
|
+
)
|
26
|
+
end
|
27
|
+
|
28
|
+
it { is_expected.to include(element_id: 1) }
|
29
|
+
it { is_expected.to include(element_type: 2) }
|
30
|
+
end
|
31
|
+
|
32
|
+
describe 'element type behaviour' do
|
33
|
+
let(:elementable) { described_class.new }
|
34
|
+
|
35
|
+
it 'set element_type on initialize' do
|
36
|
+
expect(described_class.new(lead: true).element_type).to eq 2
|
37
|
+
expect(described_class.new(lead: false).element_type).to be_nil
|
38
|
+
expect(described_class.new(contact: true).contact?).to be_truthy
|
39
|
+
end
|
40
|
+
|
41
|
+
it 'set element_type with bang method' do
|
42
|
+
elementable.contact!
|
43
|
+
expect(elementable.element_type).to eq 1
|
44
|
+
|
45
|
+
elementable.lead!
|
46
|
+
expect(elementable.element_type).to eq 2
|
47
|
+
|
48
|
+
elementable.company!
|
49
|
+
expect(elementable.element_type).to eq 3
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
data/spec/task_spec.rb
CHANGED
@@ -3,13 +3,13 @@ require "spec_helper"
|
|
3
3
|
describe Amorail::Task do
|
4
4
|
before { mock_api }
|
5
5
|
|
6
|
+
it_behaves_like 'elementable'
|
7
|
+
|
6
8
|
describe "validations" do
|
7
|
-
it {
|
8
|
-
it {
|
9
|
-
it {
|
10
|
-
it {
|
11
|
-
it { should validate_presence_of(:task_type) }
|
12
|
-
it { should validate_presence_of(:complete_till) }
|
9
|
+
it { is_expected.to validate_presence_of(:text) }
|
10
|
+
it { is_expected.to validate_presence_of(:task_type) }
|
11
|
+
it { is_expected.to validate_presence_of(:complete_till) }
|
12
|
+
it { is_expected.to validate_inclusion_of(:element_type).in_range(1..3) }
|
13
13
|
end
|
14
14
|
|
15
15
|
describe ".attributes" do
|
@@ -19,8 +19,6 @@ describe Amorail::Task do
|
|
19
19
|
|
20
20
|
specify do
|
21
21
|
is_expected.to include(
|
22
|
-
:element_type,
|
23
|
-
:element_id,
|
24
22
|
:text,
|
25
23
|
:task_type,
|
26
24
|
:complete_till
|
@@ -28,27 +26,9 @@ describe Amorail::Task do
|
|
28
26
|
end
|
29
27
|
end
|
30
28
|
|
31
|
-
describe "contact and lead" do
|
32
|
-
let(:task) { described_class.new }
|
33
|
-
it "set element_type on initialize" do
|
34
|
-
expect(described_class.new(lead: true).element_type).to eq 2
|
35
|
-
expect(described_class.new(contact: true).contact?).to be_truthy
|
36
|
-
expect(described_class.new(lead: false).element_type).to be_nil
|
37
|
-
end
|
38
|
-
|
39
|
-
it "set element_type with bang method" do
|
40
|
-
task.contact!
|
41
|
-
expect(task.element_type).to eq 1
|
42
|
-
task.lead!
|
43
|
-
expect(task.element_type).to eq 2
|
44
|
-
end
|
45
|
-
end
|
46
|
-
|
47
29
|
describe "#params" do
|
48
30
|
let(:task) do
|
49
31
|
described_class.new(
|
50
|
-
element_id: 1,
|
51
|
-
element_type: 1,
|
52
32
|
text: 'Win the war',
|
53
33
|
task_type: 'test',
|
54
34
|
complete_till: '2015-05-09 12:00:00'
|
@@ -58,8 +38,6 @@ describe Amorail::Task do
|
|
58
38
|
subject { task.params }
|
59
39
|
|
60
40
|
specify { is_expected.to include(:last_modified) }
|
61
|
-
specify { is_expected.to include(element_id: 1) }
|
62
|
-
specify { is_expected.to include(element_type: 1) }
|
63
41
|
specify { is_expected.to include(text: 'Win the war') }
|
64
42
|
specify { is_expected.to include(task_type: 'test') }
|
65
43
|
specify {
|
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.3.
|
4
|
+
version: 0.3.5
|
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: 2017-07-
|
12
|
+
date: 2017-07-21 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: bundler
|
@@ -95,6 +95,20 @@ dependencies:
|
|
95
95
|
- - "~>"
|
96
96
|
- !ruby/object:Gem::Version
|
97
97
|
version: '2.0'
|
98
|
+
- !ruby/object:Gem::Dependency
|
99
|
+
name: rubocop
|
100
|
+
requirement: !ruby/object:Gem::Requirement
|
101
|
+
requirements:
|
102
|
+
- - "~>"
|
103
|
+
- !ruby/object:Gem::Version
|
104
|
+
version: '0.49'
|
105
|
+
type: :development
|
106
|
+
prerelease: false
|
107
|
+
version_requirements: !ruby/object:Gem::Requirement
|
108
|
+
requirements:
|
109
|
+
- - "~>"
|
110
|
+
- !ruby/object:Gem::Version
|
111
|
+
version: '0.49'
|
98
112
|
- !ruby/object:Gem::Dependency
|
99
113
|
name: anyway_config
|
100
114
|
requirement: !ruby/object:Gem::Requirement
|
@@ -180,7 +194,6 @@ extensions: []
|
|
180
194
|
extra_rdoc_files: []
|
181
195
|
files:
|
182
196
|
- ".gitignore"
|
183
|
-
- ".hound.yml"
|
184
197
|
- ".rubocop.yml"
|
185
198
|
- ".travis.yml"
|
186
199
|
- Gemfile
|
@@ -194,8 +207,10 @@ files:
|
|
194
207
|
- lib/amorail/entities/company.rb
|
195
208
|
- lib/amorail/entities/contact.rb
|
196
209
|
- lib/amorail/entities/contact_link.rb
|
210
|
+
- lib/amorail/entities/elementable.rb
|
197
211
|
- lib/amorail/entities/lead.rb
|
198
212
|
- lib/amorail/entities/leadable.rb
|
213
|
+
- lib/amorail/entities/note.rb
|
199
214
|
- lib/amorail/entities/task.rb
|
200
215
|
- lib/amorail/entity.rb
|
201
216
|
- lib/amorail/entity/finders.rb
|
@@ -225,8 +240,10 @@ files:
|
|
225
240
|
- spec/helpers/webmock_helpers.rb
|
226
241
|
- spec/lead_spec.rb
|
227
242
|
- spec/my_contact_spec.rb
|
243
|
+
- spec/note_spec.rb
|
228
244
|
- spec/property_spec.rb
|
229
245
|
- spec/spec_helper.rb
|
246
|
+
- spec/support/elementable_example.rb
|
230
247
|
- spec/support/entity_class_example.rb
|
231
248
|
- spec/support/leadable_example.rb
|
232
249
|
- spec/support/my_contact.rb
|
@@ -276,8 +293,10 @@ test_files:
|
|
276
293
|
- spec/helpers/webmock_helpers.rb
|
277
294
|
- spec/lead_spec.rb
|
278
295
|
- spec/my_contact_spec.rb
|
296
|
+
- spec/note_spec.rb
|
279
297
|
- spec/property_spec.rb
|
280
298
|
- spec/spec_helper.rb
|
299
|
+
- spec/support/elementable_example.rb
|
281
300
|
- spec/support/entity_class_example.rb
|
282
301
|
- spec/support/leadable_example.rb
|
283
302
|
- spec/support/my_contact.rb
|