kelredd-wesabe 0.0.2 → 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/Rakefile +2 -3
- data/lib/wesabe/exceptions.rb +0 -4
- data/lib/wesabe/model/account.rb +6 -6
- data/lib/wesabe/model/base.rb +11 -116
- data/lib/wesabe/model/institution.rb +1 -1
- data/lib/wesabe/model/merchant.rb +1 -1
- data/lib/wesabe/model/txaction.rb +4 -6
- data/lib/wesabe/version.rb +2 -2
- data/lib/wesabe.rb +6 -3
- metadata +5 -17
- data/lib/wesabe/configuration.rb +0 -5
- data/lib/wesabe/extensions.rb +0 -60
data/Rakefile
CHANGED
@@ -19,8 +19,7 @@ spec = Gem::Specification.new do |s|
|
|
19
19
|
s.files = %w(README.rdoc Rakefile) + Dir.glob("{lib,test}/**/*")
|
20
20
|
# s.executables = ['wesabe']
|
21
21
|
|
22
|
-
s.add_dependency('
|
23
|
-
s.add_dependency('rest-client', '> 0.9.2')
|
22
|
+
s.add_dependency('kelredd-resourceful', '>= 0.3.0')
|
24
23
|
end
|
25
24
|
|
26
25
|
Rake::GemPackageTask.new(spec) do |pkg|
|
@@ -34,7 +33,7 @@ Rake::TestTask.new do |t|
|
|
34
33
|
end
|
35
34
|
|
36
35
|
desc 'Generate the gemspec to serve this Gem from Github'
|
37
|
-
task :
|
36
|
+
task :gemspec do
|
38
37
|
file = File.dirname(__FILE__) + "/#{spec.name}.gemspec"
|
39
38
|
File.open(file, 'w') {|f| f << spec.to_ruby }
|
40
39
|
puts "Created gemspec: #{file}"
|
data/lib/wesabe/exceptions.rb
CHANGED
data/lib/wesabe/model/account.rb
CHANGED
@@ -9,21 +9,21 @@ module Wesabe
|
|
9
9
|
def self.find(id)
|
10
10
|
case id
|
11
11
|
when :all
|
12
|
-
|
12
|
+
get_collection("/accounts", {}, "//accounts/account")
|
13
13
|
else
|
14
|
-
|
14
|
+
get("/accounts/#{id}", {}, "//account")
|
15
15
|
end
|
16
16
|
end
|
17
17
|
|
18
|
-
attribute :id, :integer
|
18
|
+
attribute :id, :integer
|
19
19
|
attribute :key, :string, :path => "guid"
|
20
20
|
attribute :number, :string, :path => "account-number"
|
21
|
-
attribute :name, :string
|
21
|
+
attribute :name, :string
|
22
22
|
attribute :account_type, :string, :path => "account-type"
|
23
23
|
attribute :balance, :float, :path => "current-balance"
|
24
24
|
attribute :last_uploaded_at, :datetime, :path => "last-uploaded-at"
|
25
|
-
attribute :
|
26
|
-
attribute :
|
25
|
+
attribute :oldest_txaction_on, :date, :path => "oldest-txaction"
|
26
|
+
attribute :newest_txaction_on, :date, :path => "newest-txaction"
|
27
27
|
|
28
28
|
def institution
|
29
29
|
@institution ||= Wesabe::Model::Institution.new(get_node('./financial-institution'))
|
data/lib/wesabe/model/base.rb
CHANGED
@@ -1,136 +1,31 @@
|
|
1
|
-
%w(rubygems rest_client nokogiri).each do |lib|
|
2
|
-
require lib
|
3
|
-
end
|
4
|
-
%w(configuration exceptions extensions).each do |file|
|
5
|
-
require File.join(File.dirname(__FILE__), "..", "#{file}.rb")
|
6
|
-
end
|
7
|
-
|
8
1
|
module Wesabe
|
9
2
|
module Model
|
10
|
-
|
11
|
-
class Base
|
12
|
-
@@user = nil
|
13
|
-
@@password = nil
|
14
|
-
@@content_type = Wesabe::API_DEFAULT_CONTENT_TYPE
|
15
|
-
|
16
|
-
def self.resource
|
17
|
-
RestClient::Resource.new(Wesabe::API_SITE, :user => @@user, :password => @@password, :content_type => @@content_type)
|
18
|
-
end
|
19
|
-
@@api = resource
|
20
|
-
@@api_cache = {}
|
3
|
+
class Base < Resourceful::Model::Xml
|
21
4
|
|
22
|
-
attr_reader :xml
|
23
|
-
|
24
5
|
def self.configure(opts={})
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
@@api = resource
|
6
|
+
raise Wesabe::NotConfigured, "No user provided to access the Wesabe API" if blank?(opts[:user])
|
7
|
+
raise Wesabe::NotConfigured, "No password provided to access the Wesabe API" if blank?(opts[:password])
|
8
|
+
agent RestClient::Resource.new('https://www.wesabe.com', :user => opts[:user], :password => opts[:password])
|
29
9
|
end
|
30
10
|
|
31
|
-
def self.find(path, xpath)
|
32
|
-
new(get_xml(path).xpath(xpath))
|
33
|
-
end
|
34
|
-
def self.find_collection(path, xpath)
|
35
|
-
get_xml(path).xpath(xpath).collect{|item_xml| new(item_xml)}
|
36
|
-
end
|
37
|
-
|
38
|
-
def initialize(xml)
|
39
|
-
@xml = xml
|
40
|
-
end
|
41
|
-
|
42
11
|
protected
|
43
|
-
|
44
|
-
def self.get_xml(path)
|
45
|
-
self.resource_xml(:get, path)
|
46
|
-
end
|
47
|
-
def self.resource_xml(verb, path, force=false)
|
48
|
-
summary = "#{verb.to_s.upcase} #{@@api.url}#{path}"
|
49
|
-
key = cache_key(verb, path)
|
50
|
-
begin
|
51
|
-
resp = @@api_cache[key]
|
52
|
-
if resp.nil? || force
|
53
|
-
base_config_check
|
54
|
-
p "** Wesabe API: #{summary}"
|
55
|
-
resp = case verb.to_sym
|
56
|
-
when :get
|
57
|
-
@@api["#{path}"].get
|
58
|
-
end
|
59
|
-
@@api_cache[key] = resp
|
60
|
-
else
|
61
|
-
p "** Wesabe API: [cache] #{summary}."
|
62
|
-
end
|
63
|
-
rescue Exception => err
|
64
|
-
raise Wesabe::ResourceAPIError, "error with API resource: #{summary}: #{err.message}"
|
65
|
-
end
|
66
|
-
begin
|
67
|
-
xml = Nokogiri::XML(resp.to_s)
|
68
|
-
rescue Exception => err
|
69
|
-
raise Wesabe::ResourceParseError, "error parsing API resource [#{@@content_type}]: #{summary}: #{err.message}: Response: #{resp.to_s}"
|
70
|
-
end
|
71
|
-
xml
|
72
|
-
end
|
73
12
|
|
74
|
-
def self.
|
75
|
-
raise Wesabe::NotConfigured, "
|
76
|
-
|
77
|
-
when :string
|
78
|
-
'to_s'
|
79
|
-
when :integer
|
80
|
-
'to_i'
|
81
|
-
when :float
|
82
|
-
'to_f'
|
83
|
-
when :date
|
84
|
-
'to_date'
|
85
|
-
when :datetime
|
86
|
-
'to_datetime'
|
87
|
-
else
|
88
|
-
'to_s'
|
89
|
-
end
|
90
|
-
define_method(name) do
|
91
|
-
instance_variable_get("@#{name}") || instance_variable_set("@#{name}", get_node("./#{config[:path]}").content.send(content_method))
|
92
|
-
end
|
93
|
-
end
|
94
|
-
def self.get_node(xml, path)
|
95
|
-
xml.xpath(path.to_s).first
|
96
|
-
end
|
97
|
-
def get_node(path)
|
98
|
-
self.class.get_node(@xml, path)
|
13
|
+
def self.get(resource, params, xpath)
|
14
|
+
raise Wesabe::NotConfigured, "Wesabe not configured to access the API." if blank?(@agent)
|
15
|
+
super(resource, params, xpath)
|
99
16
|
end
|
100
17
|
|
101
|
-
def self.
|
102
|
-
|
103
|
-
|
104
|
-
def xml_root_name
|
105
|
-
self.class.xml_root_name(@xml)
|
18
|
+
def self.get_collection(resource, params, xpath)
|
19
|
+
raise Wesabe::NotConfigured, "Wesabe not configured to access the API." if blank?(@agent)
|
20
|
+
super(resource, params, xpath)
|
106
21
|
end
|
107
22
|
|
108
|
-
|
109
|
-
"#{verb}_#{path}"
|
110
|
-
end
|
23
|
+
private
|
111
24
|
|
112
|
-
def self.clear_cache
|
113
|
-
@@api_cache = {}
|
114
|
-
end
|
115
|
-
|
116
|
-
def self.base_config_check
|
117
|
-
raise Wesabe::NotConfigured, "No user provided to access the Wesabe API" if blank?(@@user)
|
118
|
-
raise Wesabe::NotConfigured, "No password provided to access the Wesabe API" if blank?(@@password)
|
119
|
-
raise Wesabe::NotConfigured, "Wesabe not configured to access the API." if blank?(@@api)
|
120
|
-
end
|
121
|
-
def base_config_check
|
122
|
-
self.class.base_config_check
|
123
|
-
end
|
124
|
-
|
125
25
|
def self.blank?(value)
|
126
26
|
value.nil? || (value.respond_to?('empty?') ? value.empty? : false)
|
127
27
|
end
|
128
|
-
def blank?(value)
|
129
|
-
self.class.blank?(value)
|
130
|
-
end
|
131
|
-
|
132
28
|
|
133
29
|
end
|
134
|
-
|
135
30
|
end
|
136
31
|
end
|
@@ -8,20 +8,18 @@ module Wesabe
|
|
8
8
|
|
9
9
|
def self.find(opts={})
|
10
10
|
acct = opts.delete(:account)
|
11
|
-
|
12
|
-
path += opts.to_http_query_str if opts.respond_to?('to_http_query_str')
|
13
|
-
find_collection(path, "//txactions/txaction")
|
11
|
+
get_collection((acct ? "/accounts/#{acct.to_s}" : "/transactions"), opts, "//txactions/txaction")
|
14
12
|
end
|
15
13
|
|
16
14
|
attribute :key, :string, :path => "guid"
|
17
15
|
attribute :account_id, :string, :path => "account-id"
|
18
|
-
attribute :date, :date
|
16
|
+
attribute :date, :date
|
19
17
|
attribute :original_date, :date, :path => "original-date"
|
20
|
-
attribute :amount, :float
|
18
|
+
attribute :amount, :float
|
21
19
|
attribute :display_name, :string, :path => "display-name"
|
22
20
|
attribute :raw_name, :string, :path => "raw-name"
|
23
21
|
attribute :raw_type, :string, :path => "raw-txntype"
|
24
|
-
attribute :memo, :string
|
22
|
+
attribute :memo, :string
|
25
23
|
attribute :transfer_key, :string, :path => "transfer/guid"
|
26
24
|
|
27
25
|
def account
|
data/lib/wesabe/version.rb
CHANGED
data/lib/wesabe.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: kelredd-wesabe
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 0.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Kelly Redding
|
@@ -9,28 +9,18 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2009-
|
12
|
+
date: 2009-07-24 00:00:00 -07:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
|
-
name:
|
16
|
+
name: kelredd-resourceful
|
17
17
|
type: :runtime
|
18
18
|
version_requirement:
|
19
19
|
version_requirements: !ruby/object:Gem::Requirement
|
20
20
|
requirements:
|
21
|
-
- - "
|
21
|
+
- - ">="
|
22
22
|
- !ruby/object:Gem::Version
|
23
|
-
version:
|
24
|
-
version:
|
25
|
-
- !ruby/object:Gem::Dependency
|
26
|
-
name: rest-client
|
27
|
-
type: :runtime
|
28
|
-
version_requirement:
|
29
|
-
version_requirements: !ruby/object:Gem::Requirement
|
30
|
-
requirements:
|
31
|
-
- - ">"
|
32
|
-
- !ruby/object:Gem::Version
|
33
|
-
version: 0.9.2
|
23
|
+
version: 0.3.0
|
34
24
|
version:
|
35
25
|
description:
|
36
26
|
email: kelly@kelredd.com
|
@@ -44,9 +34,7 @@ files:
|
|
44
34
|
- README.rdoc
|
45
35
|
- Rakefile
|
46
36
|
- lib/wesabe
|
47
|
-
- lib/wesabe/configuration.rb
|
48
37
|
- lib/wesabe/exceptions.rb
|
49
|
-
- lib/wesabe/extensions.rb
|
50
38
|
- lib/wesabe/model
|
51
39
|
- lib/wesabe/model/account.rb
|
52
40
|
- lib/wesabe/model/base.rb
|
data/lib/wesabe/configuration.rb
DELETED
data/lib/wesabe/extensions.rb
DELETED
@@ -1,60 +0,0 @@
|
|
1
|
-
require 'cgi'
|
2
|
-
|
3
|
-
module Wesabe
|
4
|
-
module Extensions
|
5
|
-
module String
|
6
|
-
|
7
|
-
module ClassMethods; end
|
8
|
-
def self.included(klass)
|
9
|
-
klass.extend(ClassMethods) if klass.kind_of?(Class)
|
10
|
-
end
|
11
|
-
|
12
|
-
module ClassMethods
|
13
|
-
end
|
14
|
-
|
15
|
-
def to_datetime
|
16
|
-
DateTime.strptime(self) rescue nil
|
17
|
-
end
|
18
|
-
def to_date
|
19
|
-
Date.strptime(self) rescue nil
|
20
|
-
end
|
21
|
-
|
22
|
-
end
|
23
|
-
end
|
24
|
-
end
|
25
|
-
|
26
|
-
module Wesabe
|
27
|
-
module Extensions
|
28
|
-
module Hash
|
29
|
-
|
30
|
-
module ClassMethods; end
|
31
|
-
def self.included(klass)
|
32
|
-
klass.extend(ClassMethods) if klass.kind_of?(Class)
|
33
|
-
end
|
34
|
-
|
35
|
-
module ClassMethods
|
36
|
-
end
|
37
|
-
|
38
|
-
# Returns string formatted for HTTP URL encoded name-value pairs.
|
39
|
-
# For example,
|
40
|
-
# {:id => 'thomas_hardy'}.to_http_str
|
41
|
-
# # => "id=thomas_hardy"
|
42
|
-
# {:id => 23423, :since => Time.now}.to_http_str
|
43
|
-
# # => "since=Thu,%2021%20Jun%202007%2012:10:05%20-0500&id=23423"
|
44
|
-
def to_http_query_str(opts = {})
|
45
|
-
opts[:prepend] ||= '?'
|
46
|
-
opts[:append] ||= ''
|
47
|
-
self.empty? ? '' : "#{opts[:prepend]}#{self.collect{|key, val| "#{key.to_s}=#{CGI.escape(val.to_s)}"}.join('&')}#{opts[:append]}"
|
48
|
-
end
|
49
|
-
|
50
|
-
end
|
51
|
-
end
|
52
|
-
end
|
53
|
-
|
54
|
-
class String
|
55
|
-
include Wesabe::Extensions::String
|
56
|
-
end
|
57
|
-
|
58
|
-
class Hash
|
59
|
-
include Wesabe::Extensions::Hash
|
60
|
-
end
|