natwest 0.1.2 → 0.2.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.
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