budgetcrmod 0.1.0 → 0.2.1

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: cd1d0b4f3a58bce91cd2ad56229fed7e745a73fb
4
- data.tar.gz: 9e7aa5398882fa4f219eb78fcb6f97e518550b88
3
+ metadata.gz: 9a1ed45d12e5021db3fce47df4b4ba1a5e93d8c9
4
+ data.tar.gz: 34f6c04868dc0b676e3aba3e9ae681ffb7c95549
5
5
  SHA512:
6
- metadata.gz: 13cb28562e021786af1945ad3e050dfdb016d3effd719fab216edb58d0330bb400243abf8b303bc71326ea5dcddd60120e49d2897ef109268b8603a3f3ec5313
7
- data.tar.gz: 4fa8496fb757cdffdba9eaf10a480ed2d2942723c82ce6690eb62b676951fa4bb2ac16947611d5815f9c8b032d2a8c4acfc16d3d0fbfaeb3597cff276b4cfa50
6
+ metadata.gz: 65178bcb5e47004f7e8e34500fcbc764821bcf8ac0e2c67f3107d3fc31b6ce9715c5e176077fb6c5728dcdd4ed5c06e8b5b06414d6b93595b3c715a1da6d8cb3
7
+ data.tar.gz: 5097b5c98f9028f75b90a42280d15d225b9ee3b326060ddd7bfdbb41877c6937e2ed9c47b90862c53d37fda61dc453bbbd85a429ab91ae7ea9514113800ab1ba
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.1.0
1
+ 0.2.1
data/budgetcrmod.gemspec CHANGED
@@ -2,18 +2,18 @@
2
2
  # DO NOT EDIT THIS FILE DIRECTLY
3
3
  # Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
4
4
  # -*- encoding: utf-8 -*-
5
- # stub: budgetcrmod 0.1.0 ruby lib
5
+ # stub: budgetcrmod 0.2.1 ruby lib
6
6
 
7
7
  Gem::Specification.new do |s|
8
- s.name = "budgetcrmod"
9
- s.version = "0.1.0"
8
+ s.name = "budgetcrmod".freeze
9
+ s.version = "0.2.1"
10
10
 
11
- s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
12
- s.require_paths = ["lib"]
13
- s.authors = ["Edmund Highcock"]
14
- s.date = "2014-06-02"
15
- s.description = "A CodeRunner module to help you do your budget"
16
- s.email = "edmundhighcock@users.sourceforge.net"
11
+ s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version=
12
+ s.require_paths = ["lib".freeze]
13
+ s.authors = ["Edmund Highcock".freeze]
14
+ s.date = "2018-03-04"
15
+ s.description = "A CodeRunner module to help you do your budget".freeze
16
+ s.email = "edmundhighcock@users.sourceforge.net".freeze
17
17
  s.extra_rdoc_files = [
18
18
  "LICENSE.txt",
19
19
  "README.rdoc"
@@ -32,33 +32,33 @@ Gem::Specification.new do |s|
32
32
  "test/helper.rb",
33
33
  "test/test_budgetcrmod.rb"
34
34
  ]
35
- s.homepage = "http://github.com/edmundhighcock/budgetcrmod"
36
- s.licenses = ["MIT"]
37
- s.rubygems_version = "2.2.2"
38
- s.summary = "A CodeRunner module to help you do your budget"
35
+ s.homepage = "http://github.com/edmundhighcock/budgetcrmod".freeze
36
+ s.licenses = ["MIT".freeze]
37
+ s.rubygems_version = "2.6.8".freeze
38
+ s.summary = "A CodeRunner module to help you do your budget".freeze
39
39
 
40
40
  if s.respond_to? :specification_version then
41
41
  s.specification_version = 4
42
42
 
43
43
  if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
44
- s.add_runtime_dependency(%q<coderunner>, [">= 0.11.0"])
45
- s.add_development_dependency(%q<shoulda>, [">= 0"])
46
- s.add_development_dependency(%q<rdoc>, ["~> 3.12"])
47
- s.add_development_dependency(%q<bundler>, ["> 1.0.0"])
48
- s.add_development_dependency(%q<jeweler>, [">= 1.8.4"])
44
+ s.add_runtime_dependency(%q<coderunner>.freeze, [">= 0.11.0"])
45
+ s.add_development_dependency(%q<shoulda>.freeze, [">= 0"])
46
+ s.add_development_dependency(%q<rdoc>.freeze, ["~> 3.12"])
47
+ s.add_development_dependency(%q<bundler>.freeze, ["> 1.0.0"])
48
+ s.add_development_dependency(%q<jeweler>.freeze, [">= 1.8.4"])
49
49
  else
