civicrm 1.1.1 → 1.2.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 8fef486cc306da297b9010ca9d025559f42d7c66
4
- data.tar.gz: 2ed02b63e766f9c26662199f991e9ed036cf9fa5
3
+ metadata.gz: 0b324b4218b63ab0e45d5d97f6524a4352bc34d9
4
+ data.tar.gz: db21f89583ef7ad9d9f05b25316569f11f0147d9
5
5
  SHA512:
6
- metadata.gz: 5f11702c08be0bed68b271de6397f37f3080086bce413e56e8c8bd2e2f412ab6df57c1342da3cca8a2935906ec533bc85a9f7a15b32f71667473ca18b3fd3220
7
- data.tar.gz: 1f2136ec2723933ced104de99c7ec9b626a71eb500c20cb0e00a5ea105e77cdb69e521338f9102b07cf9d41cad19caa777c104463cd467d59b540c27e75282db
6
+ metadata.gz: 351a3d9c51988a98df4df75b8e40c575af6845bf6f256a3db12443a6c9ab01a617e70edde104bf04e130df601471ba87d81a37b3c63f9bbaea1f0a56af26d137
7
+ data.tar.gz: 84c42c92bbe8e32fde0730eacd101f64192635fb06b3a1c7faeda9b14d86748aadc25dec951c9da14710ddb5b9b97ab6a74453ff3a03529c254f7db0099cc98a
@@ -1,46 +1,44 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- civicrm (1.0.5)
4
+ civicrm (1.1.1)
5
5
  activemodel
6
6
  activesupport
7
7
  nokogiri
8
- rest-client (~> 1.4)
8
+ rest-client (~> 2.0)
9
9
 
10
10
  GEM
11
11
  remote: https://rubygems.org/
12
12
  specs:
13
- activemodel (4.1.16)
14
- activesupport (= 4.1.16)
15
- builder (~> 3.1)
16
- activesupport (4.1.16)
17
- i18n (~> 0.6, >= 0.6.9)
18
- json (~> 1.7, >= 1.7.7)
13
+ activemodel (5.2.1)
14
+ activesupport (= 5.2.1)
15
+ activesupport (5.2.1)
16
+ concurrent-ruby (~> 1.0, >= 1.0.2)
17
+ i18n (>= 0.7, < 2)
19
18
  minitest (~> 5.1)
20
- thread_safe (~> 0.1)
21
19
  tzinfo (~> 1.1)
22
- builder (3.2.3)
23
20
  byebug (10.0.2)
24
- concurrent-ruby (1.0.5)
21
+ concurrent-ruby (1.1.4)
25
22
  diff-lcs (1.3)
26
23
  domain_name (0.5.20180417)
27
24
  unf (>= 0.0.5, < 1.0.0)
28
25
  http-cookie (1.0.3)
29
26
  domain_name (~> 0.5)
30
- i18n (0.9.5)
27
+ i18n (1.1.1)
31
28
  concurrent-ruby (~> 1.0)
32
- json (1.8.6)
33
- mime-types (2.99.3)
34
- mini_portile2 (2.3.0)
29
+ mime-types (3.1)
30
+ mime-types-data (~> 3.2015)
31
+ mime-types-data (3.2016.0521)
32
+ mini_portile2 (2.4.0)
35
33
  minitest (5.11.3)
36
34
  netrc (0.11.0)
37
- nokogiri (1.8.4)
38
- mini_portile2 (~> 2.3.0)
35
+ nokogiri (1.10.1)
36
+ mini_portile2 (~> 2.4.0)
39
37
  rake (10.0.3)
40
- rest-client (1.8.0)
38
+ rest-client (2.0.2)
41
39
  http-cookie (>= 1.0.2, < 2.0)
42
- mime-types (>= 1.16, < 3.0)
43
- netrc (~> 0.7)
40
+ mime-types (>= 1.16, < 4.0)
41
+ netrc (~> 0.8)
44
42
  rspec (3.8.0)
