method_crm 0.0.1 → 0.1.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.
data/.gitignore CHANGED
@@ -15,4 +15,5 @@ spec/reports
15
15
  test/tmp
16
16
  test/version_tmp
17
17
  tmp
18
- spec/support/config.yml
18
+ spec/support/config.yml
19
+ spec/support/cassettes/MethodCrm_Client.yml
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --color
2
+ --format documentation
@@ -1,5 +1,7 @@
1
1
  require 'rest_client'
2
2
  require 'multi_xml'
3
+
4
+ class MethodCrmClientError < StandardError; end
3
5
  module MethodCrm
4
6
  class Client
5
7
 
@@ -7,27 +9,53 @@ module MethodCrm
7
9
  @auth = {strCompanyAccount: company, strLogin: username, strPassword: password, strSessionID: nil}
8
10
  end
9
11
 
10
- def table_list
11
- parsed_response('TableList')
12
+ def table_list(output = nil)
13
+ results = parsed_response('TableList')
14
+ case output.to_s
15
+ when 'detailed'
16
+ results
17
+ else
18
+ results.map { |table| table['TableName'] }
19
+ end
12
20
  end
13
21
 
14
- def field_list(table)
15
- parsed_response('FieldList', {'strTable' => table})
22
+ def field_list(table, output = nil)
23
+ results = parsed_response('FieldList', {'strTable' => table})
24
+ case output.to_s
25
+ when 'detailed'
26
+ results
27
+ else
28
+ results.map { |table| table['FieldName'] }
29
+ end
16
30
  end
17
31
 
18
- def get_records(table, fields = :all_fields)
19
- if fields == :all_fields
20
- fields = field_list(table).map { |field| field['FieldName'] }.join(',')
21
- end
22
- data = @auth.merge({strTable: table, strFields: fields, strWhereClause: nil, strGroupByClause: nil, strHaving: nil, strOrderBy: nil})
32
+ def get_records(table, options={})
33
+ options[:fields] ||= field_list(table).join(',')
34
+ options = {:where => nil}.merge(options)
35
+ data = @auth.merge({strTable: table, strFields: options[:fields], strWhereClause: options[:where], strGroupByClause: nil, strHaving: nil, strOrderBy: nil})
23
36
  parsed_response('Select_XML', data)
24
37
  end
25
38
 
39
+ def get_record(table, options={})
40
+ record = get_records(table, options)
41
+ raise MethodCrmClientError, 'Query returned more than one record' unless record.is_a?(Hash)
42
+ record
43
+ end
26
44
  private
27
45
  def parsed_response(opperation, data={})
28
46
  result = RestClient.post("http://www.methodintegration.com/MethodAPI/service.asmx/MethodAPI#{opperation}V2", @auth.merge(data))
29
- content = MultiXml.parse(result)['string']['__content__']
30
- MultiXml.parse(content)['MethodAPI']['MethodIntegration']['Record']
47
+ xml = MultiXml.parse(result)
48
+ content = xml['string']['__content__'] || xml['string']
49
+ parsed_content = MultiXml.parse(content)
50
+ if parsed_content['MethodAPI']['response'] == "Success"
51
+ unless parsed_content['MethodAPI']['MethodIntegration'].nil?
52
+ parsed_content['MethodAPI']['MethodIntegration']['Record']
53
+ else
54
+ []
55
+ end
56
+ else
57
+ raise MethodCrmClientError, parsed_content['MethodAPI']['response']
58
+ end
31
59
  end
32
60
  end
33
61
  end
@@ -1,7 +1,7 @@
1
1
  # -*- encoding: utf-8 -*-
2
2
  Gem::Specification.new do |gem|
3
3
  gem.name = "method_crm"
4
- gem.version = '0.0.1'
4
+ gem.version = '0.1.0'
5
5
 
6
6
  gem.author = 'Torey Heinz'
7
7
  gem.email = 'toreyheinz@gmail.com'
@@ -15,7 +15,9 @@ Gem::Specification.new do |gem|
15
15
  gem.add_dependency 'rest-client', '~> 1.6'
16
16
  gem.add_dependency 'multi_xml'
17
17
 
