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 +4 -4
- data/VERSION +1 -1
- data/budgetcrmod.gemspec +28 -28
- data/lib/budgetcrmod/budget.rb +125 -16
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9a1ed45d12e5021db3fce47df4b4ba1a5e93d8c9
|
4
|
+
data.tar.gz: 34f6c04868dc0b676e3aba3e9ae681ffb7c95549
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 65178bcb5e47004f7e8e34500fcbc764821bcf8ac0e2c67f3107d3fc31b6ce9715c5e176077fb6c5728dcdd4ed5c06e8b5b06414d6b93595b3c715a1da6d8cb3
|
7
|
+
data.tar.gz: 5097b5c98f9028f75b90a42280d15d225b9ee3b326060ddd7bfdbb41877c6937e2ed9c47b90862c53d37fda61dc453bbbd85a429ab91ae7ea9514113800ab1ba
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.1
|
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
|
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
|
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 = "
|
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.
|
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
|
45
|
-
s.add_development_dependency(%q<shoulda
|
46
|
-
s.add_development_dependency(%q<rdoc
|
47
|
-
s.add_development_dependency(%q<bundler
|
48
|
-
s.add_development_dependency(%q<jeweler
|
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
|
51
|
-
s.add_dependency(%q<shoulda
|
52
|
-
s.add_dependency(%q<rdoc
|
53
|
-
s.add_dependency(%q<bundler
|
54
|
-
s.add_dependency(%q<jeweler
|
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
|
58
|
-
s.add_dependency(%q<shoulda
|
59
|
-
s.add_dependency(%q<rdoc
|
60
|
-
s.add_dependency(%q<bundler
|
61
|
-
s.add_dependency(%q<jeweler
|
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
|
|
data/lib/budgetcrmod/budget.rb
CHANGED
@@ -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
|
-
|
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
|
-
|
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 %-
|
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
|
-
#(
|
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
|
-
#
|
215
|
+
#ep value
|
129
216
|
value = Date.parse value if res == :date
|
130
|
-
|
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
|
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:
|
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.
|
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
|