firstdirect 0.1 → 0.2

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.
Files changed (4) hide show
  1. data/README.txt +7 -13
  2. data/Rakefile +2 -0
  3. data/lib/firstdirect.rb +65 -6
  4. metadata +2 -2
data/README.txt CHANGED
@@ -5,21 +5,15 @@ Internet banking with First Direct using Ruby.
5
5
  A FirstDirect object will log into First Direct's website and create some
6
6
  Account objects for each account listed on the first page after login.
7
7
 
8
- Please see the RDoc / source code for further information about firstdirect.rb!
9
-
10
- == BUGS
11
-
12
- * Downloading of credit card account statements "doesn't work".
13
-
14
- firstdirect.rb:51:in `strip_js': undefined method `[]' for nil:NilClass (NoMethodError)
15
-
16
- * Downloading statements for 'Everyday e-Saver' fails with "no date_form found".
17
-
18
- * Downloading "Regular Saver" account information often returns 'rubbish':
19
-
20
- data downloaded looks like rubbish: <!--Build:19.01.0004-
8
+ You can install +firstdirect+ using +gem+ (the gem is called 'firstdirect') or
9
+ {download it}[http://rubyforge.org/frs/?group_id=6595]
10
+ from from the
11
+ {Rubyforge project}[http://rubyforge.org/projects/firstdirec/].
21
12
 
13
+ See the FirstDirect module for further information.
22
14
 
23
15
  == LICENSE
24
16
 
17
+ Copyright (c) Edward Speyer, 2008
18
+
25
19
  This code is licensed under the terms of the GPL version 2.
data/Rakefile CHANGED
@@ -4,6 +4,8 @@ require 'rubygems'
4
4
  require 'hoe'
5
5
  require './lib/firstdirect.rb'
6
6
 
7
+ ENV['NODOT'] = '1'
8
+
7
9
  Hoe.new('firstdirect', FirstDirect::VERSION) do |p|
8
10
  p.remote_rdoc_dir = '/'
9
11
  p.developer('Edward Speyer', 'edward.rffd@example.com')
@@ -26,6 +26,17 @@ Each Account has a name, number, and balance.
26
26
  #=> 1st Account (10-20-30 10000000): £100.00
27
27
 
28
28
 
29
+ You can fetch an Account's recent activity (as parsed from the HTML of the
30
+ account page on the First Direct website) as a CSV string or an Array:
31
+
32
+ puts account.recent_statement_csv
33
+ #=> date,details,paid out,paid in,balance,?
34
+ # 08/07/2008,TROTTER R *FRS REGULAR SAVER,100.00,"",100.00,""
35
+
36
+ # Get an array instead:
37
+ account.recent_statement_array
38
+
39
+
29
40
  An Account can also download statements in CSV format:
30
41
 
31
42
  account.download
@@ -48,9 +59,11 @@ An Account can also download statements in CSV format:
48
59
  # T100.00
49
60
 
50
61
 
62
+ Copyright (c) Edward Speyer, 2008
63
+
51
64
  =end
52
65
  class FirstDirect
53
- VERSION = '0.1'
66
+ VERSION = '0.2'
54
67
 
55
68
  require 'rubygems'
56
69
  require 'mechanize'
@@ -220,13 +233,60 @@ class FirstDirect
220
233
  def to_s
221
234
  "#{name} (#{number}): #{balance}"
222
235
  end
223
-
236
+
224
237
  #
225
- # Go to the mini-statement page for this account, which we'll need to do
238
+ # Go to the recent-statement page for this account, which we'll need to do
226
239
  # statement downloading.
227
240
  #
228
- def page
229
- trace('getting account page'){ parent.agent.get(link) }
241
+ # The page is cached -- if you want to force an update:
242
+ #
243
+ # account.page(:update => true)
244
+ #
245
+ #--
246
+ #
247
+ # This is a lazy accessor for @__page. Please don't use @__page directly!
248
+ # In fact, I think I'll rename it to @__page (from @page) to discourage
249
+ # such access!
250
+ #
251
+ def page(options={})
252
+ if @__page.nil? or options[:update]
253
+ trace('getting account page'){ @__page = parent.agent.get(link) }
254
+ end
255
+ @__page
256
+ end
257
+
258
+ #
259
+ # Parse a recent-statement from this Account's page.
260
+ #
261
+ def recent_statement_array
262
+ data = []
263
+
264
+ table = page.at('table.fdStatTable')
265
+ headings = (table / 'thead/tr/th').map{ |el| el.inner_text.strip }
266
+ data << headings
267
+
268
+ last_row_data = nil
269
+ (table / 'tbody/tr').each do |row|
270
+ row_data = (row / 'td').map{ |el| el.inner_text.strip }
271
+ row_data[0] = last_row_data[0] if row_data[0].empty? and last_row_data
272
+ last_row_data = row_data
273
+ data << row_data
274
+ end
275
+
276
+ return data
277
+ end
278
+
279
+ #
280
+ # Return the recent-statement in CSV format.
281
+ #
282
+ def recent_statement_csv
283
+ require 'csv'
284
+ string = ''
285
+ csv = CSV::Writer.create(string)
286
+ for row in recent_statement_array
287
+ csv << row
288
+ end
289
+ return string
230
290
  end
231
291
 
232
292
  #
@@ -354,7 +414,6 @@ class FirstDirect
354
414
  row.at('td[1]/a[2]'),
355
415
  row.at('td[3]/strong')
356
416
  ].map do |v|
357
- require 'cgi'
358
417
  v.inner_html.gsub('&nbsp;', ' ').strip.gsub('&pound;', '£')
359
418
  end
360
419
  b.link = Helpers.strip_js( row.at('td[1]/a[1]') )
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: firstdirect
3
3
  version: !ruby/object:Gem::Version
4
- version: "0.1"
4
+ version: "0.2"
5
5
  platform: ruby
6
6
  authors:
7
7
  - Edward Speyer
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2008-07-07 00:00:00 +01:00
12
+ date: 2008-07-08 00:00:00 +01:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency