ofx-parser 1.0.2 → 1.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.
File without changes
@@ -1,3 +1,8 @@
1
+ == 1.1.0
2
+
3
+ * Works on Ruby 1.9! (Reported by Tim Holmes)
4
+ * Fix time parsing with positive TZ offsets. (libkazz)
5
+
1
6
  == 1.0.2
2
7
 
3
8
  * Fixed error when header fields were empty. (steveg0493)
@@ -2,7 +2,6 @@ History.txt
2
2
  Manifest.txt
3
3
  README.txt
4
4
  Rakefile
5
- lib/class-extension.rb
6
5
  lib/mcc.rb
7
6
  lib/ofx-parser.rb
8
7
  lib/ofx.rb
@@ -1,13 +1,14 @@
1
+ require 'rubygems'
1
2
  require 'hpricot'
2
3
  require 'time'
3
4
  require 'date'
4
5
 
5
- %w(class-extension ofx mcc).each do |fn|
6
+ %w(ofx mcc).each do |fn|
6
7
  require File.dirname(__FILE__) + "/#{fn}"
7
8
  end
8
9
 
9
10
  module OfxParser
10
- VERSION = '1.0.2'
11
+ VERSION = '1.1.0'
11
12
 
12
13
  class OfxParser
13
14
 
@@ -55,10 +56,10 @@ module OfxParser
55
56
  # Returns a DateTime object. Milliseconds (XXX) are ignored.
56
57
  def self.parse_datetime(date)
57
58
  if /\A\s*
58
- (\d{4})(\d{2})(\d{2}) ?# YYYYMMDD 1,2,3
59
- (?:(\d{2})(\d{2})(\d{2}))? ?# HHMMSS - optional 4,5,6
60
- (?:\.(\d{3}))? ?# .XXX - optional 7
61
- (?:\[(-?\d+)\:\w{3}\])? ?# [-n:TZ] - optional 8,9
59
+ (\d{4})(\d{2})(\d{2}) # YYYYMMDD 1,2,3
60
+ (?:(\d{2})(\d{2})(\d{2}))? # HHMMSS - optional 4,5,6
61
+ (?:\.(\d{3}))? # .XXX - optional 7
62
+ (?:\[([-+]?[\.\d]+)\:\w{3}\])? # [-n:TZ] - optional 8,9
62
63
  \s*\z/ix =~ date
63
64
  year = $1.to_i
64
65
  mon = $2.to_i
data/lib/ofx.rb CHANGED
@@ -1,14 +1,15 @@
1
1
  module OfxParser
2
- module MonetarySupport
2
+ module MonetaryClassSupport
3
3
 
4
- @@monies ||= []
4
+ attr_accessor :monies
5
5
 
6
- class_extension do
7
- def monetary_vars(*methods) #:nodoc:
8
- @@monies += methods
9
- end
6
+ def monetary_vars(*methods) #:nodoc:
7
+ self.monies ||= []
8
+ self.monies += methods
10
9
  end
10
+ end
11
11
 
12
+ module MonetarySupport
12
13
  # Returns pennies for a given string amount, i.e:
13
14
  # '-123.45' => -12345
14
15
  # '123' => 12300
@@ -25,7 +26,7 @@ module OfxParser
25
26
 
26
27
  def monetary_method_call?(meth) #:nodoc:
27
28
  orig = original_method(meth)
28
- @@monies.include?(orig) && meth.to_s == "#{orig}_in_pennies"
29
+ self.class.monies.include?(orig) && meth.to_s == "#{orig}_in_pennies"
29
30
  end
30
31
 
31
32
  def method_missing(meth, *args) #:nodoc:
@@ -69,14 +70,15 @@ module OfxParser
69
70
  end
70
71
 
71
72
  class Account
72
- attr_accessor :number, :statement, :transaction_uid
73
+ attr_accessor :number, :statement, :transaction_uid, :routing_number
73
74
  end
74
75
 
75
76
  class BankAccount < Account
76
77
  TYPE = [:CHECKING, :SAVINGS, :MONEYMRKT, :CREDITLINE]
77
- attr_accessor :routing_number, :type, :balance, :balance_date
78
+ attr_accessor :type, :balance, :balance_date
78
79
 
