method_crm 0.0.1 → 0.1.0

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