50
- s.add_dependency(%q<coderunner>, [">= 0.11.0"])
51
- s.add_dependency(%q<shoulda>, [">= 0"])
52
- s.add_dependency(%q<rdoc>, ["~> 3.12"])
53
- s.add_dependency(%q<bundler>, ["> 1.0.0"])
54
- s.add_dependency(%q<jeweler>, [">= 1.8.4"])
50
+ s.add_dependency(%q<coderunner>.freeze, [">= 0.11.0"])
51
+ s.add_dependency(%q<shoulda>.freeze, [">= 0"])
52
+ s.add_dependency(%q<rdoc>.freeze, ["~> 3.12"])
53
+ s.add_dependency(%q<bundler>.freeze, ["> 1.0.0"])
54
+ s.add_dependency(%q<jeweler>.freeze, [">= 1.8.4"])
55
55
  end
56
56
  else
57
- s.add_dependency(%q<coderunner>, [">= 0.11.0"])
58
- s.add_dependency(%q<shoulda>, [">= 0"])
59
- s.add_dependency(%q<rdoc>, ["~> 3.12"])
60
- s.add_dependency(%q<bundler>, ["> 1.0.0"])
61
- s.add_dependency(%q<jeweler>, [">= 1.8.4"])
57
+ s.add_dependency(%q<coderunner>.freeze, [">= 0.11.0"])
58
+ s.add_dependency(%q<shoulda>.freeze, [">= 0"])
59
+ s.add_dependency(%q<rdoc>.freeze, ["~> 3.12"])
60
+ s.add_dependency(%q<bundler>.freeze, ["> 1.0.0"])
61
+ s.add_dependency(%q<jeweler>.freeze, [">= 1.8.4"])
62
62
  end
63
63
  end
64
64
 
@@ -1,8 +1,20 @@
1
+ class Float
2
+ def to_str
3
+ sprintf("%.2f", self)
4
+ end
5
+ def to_s
6
+ sprintf("%.2f", self)
7
+ end
8
+ end
1
9
  require 'date'
2
10
  class String
3
11
  def latex_escape
4
12
  self.gsub(/(?<!\\)([%_&^])/, '\\\\\1')
5
13
  end
14
+ #alias :old_to_f :to_f
15
+ #def to_f
16
+ #gsub(/,/, '').old_to_f
17
+ #end
6
18
  end
7
19
 
8
20
  class Date
@@ -45,7 +57,7 @@ class CodeRunner
45
57
  # "4506.80"]
46
58
  #
47
59
  @component_results = [:date, :type, :sc, :ac, :description, :deposit, :withdrawal, :balance]
48
- @results = [:data, :data_line] + @component_results
60
+ @results = [:date_i, :data, :data_line] + @component_results
49
61
  def generate_input_file
50
62
  FileUtils.cp @data_file.sub(/~/, ENV['HOME']), @directory + '/data.cvs'
51
63
  end
@@ -69,23 +81,46 @@ class CodeRunner
69
81
  def process_directory_code_specific
70
82
  @status=:Complete
71
83
  data = File.read('data.cvs')
72
- data = data.split("\n").map do |line|
84
+ #p ['encoding', data.encoding]
85
+ #data.encode(Encoding::UTF_8)
86
+ tries = 1
87
+ begin
88
+ data = data.split(/\n\r|\r\n|\n|\r/)
89
+ rescue
90
+ #require 'ensure/encoding.rb'
91
+ if tries > 0
92
+ if tries==1
93
+ #data.force_encoding('iso-8859-1')
94
+ data = File.read('data.cvs', encoding: "ISO-8859-1")
95
+ data = data.encode('utf-8')
96
+ end
97
+ tries-=1
98
+ retry
99
+ end
100
+ end
101
+ if data[0] =~ /^\d{2} \w{3} \d\d,/ # BarclayCard format
102
+ data.unshift 'date,description,type,user,expensetype,withdrawal,withdrawal'
103
+ end
104
+
105
+ @first_line_string = data[0].dup
106
+ data = data.map do |line|
73
107
  matches = line.scan(Regexp.new("((?:#{DOUBLE_STRING}|[^,])*)(?:,|$)"))