18
- gem.add_development_dependency 'rake', '~> 0.9'
19
- gem.add_development_dependency 'rspec', '~> 2.11'
18
+ gem.add_development_dependency 'rake', '~> 0.9'
19
+ gem.add_development_dependency 'rspec', '~> 2.12'
20
+ gem.add_development_dependency 'vcr', '~> 1.6.0'
21
+ gem.add_development_dependency 'webmock', '~> 1.6.0'
20
22
  gem.test_files = gem.files.grep(/^spec/)
21
23
  end
@@ -1,17 +1,115 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe MethodCrm::Client do
4
- let(:client) {MethodCrm::Client.new(CONFIG[:company], CONFIG[:user], CONFIG[:password])}
4
+ let(:client) {MethodCrm::Client.new(
5
+ CONFIG[:company],
6
+ CONFIG[:user],
7
+ CONFIG[:password]
8
+ )}
9
+ use_vcr_cassette
5
10
 
6
- it '#table_list returns an array of table hashes' do
7
- client.table_list.all? {|hash| hash.has_key?('TableName')}.should be
11
+ describe '#table_list' do
12
+ it 'returns a list of table names' do
13
+ results = client.table_list
14
+ results.should include(
15
+ "Account",
16
+ "AccountAccountType",
17
+ "VendorCreditLineItem",
18
+ "VendorType"
19
+ )
20
+ end
21
+
22
+ context ":detailed" do
23
+ it 'returns a list of table details' do
24
+ results = client.table_list(:detailed)
25
+ results.first.keys.should include(
26
+ 'TableName',
27
+ 'SupportsAdd',
28
+ 'SupportsEdit'
29
+ )
30
+ end
31
+ end
8
32
  end
9
33
 
10
- it '#field_list returns an array of field hashes' do
11
- client.field_list('Invoice').all? {|hash| hash.has_key?('FieldName')}.should be
34
+ describe '#field_list' do
35
+ it 'returns a given table`s field names' do
36
+ results = client.field_list('AccountAccountType')
37
+ results.should include("AccountTypeName", "RecordID")
38
+ end
39
+
40
+ context ":detailed" do
41
+ it 'returns a given table`s field details' do
42
+ results = client.field_list('AccountAccountType', :detailed)
43
+ results.first.keys.should include(
44
+ "SupportsAdd",
45
+ "SupportsEdit",
46
+ "IsRequired",
47
+ "FieldName",
48
+ "MaxSize",
49
+ "DataType"
50
+ )
51
+ end
52
+ end
12
53
  end
13
54
 
14
- it '#get_records returns a table`s records' do
15
- client.get_records('Account').all? {|hash| hash.has_key?('AccountNumber')}.should be
55
+ describe '#get_records' do
56
+ it 'returns a given table`s records' do
57
+ results = client.get_records('AccountAccountType')
58
+ results.map {|record| record['AccountTypeName'] }.should include(
59
+ "AccountsPayable",
60
+ "AccountsReceivable",
61
+ "Bank",
62
+ "CostOfGoodsSold",
63
+ "CreditCard",
64
+ "Equity",
65
+ "Expense",
66
+ "FixedAsset",
67
+ "Income",
68
+ "LongTermLiability",
69
+ "NonPosting",
70
+ "OtherAsset",
71
+ "OtherCurrentAsset",
72
+ "OtherCurrentLiability",
73
+ "OtherExpense",
74
+ "OtherIncome",
75
+ "Suspense"
76
+ )
77
+ end
78
+
79
+ it 'limits records with a where clause' do
80
+ results = client.get_records('AccountAccountType', {:where => "AccountTypeName like 'Other%'"})
81
+ account_type_names = results.map {|record| record['AccountTypeName'] }
82
+ account_type_names.should include(
83
+ "OtherAsset",
84
+ "OtherCurrentAsset",
85
+ "OtherCurrentLiability",
86
+ "OtherExpense",
87
+ "OtherIncome",
88
+ )
89
+ account_type_names.should_not include(
90
+ "AccountsPayable",
91
+ "Suspense"
92
+ )
93
+ end
94
+
95
+ it 'returns an empty Array when no records are found' do
96
+ results = client.get_records('AccountAccountType', {:where => "AccountTypeName like 'SomeNonExistingName!'"})
97
+ results.should eq([])
98
+ end
99
+ end
100
+
101
+ describe '#get_record' do
102
+ it "returns a single record" do
103
+ result = client.get_record('AccountAccountType', {:where => "AccountTypeName like 'CostOfGoodsSold'"})
104
+ result['AccountTypeName'].should eq('CostOfGoodsSold')
105
+ end
106
+
107
+ it "raises an error if more than one record is found" do
108
+ expect {
109
+ client.get_record('AccountAccountType',
110
+ {:where => "AccountTypeName like 'Other%'"}
111
+ )
112
+ }.to raise_error(MethodCrmClientError, 'Query returned more than one record')
113
+ end
16
114
  end