45
43
  rspec-core (~> 3.8.0)
46
44
  rspec-expectations (~> 3.8.0)
data/README.md CHANGED
@@ -12,11 +12,6 @@ $ gem install civicrm
12
12
  # Required config
13
13
  CiviCrm.api_base = "https://www.example.org/path/to/civi/codebase/"
14
14
  CiviCrm.site_key = "YOUR_SITE_KEY"
15
-
16
- # Authenticate with username/password
17
- CiviCrm.authenticate("username", "password")
18
-
19
- # OR, authenticate with API key
20
15
  CiviCrm.api_key = "..."
21
16
  ```
22
17
 
@@ -13,7 +13,7 @@ spec = Gem::Specification.new do |s|
13
13
  s.executables = 'civicrm'
14
14
  s.require_paths = %w{lib}
15
15
 
16
- s.add_dependency('rest-client', '~> 1.4')
16
+ s.add_dependency('rest-client', '~> 2.0')
17
17
  s.add_dependency('activesupport')
18
18
  s.add_dependency('activemodel')
19
19
  s.add_dependency('nokogiri')
@@ -1,3 +1,5 @@
1
+ require 'json'
2
+
1
3
  require 'active_support/deprecation'
2
4
  require 'active_support/core_ext/module'
3
5
  require 'active_support/core_ext/hash'
@@ -7,7 +9,6 @@ require 'nokogiri'
7
9
 
8
10
  # utils
9
11
  require 'civicrm/client'
10
- require 'civicrm/xml'
11
12
  require 'civicrm/resource'
12
13
  require 'civicrm/profiling'
13
14
  require 'civicrm/version'
@@ -34,7 +35,6 @@ module CiviCrm
34
35
  @@site_key = nil
35
36
  @@api_base = 'https://www.example.org/path/to/civi/codebase'
36
37
  @@api_version = 'v3'
37
- @@user_authenticated = false
38
38
 
39
39
  mattr_accessor :api_key, :api_base, :api_version, :site_key
40
40
 
@@ -45,11 +45,6 @@ module CiviCrm
45
45
  base
46
46
  end
47
47
 
48
- def self.authenticate(name, password)
49
- auth = Client.request(:post, q: 'civicrm/login', name: name, pass: password)
50
- @@api_key = auth[0]['api_key']
51
- end
52
-
53
48
  def self.api_key=(key)
54
49
  @@api_key = key
55
50
  end
@@ -7,8 +7,12 @@ module CiviCrm
7
7
  'action' => 'delete',
8
8
  'id' => id
9
9
  }
10
+
10
11
  response = CiviCrm::Client.request(:post, params)
11
- refresh_from(response.first.to_hash)
12
+
13
+ if response < 1
14
+ raise Error, "Couldn't delete #{entity_class_name}##{id}"
15
+ end
12
16
  end
13
17
 
14
18
  def delete!
@@ -18,8 +22,12 @@ module CiviCrm
18
22
  'skip_undelete' => 1,
19
23
  'id' => id
20
24
  }
25
+
21
26
  response = CiviCrm::Client.request(:post, params)
22
- refresh_from(response.first.to_hash)
27
+
28
+ if response < 1
29
+ raise Error, "Couldn't delete #{entity_class_name}##{id}"
30
+ end
23
31
  end
24
32
  end
25
33
  end
@@ -5,27 +5,32 @@ module CiviCrm
5
5
  # Returns parsed class inherited from CiviCrm::Resource
6
6
  def request(method, params = {})
7
7
  unless CiviCrm.site_key
8
- raise CiviCrm::Errors::Unauthorized, "Please specify CiviCrm.site_key"
8
+ raise CiviCrm::Errors::Unauthorized,
9
+ "Please specify CiviCrm.site_key"
9
10
  end
11
+
10
12
  headers = {
11
13
  :user_agent => "CiviCrm RubyClient/#{CiviCrm::VERSION}"
12
14
  }
13
15
 
14
16
  opts = {
15
- :method => method,
17
+ :method => :post,
16
18
  :timeout => 80,
17
19
  :headers => headers
18
20
  }
19
21
 
20
- # build params
21
- case method.to_s.downcase.to_sym
22
- when :get, :head, :delete
23
- path = params.count > 0 ? stringify_params(params) : ''
24
- else
25
- opts[:payload] = stringify_params(params)
26
- end
22
+ params = params.dup
23
+
24
+ entity = params.delete("entity")
25
+ raise ArgumentError, "params must include entity" unless entity
27
26
 
28
- opts[:url] = CiviCrm.api_url(path)
27
+ action = params.delete("action")
28
+ raise ArgumentError, "params must include action" unless action
29
+
30
+ method = { entity: entity, action: action }.to_query
31
+
32
+ opts[:payload] = { json: JSON.dump(params) }
33
+ opts[:url] = CiviCrm.api_url(method)
29
34
 
30
35
  response = nil
31
36
 
@@ -33,16 +38,19 @@ module CiviCrm
33
38
  response = execute(opts)
34
39
  end
35
40
 
36
- puts(JSON.dump(params)) if ENV["DEBUG_CIVICRM_REQUEST"]
41
+ puts(JSON.dump(opts)) if ENV["DEBUG_CIVICRM_REQUEST"]
37
42
  puts(response) if ENV["DEBUG_CIVICRM_RESPONSE"]
38
43
 
39
44
  body, code = response.body, response.code
40
45
 
41
- CiviCrm::XML.parse(body).tap do |results|
42
- Array(results).each do |res|
43
- raise Error, res["error_message"] if res["is_error"] == "1"
44
- end
46
+ parsed_response = JSON.parse(body)
47
+
48
+ if parsed_response["is_error"] == 1
49
+ raise Error, parsed_response["error_message"]
45
50
  end
51
+
52
+ values = parsed_response.fetch("values")
53
+ values.is_a?(Hash) ? values.values : values
46
54
  end
47
55
 
48
56
  def execute(opts)
@@ -63,23 +71,6 @@ module CiviCrm
63
71
  raise e
64
72
  end
65
73
  end
66
-
67
- def uri_escape(key)
68
- URI.escape(key.to_s, Regexp.new("[^#{URI::PATTERN::UNRESERVED}]"))
69
- end
70
-
71
- def flatten_params(params, parent_key = nil)
72
- result = []
73
- params.each do |key, value|
74
- flatten_key = parent_key ? "#{parent_key}[#{uri_escape(key)}]" : uri_escape(key)
75
- result += value.is_a?(Hash) ? flatten_params(value, flatten_key) : [[flatten_key, value]]
76
- end
77
- result
78
- end
79
-
80
- def stringify_params(params)
81
- flatten_params(params).collect{|key, value| "#{key}=#{uri_escape(value)}"}.join('&')
82
- end
83
74
  end
84
75
  end
85
76
  end
@@ -1,3 +1,5 @@
1
+ require "benchmark"
2
+
1
3
  module CiviCrm
2
4
  module Profiling
3
5
  extend ActiveSupport::Concern
@@ -1,3 +1,3 @@
1
1
  module CiviCrm
2
- VERSION = '1.1.1'
2
+ VERSION = '1.2.0'
3
3
  end
@@ -7,19 +7,10 @@ describe "API Bindings" do
7
7
  let(:client){ authorized_civicrm_client }
8
8
 
9
9
  it "should not fetch from network while initializing a new Resource" do
10
- expect(client).not_to receive(:get)
10
+ expect(client).not_to receive(:post)
11
11
  CiviCrm::Contact.new(id: "someid")
12
12
  end
13
13
 
14
- it "should run authentication" do
15
- expect(client).
16
- to receive(:post).
17
- exactly(:once).
18
- and_return(test_response(api_key: 'test'))
19
-
20
- CiviCrm.authenticate("test", "test")
21
- end
22
-
23
14
  describe "exception handler" do
24
15
  let(:client){ CiviCrm::Client }
25
16
 
@@ -1,6 +1,6 @@
1
1
  module CiviCrm::TestResponses
2
2
  def test_response(body, code = 200)
3
- body = CiviCrm::XML.encode(body) if !(body.kind_of? String)
3
+ body = JSON.dump(is_error: 0, values: [body]) if !(body.kind_of? String)
4
4
  double(body: body, code: code)
5
5
  end
6
6
 
@@ -5,7 +5,7 @@ RSpec::Matchers.define :be_listable_resource do |expected|
5
5
  test_response_hash = send(:"test_#{subject.name.demodulize.underscore}_array")
6
6
 
7
7
  expect(client).
8
- to receive(:get).
8
+ to receive(:post).
9
9
  exactly(:once).
10
10
  and_return(test_response(test_response_hash))
11
11
 
@@ -19,7 +19,7 @@ RSpec::Matchers.define :be_updatable_resource do |expected|
19
19
  subject = actual.class
20
20
 
21
21
  expect(client).
22
- to receive(:get).
22
+ to receive(:post).
23
23
  exactly(:once).
24
24
  and_return(test_response(test_contact({name: "foo"})))
25
25
 
@@ -43,12 +43,12 @@ RSpec::Matchers.define :be_deleteable_resource do |expected|
43
43
  subject = actual.class
44
44
 
45
45
  expect(client).
46
- to receive(:get).
46
+ to receive(:post).
47
47
  exactly(:once).
48
48
  and_return(test_response(test_contact({name: "foo"})))
49
49
 
50
50
  expect(client).
51
- to receive(:delete).
51
+ to receive(:post).
52
52
  exactly(:once).
53
53
  and_return(test_response(test_contact({name: "bar"})))
54
54
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: civicrm
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.1
4
+ version: 1.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Iskander Haziev
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-11-02 00:00:00.000000000 Z
11
+ date: 2019-02-08 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rest-client
@@ -16,14 +16,14 @@ dependencies:
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: '1.4'
19
+ version: '2.0'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: '1.4'
26
+ version: '2.0'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: activesupport
29
29
  requirement: !ruby/object:Gem::Requirement
@@ -140,7 +140,6 @@ files:
140
140
  - lib/civicrm/resource.rb
141
141
  - lib/civicrm/resources/base.rb
142
142
  - lib/civicrm/version.rb
143
- - lib/civicrm/xml.rb
144
143
  - spec/requests/base_spec.rb
145
144
  - spec/resources/contact_spec.rb
146
145
  - spec/spec_helper.rb
@@ -1,41 +0,0 @@
1
- module CiviCrm
2
- class XML
3
- class << self
4
- def parse(text)
5
- # CiviCRM <Result>s sometimes contain invalid elements
6
- # like <preferred_communication_method><0></0></ ...
7
- # Get rid of them before parsing.
8
- fixed_text = text.to_s.
9
- gsub("\n", "").
10
- gsub(/<\d+>(.*?)<\/\d+>/, "")
11
-
12
- doc = Nokogiri::XML.parse(fixed_text)
13
-
14
- results = doc.xpath('//Result')
15
- results.map do |result|
16
- hash = {}
17
- result.children.each do |attribute|
18
- next unless attribute.is_a?(Nokogiri::XML::Element)
19
- hash[attribute.name] = attribute.children[0].text rescue nil
20
- end
21
- hash
22
- end
23
- end
24
- def encode(resources)
25
- builder = Nokogiri::XML::Builder.new do |xml|
26
- xml.ResultSet do
27
- Array.wrap(resources).each do |resource|
28
- attributes = resource.respond_to?(:attributes) ? resource.attributes : resource
29
- xml.Result do
30
- attributes.each do |key, value|
31
- xml.send key.to_sym, value
32
- end
33
- end
34
- end
35
- end
36
- end
37
- builder.to_xml
38
- end
39
- end
40
- end
41
- end