74
108
  matches.flatten
75
109
  end
76
110
  #pp data
77
111
  @data = data
78
112
  @first_line = @data.shift.join(',')
113
+ generate_component_runs
79
114
  end
80
- def reversed?
115
+ #def reversed?
81
116
  #case account_type(@account)
82
117
  #when :Asset
83
- @first_line =~ /Debit.*Credit/
118
+ #@first_line =~ /Debit.*Credit/
84
119
  #end
85
- end
120
+ #end
86
121
  def print_out_line
87
122
  if @is_component
88
- sprintf("%4d. %10s %10s %3s %-30s %8s %8s %8s %8s %8s", id, account, *rcp.component_results.find_all{|r| r!=:ac and r!=:sc}.map{|res| send(res)}, budget, external_account)
123
+ sprintf("%4d. %10s %10s %3s %-40s %8s %8s %8s %8s %8s", id, account, *rcp.component_results.find_all{|r| r!=:ac and r!=:sc}.map{|res| send(res).to_s.gsub(/\s+/, ' ')}, external_account, sub_account)
89
124
  else
90
125
  #pr = component_runs.sort_by{|r| r.id}
91
126
  "#{sprintf("%3d", @id)}. #{sprintf("%-20s", @account)} Start: #{start_date} End: #{end_date} Final Balance: #{final_balance} "
@@ -108,36 +143,108 @@ class CodeRunner
108
143
  def parameter_string
109
144
  ""
110
145
  end
146
+ #def external_account
147
+ #name = super
148
+ #if ACCOUNT_INFO[name] and ACCOUNT_INFO[name][:currencies].size > 2
149
+ #end
150
+ #def sub_account
151
+ #end
152
+
153
+ def sub_account
154
+ cache[:sub_account] ||= super
155
+ end
156
+ def external_account
157
+ cache[:external_account] ||= super
158
+ end
111
159
 
112
160
  #def external_account
113
- #(sub_account.to_s + '_' + budget.to_s).to_sum
161
+ #(budget.to_s + '_' + sub_account.to_s).to_sym
114
162
  #end
115
163
 
164
+ def csv_data_fields
165
+ case @first_line_string
166
+ when /Date,Type,Sort Code,Account Number,Description,In,Out,Balance/ # Old Lloyds Bank Format
167
+ [:date, :type, :sc, :ac, :description, :deposit, :withdrawal, :balance]
168
+ when /Transaction Date,Transaction Type,Sort Code,Account Number,Transaction Description,Debit Amount,Credit Amount,Balance/ # 2013 Lloyds Bank Format, NB they are using debit and credit as if the account is an equity account (when of course a bank account is really an asset)
169
+ [:date, :type, :sc, :ac, :description, :withdrawal, :deposit, :balance]
170
+ when /Date,Date entered,Reference,Description,Amount/ # Lloyds Credit Card statement
171
+ [:date, :dummy, :dummy, :description, :withdrawal]
172
+ when /date,description,type,user,expensetype,withdrawal,withdrawal/
173
+ [:date,:description,:type,:dummy,:dummy, :withdrawal, :withdrawal]
174
+ when /Datum,Transaktion,Kategori,Belopp,Saldo/ # Nordea.se privat, Belopp is positive when the asset increases
175
+ [:date,:description,:dummy,:deposit,:balance]
176
+ when /Bokföringsdatum,Transaktionsreferens,Mottagare,Belopp,Valuta/ # Forex.se privat, Belopp is positive when the asset increases
177
+ [:date,:description,:dummy,:deposit,:dummy]
178
+ end
179
+ end
180
+
181
+ #def withdrawn
182
+ #@withdrawn||0.0
183
+ #end
184
+
185
+ def has_balance?
186
+ @has_balance ||= csv_data_fields.include? :balance
187
+ end
188
+
189
+ attr_accessor :dummy
190
+
191
+
192
+ def set_zeroes
193
+ @withdrawal||=0.0
194
+ @deposit||=0.0
195
+ end
116
196
  def generate_component_runs