17
115
  end
@@ -1,4 +1,19 @@
1
+ require 'bundler/setup'
1
2
  require 'method_crm'
3
+ require 'vcr'
4
+
2
5
  CONFIG = YAML.load_file(File.expand_path('../support/config.yml', __FILE__))
6
+ Dir[File.expand_path('../support/**/*.rb', __FILE__)].each{|f| require f }
7
+
8
+ RSpec.configure do |c|
9
+ c.extend VCR::RSpec::Macros
10
+ end
3
11
 
4
- Dir[File.expand_path('../support/**/*.rb', __FILE__)].each{|f| require f }
12
+ VCR.config do |c|
13
+ c.default_cassette_options = {
14
+ :record => :new_episodes,
15
+ :match_requests_on => [:method, :uri, :body]
16
+ }
17
+ c.stub_with :webmock
18
+ c.cassette_library_dir = 'spec/support/cassettes'
19
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: method_crm
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.1.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-10-29 00:00:00.000000000 Z
12
+ date: 2012-12-14 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rest-client
@@ -66,7 +66,7 @@ dependencies:
66
66
  requirements:
67
67
  - - ~>
68
68
  - !ruby/object:Gem::Version
69
- version: '2.11'
69
+ version: '2.12'
70
70
  type: :development
71
71
  prerelease: false
72
72
  version_requirements: !ruby/object:Gem::Requirement
@@ -74,7 +74,39 @@ dependencies:
74
74
  requirements:
75
75
  - - ~>
76
76
  - !ruby/object:Gem::Version
77
- version: '2.11'
77
+ version: '2.12'
78
+ - !ruby/object:Gem::Dependency
79
+ name: vcr
80
+ requirement: !ruby/object:Gem::Requirement
81
+ none: false
82
+ requirements:
83
+ - - ~>
84
+ - !ruby/object:Gem::Version
85
+ version: 1.6.0
86
+ type: :development
87
+ prerelease: false
88
+ version_requirements: !ruby/object:Gem::Requirement
89
+ none: false
90
+ requirements:
91
+ - - ~>
92
+ - !ruby/object:Gem::Version
93
+ version: 1.6.0
94
+ - !ruby/object:Gem::Dependency
95
+ name: webmock
96
+ requirement: !ruby/object:Gem::Requirement
97
+ none: false
98
+ requirements:
99
+ - - ~>
100
+ - !ruby/object:Gem::Version
101
+ version: 1.6.0
102
+ type: :development
103
+ prerelease: false
104
+ version_requirements: !ruby/object:Gem::Requirement
105
+ none: false
106
+ requirements:
107
+ - - ~>
108
+ - !ruby/object:Gem::Version
109
+ version: 1.6.0
78
110
  description: A ruby wrapper for the MethodCRM API
79
111
  email: toreyheinz@gmail.com
80
112
  executables: []
@@ -82,6 +114,7 @@ extensions: []
82
114
  extra_rdoc_files: []
83
115
  files:
84
116
  - .gitignore
117
+ - .rspec
85
118
  - Gemfile
86
119
  - LICENSE
87
120
  - README.md
@@ -105,7 +138,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
105
138
  version: '0'
106
139
  segments:
107
140
  - 0
108
- hash: 2400250086319970818
141
+ hash: -2740670062730519801
109
142
  required_rubygems_version: !ruby/object:Gem::Requirement
110
143
  none: false
111
144
  requirements:
@@ -114,7 +147,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
114
147
  version: '0'
115
148
  segments:
116
149
  - 0
117
- hash: 2400250086319970818
150
+ hash: -2740670062730519801
118
151
  requirements: []
119
152
  rubyforge_project:
120
153
  rubygems_version: 1.8.24