natwest 0.1.2 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (5) hide show
  1. data/Rakefile +4 -10
  2. data/VERSION +1 -1
  3. data/bin/nw +12 -8
  4. data/lib/natwest.rb +23 -34
  5. metadata +34 -19
data/Rakefile CHANGED
@@ -15,6 +15,7 @@ begin
15
15
  gem.add_development_dependency "yard", ">= 0"
16
16
  gem.add_dependency "highline", ">= 0"
17
17
  gem.extra_rdoc_files = []
18
+ gem.rdoc_options = []
18
19
  # gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings
19
20
  end
20
21
  Jeweler::GemcutterTasks.new
@@ -22,16 +23,9 @@ rescue LoadError
22
23
  puts "Jeweler (or a dependency) not available. Install it with: gem install jeweler"
23
24
  end
24
25
 
25
- require 'spec/rake/spectask'
26
- Spec::Rake::SpecTask.new(:spec) do |spec|
27
- spec.libs << 'lib' << 'spec'
28
- spec.spec_files = FileList['spec/**/*_spec.rb']
29
- end
30
-
31
- Spec::Rake::SpecTask.new(:rcov) do |spec|
32
- spec.libs << 'lib' << 'spec'
33
- spec.pattern = 'spec/**/*_spec.rb'
34
- spec.rcov = true
26
+ require 'rspec/core/rake_task'
27
+ Rspec::Core::RakeTask.new do |spec|
28
+ spec.ruby_opts = '-r./spec/spec_helper'
35
29
  end
36
30
 
37
31
  task :spec => :check_dependencies
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.1.2
1
+ 0.2.0
data/bin/nw CHANGED
@@ -26,14 +26,18 @@ credentials = YAML.load(File.read(CONFIG)) rescue {}
26
26
  end
27
27
  end
28
28
 
29
- Natwest::Account.new.tap do |nw|
29
+ Natwest::Customer.new.tap do |nw|
30
30
  nw.login credentials
31
- puts "#{nw.account_number} (#{nw.sort_code}) " +
32
- "balance: #{nw.balance}; available: #{nw.available}"
33
- puts "\nRecent Transactions:"
34
- nw.recent_transactions.each do |trans|
35
- amount = trans[:credit] ? "+#{trans[:credit]}" : "-#{trans[:debit]}"
36
- puts "#{trans[:date]}: #{amount}"
37
- puts "\t" + trans[:details]
31
+ nw.accounts.each do |acc|
32
+ puts '###'
33
+ puts "#{acc.name} [#{acc.number}; #{acc.sort_code}] " +
34
+ "balance: #{acc.balance}; available: #{acc.available}"
35
+ puts "\nRecent Transactions:"
36
+ acc.transactions.each do |trans|
37
+ amount = trans[:credit] ? "+#{trans[:credit]}" : "-#{trans[:debit]}"
38
+ puts "#{trans[:date]}: #{amount}"
39
+ puts "\t" + trans[:details]
40
+ end
41
+ puts
38
42
  end
39
43
  end
data/lib/natwest.rb CHANGED
@@ -64,49 +64,38 @@ module Natwest
64
64
  end
65
65
  end
66
66
 
67
- class Account
67
+ class Customer
68
68
  include Login
69
69
  NO_DETAILS = 'No further transaction details held'
70
70
  attr_accessor :page
71
71
 
72
72
  def initialize
73
- @ua = WWW::Mechanize.new {|ua| ua.user_agent_alias = 'Windows IE 7'}
73
+ @ua = Mechanize.new {|ua| ua.user_agent_alias = 'Windows IE 7'}
74
74
  end
75
75
 
76
- def meta_row(field=nil)
77
- assert(logged_in?, "Not logged in")
78
- @meta_row ||= page.parser.
79
- css('table#ctl00_mainContent_Accounts > tbody > tr').
80
- first
81
- return @meta_row unless field
82
- @meta_row.css("td > span.#{field} > span").first.inner_text.tr(' ','')
83
- end
84
-
85
- def account_number
86
- meta_row('AccountNumber').to_i
87
- end
88
-
89
- def sort_code
90
- meta_row('SortCode')
91
- end
92
-
93
- def balance
94
- meta_row.css('td')[3].inner_text
95
- end
96
-
97
- def available
98
- meta_row.css('td')[4].inner_text
99
- end
100
-
101
- def recent_transactions
102
- page.parser.css('table.InnerAccountTable > tbody > tr').map do |tr|
103
- transaction = Hash[[:date, :details, :credit, :debit].
104
- zip((cells = tr.css('td')).map(&:inner_text))]
105
- unless (further = cells[1]['title']) == NO_DETAILS
106
- transaction[:details] += " (#{further.squeeze(' ')})"
76
+ def accounts
77
+ page.parser.css('table.AccountTable > tbody > tr').each_slice(2).map do |meta, statement|
78
+ Account.new.tap do |acc|
79
+ acc.name = meta.at('td > span.AccountName').inner_text
80
+ acc.number = meta.at('td > span.AccountNumber').inner_text.gsub(/[^\d]/,'')
81
+ acc.sort_code = meta.at('td > span.SortCode').inner_text.gsub(/[^\d-]/,'')
82
+ acc.balance = meta.css('td')[-2].inner_text
83
+ acc.available = meta.css('td')[-1].inner_text
84
+ acc.transactions =
85
+ statement.css('table.InnerAccountTable > tbody > tr').map do |tr|
86
+ transaction = Hash[[:date, :details, :credit, :debit].
87
+ zip((cells = tr.css('td')).map(&:inner_text))]
88
+ unless (further = cells[1]['title']) == NO_DETAILS
89
+ transaction[:details] += " (#{further.squeeze(' ')})"
90
+ end
91
+ Hash[transaction.map{|k,v| [k, v == ' - ' ? nil : v]}]
92
+ end
107
93
  end