79
80
  include MonetarySupport
81
+ extend MonetaryClassSupport
80
82
  monetary_vars :balance
81
83
 
82
84
  undef type
@@ -89,6 +91,7 @@ module OfxParser
89
91
  attr_accessor :remaining_credit, :remaining_credit_date, :balance, :balance_date
90
92
 
91
93
  include MonetarySupport
94
+ extend MonetaryClassSupport
92
95
  monetary_vars :remaining_credit, :balance
93
96
  end
94
97
 
@@ -96,6 +99,7 @@ module OfxParser
96
99
  attr_accessor :broker_id, :positions, :margin_balance, :short_balance, :cash_balance
97
100
 
98
101
  include MonetarySupport
102
+ extend MonetaryClassSupport
99
103
  monetary_vars :margin_balance, :short_balance, :cash_balance
100
104
  end
101
105
 
@@ -108,6 +112,7 @@ module OfxParser
108
112
  attr_accessor :type, :date, :amount, :fit_id, :check_number, :sic, :memo, :payee
109
113
 
110
114
  include MonetarySupport
115
+ extend MonetaryClassSupport
111
116
  monetary_vars :amount
112
117
 
113
118
  TYPE = {
@@ -14,7 +14,7 @@ class OfxParserTest < Test::Unit::TestCase
14
14
  ofx = File.read(fixtures_dir + "/#{fn}")
15
15
  ofx.gsub!(/\r?\n/,"\r\n") # change line endings to \r\n
16
16
 
17
- OFX_FILES[fn.scan(/^[^.]*/).to_s.to_sym] = ofx
17
+ OFX_FILES[fn.scan(/\w+/).first.to_sym] = ofx
18
18
  end
19
19
 
20
20
  def setup
@@ -39,6 +39,7 @@ class OfxParserTest < Test::Unit::TestCase
39
39
 
40
40
  def test_parse_datetime
41
41
  assert_equal DateTime.civil(2007, 6, 22, 19, 0, 0, Rational(-5,24)), @parser.parse_datetime('20070622190000.200[-5:CDT]')
42
+ assert_equal DateTime.civil(2007, 6, 22, 19, 0, 0, Rational(9,24)), @parser.parse_datetime('20070622190000.200[+9.0:JST]')
42
43
  assert_equal DateTime.civil(2007, 6, 22), @parser.parse_datetime('20070622')
43
44
  assert_equal DateTime.civil(2007, 6, 22, 19, 0, 0), @parser.parse_datetime('20070622190000')
44
45
  assert_equal DateTime.civil(2007, 6, 22, 19, 0, 0), @parser.parse_datetime('20070622190000.200')
@@ -229,6 +230,7 @@ class OfxParserTest < Test::Unit::TestCase
229
230
 
230
231
  class X
231
232
  include OfxParser::MonetarySupport
233
+ extend OfxParser::MonetaryClassSupport
232
234
  attr_accessor :amount
233
235
  monetary_vars :amount
234
236
  end
metadata CHANGED
@@ -1,51 +1,58 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: ofx-parser
3
- version: !ruby/object:Gem::Version
4
- version: 1.0.2
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.1.0
5
+ prerelease:
5
6
  platform: ruby
6
- authors:
7
+ authors:
7
8
  - Andrew A. Smith
8
9
  autorequire:
9
10
  bindir: bin
10
11
  cert_chain: []
11
-
12
- date: 2008-05-12 00:00:00 -07:00
13
- default_executable:
14
- dependencies:
15
- - !ruby/object:Gem::Dependency
12
+ date: 2011-12-12 00:00:00.000000000Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
16
15
  name: hpricot
17
- version_requirement:
18
- version_requirements: !ruby/object:Gem::Requirement
19
- requirements:
20
- - - ">="
21
- - !ruby/object:Gem::Version
22
- version: "0.6"
23
- version:
24
- - !ruby/object:Gem::Dependency
16
+ requirement: &2159585980 !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0.6'
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: *2159585980
25
+ - !ruby/object:Gem::Dependency
25
26
  name: hoe
26
- version_requirement:
27
- version_requirements: !ruby/object:Gem::Requirement
28
- requirements:
29
- - - ">="
30
- - !ruby/object:Gem::Version
31
- version: 1.5.1
32
- version:
33
- description: "== DESCRIPTION: ofx-parser is a ruby library to parse a realistic subset of the lengthy OFX 1.x specification. == FEATURES/PROBLEMS: * Reads OFX responses - i.e. those downloaded from financial institutions and puts it into a usable object graph. * Supports the 3 main message sets: banking, credit card and investment accounts, as well as the required 'sign on' set. * Knows about SIC codes - if your institution provides them. See http://www.eeoc.gov/stats/jobpat/siccodes.html * Monetary amounts can be retrieved either as a raw string, or in pennies. * Supports OFX timestamps."
27
+ requirement: &2159585560 !ruby/object:Gem::Requirement
28
+ none: false
29
+ requirements:
30
+ - - ~>
31
+ - !ruby/object:Gem::Version
32
+ version: '2.12'
33
+ type: :development
34
+ prerelease: false
35
+ version_requirements: *2159585560
36
+ description: ! "== DESCRIPTION:\n\nofx-parser is a ruby library to parse a realistic
37
+ subset of the lengthy OFX 1.x specification.\n\n== FEATURES/PROBLEMS:\n\n* Reads
38
+ OFX responses - i.e. those downloaded from financial institutions and\n puts it
39
+ into a usable object graph.\n* Supports the 3 main message sets: banking, credit
40
+ card and investment\n accounts, as well as the required 'sign on' set.\n* Knows
41
+ about SIC codes - if your institution provides them.\n See http://www.eeoc.gov/stats/jobpat/siccodes.html\n*
42
+ Monetary amounts can be retrieved either as a raw string, or in pennies.\n* Supports
43
+ OFX timestamps."
34
44
  email: andy@tinnedfruit.org
35
45
  executables: []
36
-
37
46
  extensions: []
38
-
39
- extra_rdoc_files:
47
+ extra_rdoc_files:
40
48
  - History.txt
41
49
  - Manifest.txt
42
50
  - README.txt
43
- files:
51
+ files:
44
52
  - History.txt
45
53
  - Manifest.txt
46
54
  - README.txt
47
55
  - Rakefile
48
- - lib/class-extension.rb
49
56
  - lib/mcc.rb
50
57
  - lib/ofx-parser.rb
51
58
  - lib/ofx.rb
@@ -55,32 +62,32 @@ files:
55
62
  - test/fixtures/malformed_header.ofx.sgml
56
63
  - test/fixtures/with_spaces.ofx.sgml
57
64
  - test/test_ofx_parser.rb
58
- has_rdoc: true
65
+ - .gemtest
59
66
  homepage: http://ofx-parser.rubyforge.org/
67
+ licenses: []
60
68
  post_install_message:
61
- rdoc_options:
69
+ rdoc_options:
62
70
  - --main
63
71
  - README.txt
64
- require_paths:
72
+ require_paths:
65
73
  - lib
66
- required_ruby_version: !ruby/object:Gem::Requirement
67
- requirements:
68
- - - ">="
69
- - !ruby/object:Gem::Version
70
- version: "0"
71
- version:
72
- required_rubygems_version: !ruby/object:Gem::Requirement
73
- requirements:
74
- - - ">="
75
- - !ruby/object:Gem::Version
76
- version: "0"
77
- version:
74
+ required_ruby_version: !ruby/object:Gem::Requirement
75
+ none: false
76
+ requirements:
77
+ - - ! '>='
78
+ - !ruby/object:Gem::Version
79
+ version: '0'
80
+ required_rubygems_version: !ruby/object:Gem::Requirement
81
+ none: false
82
+ requirements:
83
+ - - ! '>='
84
+ - !ruby/object:Gem::Version
85
+ version: '0'
78
86
  requirements: []
79
-
80
87
  rubyforge_project: ofx-parser
81
- rubygems_version: 1.1.0
88
+ rubygems_version: 1.8.10
82
89
  signing_key:
83
- specification_version: 2
90
+ specification_version: 3
84
91
  summary: ofx-parser is a ruby library for parsing OFX 1.x data.
85
- test_files:
92
+ test_files:
86
93
  - test/test_ofx_parser.rb
@@ -1,154 +0,0 @@
1
- # = class_extension.rb
2
- #
3
- # == Copyright (c) 2006 Daniel Schierbeck
4
- #
5
- # Ruby License
6
- #
7
- # This module is free software. You may use, modify, and/or redistribute this
8
- # software under the same terms as Ruby.
9
- #
10
- # This program is distributed in the hope that it will be useful, but WITHOUT
11
- # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
12
- # FOR A PARTICULAR PURPOSE.
13
- #
14
- # == Special Thanks
15
- #
16
- # Thanks to Trans, Nobu and Ulysses for their original on this concept.
17
- #
18
- # == Authors and Contributors
19
- #
20
- # * Daniel Schierbeck
21
- # * Thomas Sawyer
22
- # * Nobu Nakada
23
- # * Ulysses
24
-
25
- # Author:: Daniel Schierbeck
26
- # Copyright:: Copyright (c) 2006 Daniel Schierbeck
27
- # License:: Ruby License
28
-
29
- #
30
-
31
- class Module #:nodoc: all
32
-
33
- alias_method :append_features_without_class_extension, :append_features
34
-
35
- # = class_extension
36
- #
37
- # Normally when including modules, class/module methods are not
38
- # extended. To achieve this behavior requires some clever
39
- # Ruby Karate. Instead class_extension provides an easy to use
40
- # and clean solution. Simply place the extending class methods
41
- # in a block of the special module method #class_extension.
42
- #
43
- # module Mix
44
- # def inst_meth
45
- # puts 'inst_meth'
46
- # end
47
- #
48
- # class_extension do
49
- # def class_meth
50
- # "Class Method!"
51
- # end
52
- # end
53
- # end
54
- #
55
- # class X
56
- # include Mix
57
- # end
58
- #
59
- # X.class_meth #=> "Class Method!"
60
- #
61
-
62
- def class_extension(&block)
63
- @class_extension ||= Module.new do
64
- def self.append_features(mod)
65
- append_features_without_class_extension(mod)
66
- end
67
- end
68
- @class_extension.module_eval(&block) if block_given?
69
- @class_extension
70
- end
71
-
72
- private :class_extension
73
-
74
- def append_features(mod)
75
- append_features_without_class_extension(mod)
76
- mod.extend(class_extension)
77
- if mod.instance_of? Module
78
- mod.__send__(:class_extension).__send__(:include, class_extension)
79
- end
80
- end
81
-
82
- end
83
-
84
- class Class #:nodoc: all
85
- undef_method :class_extension
86
- end
87
-
88
-
89
-
90
- # _____ _
91
- # |_ _|__ ___| |_
92
- # | |/ _ \/ __| __|
93
- # | | __/\__ \ |_
94
- # |_|\___||___/\__|
95
- #
96
-
97
- =begin test
98
-
99
- require 'test/unit'
100
-
101
- class TC_ClassMethods < Test::Unit::TestCase
102
-
103
- # fixture
104
-
105
- module N
106
- class_extension do
107
- def n ; 43 ; end
108
- def s ; self ; end
109
- end
110
- extend class_extension
111
- end
112
-
113
- class X
114
- include N
115
- def n ; 11 ; end
116
- end
117
-
118
- module K
119
- include N
120
- class_extension do
121
- def n ; super + 1 ; end
122
- end
123
- end
124
-
125
- class Z
126
- include K
127
- end
128
-
129
- # tests
130
-
131
- def test_01
132
- assert_equal( 43, N.n )
133
- assert_equal( N, N.s )
134
- end
135
- def test_02
136
- assert_equal( 43, X.n )
137
- assert_equal( X, X.s )
138
- end
139
- def test_03
140
- assert_equal( 11, X.new.n )
141
- end
142
- def test_04
143
- assert_equal( 43, K.n ) #notic the difference!
144
- assert_equal( K, K.s )
145
- end
146
- def test_05
147
- assert_equal( 44, Z.n )
148
- assert_equal( Z, Z.s )
149
- end
150
-
151
- end
152
-
153
- =end
154
-