197
+ #puts Kernel.caller
198
+ #p ['generate_component_runs', @component_runs.class, (@component_runs.size rescue nil), @runner.component_run_list.size, @directory]
199
+ return if @component_runs and @component_runs.size > 0
117
200
  @runner.cache[:data] ||= []
118
- reslts = rcp.component_results
119
- if reversed?
120
- reslts[5] = :withdrawal
121
- reslts[6] = :deposit
122
- end
201
+ #reslts = rcp.component_results
202
+ #if reversed?
203
+ #reslts[5] = :withdrawal
204
+ #reslts[6] = :deposit
205
+ #end
123
206
  @data.each do |dataset|
124
- next if @runner.cache[:data].include? dataset and Date.parse(dataset[0]) > Date.parse("1/1/2013")
207
+ #next if @runner.cache[:data].include? dataset and Date.parse(dataset[0]) > Date.parse("1/1/2013")
208
+ next if @runner.component_run_list.map{|k,v| v.instance_variable_get(:@dataset)}.include? dataset and Date.parse(dataset[0]) > Date.parse("1/1/2013")
209
+ next if @first_line_string =~ /^Datum/ and dataset[1] =~ /Reservation/
125
210
  component = create_component
211
+ ep 'Generating Component', @component_runs.size
212
+ reslts = csv_data_fields
126
213
  reslts.each_with_index do |res,index|
127
214
  value = dataset[index]
128
- # ep value
215
+ #ep value
129
216
  value = Date.parse value if res == :date
130
- value = value.to_f if [:deposit, :withdrawal, :balance].include? res
217
+ if [:deposit, :withdrawal, :balance].include? res
218
+ case @first_line_string
219
+ when /^Datum/i # we are dealing with European numbers
220
+ value = value.gsub(/[."]/, '')
221
+ value = value.sub(/[,]/, '.')
222
+ else
223
+ value = value.gsub(/[",]/, '')
224
+ end
225
+ next unless value =~ /\d/
226
+ value = value.to_f
227
+ end
228
+ component.instance_variable_set(:@dataset, dataset)
131
229
  component.set(res, value)
230
+ component.set_zeroes
132
231
  component.set(:data_line, reslts.map{|r| component.send(r).to_s}.join(','))
232
+ component.date_i = component.date.to_datetime.to_time.to_i
133
233
  end
234
+ if component.deposit < 0.0 and component.withdrawal == 0.0
235
+ component.withdrawal = -component.deposit
236
+ component.deposit = 0.0
237
+ end
134
238
  @runner.cache[:data].push dataset
239
+ component.external_account; component.sub_account # Triggers interactive account choices
135
240
  #component.account = @account
136
241
  end
137
242
  end
138
243
  def days_ago(today = Date.today)
139
244
  #ep ['today', today, date]
140
245
  # sprintf("%04d%02d%02d", date.year, date.month, date.day).to_i
246
+ #cache[:days_ago] ||= {}
247
+ #cache[:days_ago][today.to_s] ||=
141
248
  - ((date.to_datetime.to_time.to_i - today.to_datetime.to_time.to_i) / 24 / 3600).to_i
142
249
  end
143
250
  def idate
@@ -312,8 +419,10 @@ class CodeRunner
312
419
  kit.data.each{|dk| dk.gp.using = "1:2"}
313
420
  kit.gp.xdata = "time"
314
421
  kit.gp.format = %[x "%d %B %Y"]
422
+ kit.gp.format = %[x "%b %Y"]
423
+ kit.gp.mxtics = "30"
315
424
  kit.gp.xtics = "rotate by 340 offset 0,-0.5 #{24*3600*14}"
316
- kit.gp.xtics = "rotate by 340 offset 0,-0.5 "
425
+ kit.gp.xtics = "rotate by 340 offset 0,-0.5 2629746"
317
426
  end
318
427
 
319
428
  def self.print_budget(options={})
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: budgetcrmod
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Edmund Highcock
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-06-02 00:00:00.000000000 Z
11
+ date: 2018-03-04 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: coderunner
@@ -120,7 +120,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
120
120
  version: '0'
121
121
  requirements: []
122
122
  rubyforge_project:
123
- rubygems_version: 2.2.2
123
+ rubygems_version: 2.6.8
124
124
  signing_key:
125
125
  specification_version: 4
126
126
  summary: A CodeRunner module to help you do your budget