108
- Hash[transaction.map{|k,v| [k, v == ' - ' ? nil : v]}]
109
94
  end
110
95
  end
111
96
  end
97
+
98
+ class Account
99
+ attr_accessor :name, :number, :sort_code, :balance, :available, :transactions
100
+ end
112
101
  end
metadata CHANGED
@@ -1,7 +1,12 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: natwest
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.2
4
+ prerelease: false
5
+ segments:
6
+ - 0
7
+ - 2
8
+ - 0
9
+ version: 0.2.0
5
10
  platform: ruby
6
11
  authors:
7
12
  - Run Paint Run Run
@@ -9,39 +14,47 @@ autorequire:
9
14
  bindir: bin
10
15
  cert_chain: []
11
16
 
12
- date: 2010-01-20 00:00:00 +00:00
17
+ date: 2010-05-05 00:00:00 +01:00
13
18
  default_executable: nw
14
19
  dependencies:
15
20
  - !ruby/object:Gem::Dependency
16
21
  name: rspec
17
- type: :development
18
- version_requirement:
19
- version_requirements: !ruby/object:Gem::Requirement
22
+ prerelease: false
23
+ requirement: &id001 !ruby/object:Gem::Requirement
20
24
  requirements:
21
25
  - - ">="
22
26
  - !ruby/object:Gem::Version
27
+ segments:
28
+ - 1
29
+ - 2
30
+ - 9
23
31
  version: 1.2.9
24
- version:
32
+ type: :development
33
+ version_requirements: *id001
25
34
  - !ruby/object:Gem::Dependency
26
35
  name: yard
27
- type: :development
28
- version_requirement:
29
- version_requirements: !ruby/object:Gem::Requirement
36
+ prerelease: false
37
+ requirement: &id002 !ruby/object:Gem::Requirement
30
38
  requirements:
31
39
  - - ">="
32
40
  - !ruby/object:Gem::Version
41
+ segments:
42
+ - 0
33
43
  version: "0"
34
- version:
44
+ type: :development
45
+ version_requirements: *id002
35
46
  - !ruby/object:Gem::Dependency
36
47
  name: highline
37
- type: :runtime
38
- version_requirement:
39
- version_requirements: !ruby/object:Gem::Requirement
48
+ prerelease: false
49
+ requirement: &id003 !ruby/object:Gem::Requirement
40
50
  requirements:
41
51
  - - ">="
42
52
  - !ruby/object:Gem::Version
53
+ segments:
54
+ - 0
43
55
  version: "0"
44
- version:
56
+ type: :runtime
57
+ version_requirements: *id003
45
58
  description: View balance and recent transactions of a Natwest account from the command line.
46
59
  email: runrun@runpaint.org
47
60
  executables:
@@ -67,26 +80,28 @@ homepage: http://github.com/runpaint/natwest
67
80
  licenses: []
68
81
 
69
82
  post_install_message:
70
- rdoc_options:
71
- - --charset=UTF-8
83
+ rdoc_options: []
84
+
72
85
  require_paths:
73
86
  - lib
74
87
  required_ruby_version: !ruby/object:Gem::Requirement
75
88
  requirements:
76
89
  - - ">="
77
90
  - !ruby/object:Gem::Version
91
+ segments:
92
+ - 0
78
93
  version: "0"
79
- version:
80
94
  required_rubygems_version: !ruby/object:Gem::Requirement
81
95
  requirements:
82
96
  - - ">="
83
97
  - !ruby/object:Gem::Version
98
+ segments:
99
+ - 0
84
100
  version: "0"
85
- version:
86
101
  requirements: []
87
102
 
88
103
  rubyforge_project:
89
- rubygems_version: 1.3.5
104
+ rubygems_version: 1.3.6
90
105
  signing_key:
91
106
  specification_version: 3
92
107
  summary: Rudimentary API for Natwest Online Banking