lucarecord 0.2.13 → 0.2.18

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
  SHA256:
3
- metadata.gz: 33dd0b5f2cd8a6ae4c94dbadf2d9aab09506cab0a2c4a39d73b5e0a961be6398
4
- data.tar.gz: 49041749d990cf7e26febd8190f9e70779f6d126457fe33107e76b9f449a88c9
3
+ metadata.gz: 63ac71426bdf4eb871884b8b28c5aa363db9d51ef3ca0d84ab92a3fcf127ecde
4
+ data.tar.gz: 2bc0d6ecde974a2f9ca9c901af5ac714c909f40dd84986746948065a4efb4ed7
5
5
  SHA512:
6
- metadata.gz: f4c10b61c7ed567bfe3609836a428b208cb25abefab2d666b3ece5db2316bfe575f53d16a3551ab12f9588148c8e829975cea7e94e51a07ba80a68230edcb0bb
7
- data.tar.gz: 7427716901f0fa5c9a83055c22c7ff58819b4fbe013af187c8a2230239953fbcde22658a29b3f6e3e47c72ccc6eaec58a08ba47c47008c190be5ac3d55afd1d4
6
+ metadata.gz: 1f9cf84bfb09080f6f3e8cf15c8fb3cea0d6eca9d69acc10c23cd9b6a681daae9ab641181a928f438c870a438a0c4525c61bfad6a1832a2d148b7a3d37b3d6d3
7
+ data.tar.gz: be35bd6b0a993b5fde415ba5e1a7b59228106c443594b164fa5df26f1eb284ae0556277b99b25f7697283ac194f6c25ffa7d7d8d3e1bfe2e22b128130f3f9cec
@@ -0,0 +1,8 @@
1
+ ## LucaRecord 0.2.18
2
+
3
+ * `find()`, `create()`, `save()` now supports both of uuid / historical records. If specified `date:` keyword option to `create()`, then generate historical record. `find()`, `save()` identifies with 'id' attribute.
4
+
5
+ ## LucaRecord 0.2.17
6
+
7
+ * Change internal number format to BigDecimal.
8
+ * Number of Decimal is configurable through `decimal_number` in config.yml(default = 2). `country` setting can also affect.
@@ -1,4 +1,7 @@
1
1
  # frozen_string_literal: true
2
+
3
+ require 'luca_support'
4
+ require 'luca_support/config'
2
5
  require 'luca_record/version'
3
6
 
4
7
  module LucaRecord
@@ -14,8 +14,8 @@ module LucaRecord
14
14
  include LucaSupport::Code
15
15
 
16
16
  def initialize(file = @filename)
17
- @path = file
18
- #@path = dict_path(file)
17
+ #@path = file
18
+ @path = self.class.dict_path(file)
19
19
  set_driver
20
20
  end
21
21
 
@@ -1,3 +1,6 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'bigdecimal'
1
4
  require 'csv'
2
5
  require 'date'
3
6
  require 'fileutils'
@@ -6,11 +9,10 @@ require 'pathname'
6
9
  require 'luca_support/code'
7
10
  require 'luca_support/config'
8
11
 
9
- #
10
- # Low level API
11
- # manipulate files based on transaction date
12
- #
13
- module LucaRecord
12
+ module LucaRecord # :nodoc:
13
+ # == IO
14
+ # Read / Write hash data with id and/or date.
15
+ # Manage both database & historical records.
14
16
  module IO
15
17
  include LucaSupport::Code
16
18
 
@@ -18,42 +20,25 @@ module LucaRecord
18
20
  klass.extend ClassMethods
19
21
  end
20
22
 
21
- #
22
- # Used @date for searching current settings
23
- # query can be nested hash for other than 'val'
24
- #
25
- # where(contract_status: 'active')
26
- # where(graded: {rank: 5})
27
- #
28
- def where(**query)
29
- return enum_for(:where, **query) unless block_given?
30
-
31
- query.each do |key, val|
32
- v = val.respond_to?(:values) ? val.values.first : val
33
- label = val.respond_to?(:keys) ? val.keys.first : 'val'
34
- self.class.all do |data|
35
- next unless data.keys.map(&:to_sym).include?(key)
36
-
37
- processed = parse_current(data)
38
- yield processed if v == processed.dig(key.to_s, label.to_s)
39
- end
40
- end
41
- end
42
-
43
23
  module ClassMethods
44
- #
24
+ # ----------------------------------------------------------------
25
+ # :section: Query Methods
26
+ # Provide sematic search interfaces.
27
+ # <tt>basedir</tt> is set by class instance variable <tt>@dirname</tt>
28
+ # of each concrete class.
29
+ # ----------------------------------------------------------------
30
+
45
31
  # find ID based record. Support uuid and encoded date.
46
- #
47
32
  def find(id, basedir = @dirname)
48
- return enum_for(:find, id, basedir) unless block_given?
33
+ return enum_for(:find, id, basedir).first unless block_given?
49
34
 
50
35
  if id.length >= 40
51
36
  open_hashed(basedir, id) do |f|
52
37
  yield load_data(f)
53
38
  end
54
- elsif id.length >= 9
55
- # TODO: need regexp match for more flexible coding(after AD9999)
56
- open_records(basedir, id[0, 5], id[5, 6]) do |f, path|
39
+ elsif id.length >= 7
40
+ parts = id.split('/')
41
+ open_records(basedir, parts[0], parts[1]) do |f, path|
57
42
  yield load_data(f, path)
58
43
  end
59
44
  else
@@ -61,7 +46,6 @@ module LucaRecord
61
46
  end
62
47
  end
63
48
 
64
- #
65
49
  # search date based record.
66
50
  #
67
51
  # * data hash
@@ -75,7 +59,6 @@ module LucaRecord
75
59
  end
76
60
  end
77
61
 
78
- #
79
62
  # search with date params & code.
80
63
  #
81
64
  def search(year, month = nil, day = nil, code = nil, basedir = @dirname)
@@ -91,103 +74,155 @@ module LucaRecord
91
74
  end
92
75
  end
93
76
 
94
- #
95
77
  # retrieve all data
96
78
  #
97
79
  def all(basedir = @dirname)
98
80
  return enum_for(:all, basedir) unless block_given?
99
81
 
100
- open_all(basedir) do |f|
82
+ open_all(basedir) do |f|
101
83
  yield load_data(f)
102
84
  end
103
85
  end
104
86
 
87
+ # ----------------------------------------------------------------
88
+ # :section: Write Methods
89
+ # <tt>basedir</tt> is set by class instance variable <tt>@dirname</tt>
90
+ # of each concrete class.
91
+ # ----------------------------------------------------------------
92
+
93
+ # create record both of uuid/date identified.
105
94
  #
106
- # convert ID to file path. Normal argument is as follows:
107
- #
108
- # * [2020H, V001]
109
- # * "2020H/V001"
110
- # * "a7b806d04a044c6dbc4ce72932867719"
111
- #
112
- def id2path(id)
113
- if id.is_a?(Array)
114
- id.join('/')
115
- elsif id.include?('/')
116
- id
95
+ def create(obj, date: nil, codes: nil, basedir: @dirname)
96
+ validate_keys(obj)
97
+ if date
98
+ create_record(obj, date, codes, basedir)
117
99
  else
118
- encode_hashed_path(id)
100
+ obj['id'] = LucaSupport::Code.issue_random_id
101
+ open_hashed(basedir, obj['id'], 'w') do |f|
102
+ f.write(YAML.dump(LucaSupport::Code.readable(obj.sort.to_h)))
103
+ end
104
+ obj['id']
119
105
  end
120
106
  end
121
107
 
122
- #
123
- # Directory separation for performance. Same as Git way.
124
- #
125
- def encode_hashed_path(id, split_factor = 3)
126
- len = id.length
127
- if len <= split_factor
128
- ['', id]
129
- else
130
- [id[0, split_factor], id[split_factor, len - split_factor]]
131
- end
108
+ def prepare_dir!(basedir, date_obj)
109
+ dir_name = (Pathname(basedir) + LucaSupport::Code.encode_dirname(date_obj)).to_s
110
+ FileUtils.mkdir_p(dir_name) unless Dir.exist?(dir_name)
111
+ dir_name
132
112
  end
133
113
 
134
114
  def add_status!(id, status, basedir = @dirname)
135
115
  path = abs_path(basedir) / id2path(id)
136
- origin = YAML.load_file(path, {})
116
+ origin = YAML.load_file(path, **{})
137
117
  newline = { status => DateTime.now.to_s }
138
118
  origin['status'] = [] if origin['status'].nil?
139
119
  origin['status'] << newline
140
120
  File.write(path, YAML.dump(origin.sort.to_h))
141
121
  end
142
122
 
143
- #
144
- # create hash based record
145
- #
146
- def create(obj, basedir = @dirname)
147
- id = LucaSupport::Code.issue_random_id
148
- obj['id'] = id
149
- open_hashed(basedir, id, 'w') do |f|
150
- f.write(YAML.dump(obj.sort.to_h))
123
+ # update file with obj['id']
124
+ def save(obj, basedir = @dirname)
125
+ if obj['id'].nil?
126
+ create(obj, basedir)
127
+ else
128
+ validate_keys(obj)
129
+ if obj['id'].length < 40
130
+ parts = obj['id'].split('/')
131
+ raise 'invalid ID' if parts.length != 2
132
+
133
+ open_records(basedir, parts[0], parts[1], nil, 'w') do |f, path|
134
+ f.write(YAML.dump(LucaSupport::Code.readable(obj.sort.to_h)))
135
+ end
136
+ else
137
+ open_hashed(basedir, obj['id'], 'w') do |f|
138
+ f.write(YAML.dump(LucaSupport::Code.readable(obj.sort.to_h)))
139
+ end
140
+ end
151
141
  end
142
+ obj['id']
143
+ end
144
+
145
+ # delete file by id
146
+ def delete(id, basedir = @dirname)
147
+ FileUtils.rm(Pathname(abs_path(basedir)) / id2path(id))
152
148
  id
153
149
  end
154
150
 
151
+ # ----------------------------------------------------------------
152
+ # :section: Path Utilities
153
+ # ----------------------------------------------------------------
154
+
155
+ # Convert ID to file directory/filename path.
156
+ # 1st element of Array is used as directory, the others as filename.
157
+ # String without '/' is converted as git-like structure.
158
+ # Normal argument is as follows:
155
159
  #
156
- # define new transaction ID & write data at once
157
- #
158
- def create_record!(date_obj, codes = nil, basedir = @dirname)
159
- gen_record_file!(basedir, date_obj, codes) do |f|
160
- f.write CSV.generate('', col_sep: "\t", headers: false) { |c| yield(c) }
160
+ # ['2020H', 'V001', 'a7b806d04a044c6dbc4ce72932867719']
161
+ # => '2020H/V001-a7b806d04a044c6dbc4ce72932867719'
162
+ # 'a7b806d04a044c6dbc4ce72932867719'
163
+ # => 'a7b/806d04a044c6dbc4ce72932867719'
164
+ # '2020H/V001'
165
+ # => '2020H/V001'
166
+ def id2path(id)
167
+ if id.is_a?(Array)
168
+ case id.length
169
+ when 0..2
170
+ id.join('/')
171
+ else
172
+ [id[0], id[1..-1].join('-')].join('/')
173
+ end
174
+ elsif id.include?('/')
175
+ id
176
+ else
177
+ encode_hashed_path(id).join('/')
161
178
  end
162
179
  end
163
180
 
164
- def gen_record_file!(basedir, date_obj, codes = nil)
165
- d = prepare_dir!(abs_path(basedir), date_obj)
166
- filename = LucaSupport::Code.encode_date(date_obj) + new_record_id(abs_path(basedir), date_obj)
167
- if codes
168
- filename += codes.inject('') { |fragment, code| "#{fragment}-#{code}" }
181
+ # Directory separation for performance. Same as Git way.
182
+ def encode_hashed_path(id, split_factor = 3)
183
+ len = id.length
184
+ if len <= split_factor
185
+ ['', id]
186
+ else
187
+ [id[0, split_factor], id[split_factor, len - split_factor]]
169
188
  end
170
- path = Pathname(d) + filename
171
- File.open(path.to_s, 'w') { |f| yield(f) }
172
189
  end
173
190
 
174
- def new_record_id(basedir, date_obj)
175
- LucaSupport::Code.encode_txid(new_record_no(basedir, date_obj))
191
+ # test if having required dirs/files under exec path
192
+ def valid_project?(path = LucaSupport::Config::Pjdir)
193
+ project_dir = Pathname(path)
194
+ FileTest.file?((project_dir + 'config.yml').to_s) and FileTest.directory?( (project_dir + 'data').to_s)
176
195
  end
177
196
 
178
- def prepare_dir!(basedir, date_obj)
179
- dir_name = (Pathname(basedir) + encode_dirname(date_obj)).to_s
180
- FileUtils.mkdir_p(dir_name) unless Dir.exist?(dir_name)
181
- dir_name
182
- end
183
-
184
- def encode_dirname(date_obj)
185
- date_obj.year.to_s + LucaSupport::Code.encode_month(date_obj)
197
+ def new_record_id(basedir, date_obj)
198
+ LucaSupport::Code.encode_txid(new_record_no(basedir, date_obj))
186
199
  end
187
200
 
188
201
  private
189
202
 
203
+ # define new transaction ID & write data at once
204
+ # ID format is like '2020H/A001', which means record no.1 of 2020/10/10.
205
+ # Any data format can be written with block.
190
206
  #
207
+ def create_record(obj, date_obj, codes = nil, basedir = @dirname)
208
+ FileUtils.mkdir_p(abs_path(basedir)) unless Dir.exist?(abs_path(basedir))
209
+ subdir = "#{date_obj.year}#{LucaSupport::Code.encode_month(date_obj)}"
210
+ filename = LucaSupport::Code.encode_date(date_obj) + new_record_id(basedir, date_obj)
211
+ obj['id'] = "#{subdir}/#{filename}" if obj.is_a? Hash
212
+ filename += '-' + codes.join('-') if codes
213
+ Dir.chdir(abs_path(basedir)) do
214
+ FileUtils.mkdir_p(subdir) unless Dir.exist?(subdir)
215
+ File.open(Pathname(subdir) / filename, 'w') do |f|
216
+ if block_given?
217
+ yield(f)
218
+ else
219
+ f.write(YAML.dump(LucaSupport::Code.readable(obj.sort.to_h)))
220
+ end
221
+ end
222
+ end
223
+ "#{subdir}/#{filename}"
224
+ end
225
+
191
226
  # open records with 'basedir/month/date-code' path structure.
192
227
  # Glob pattern can be specified like folloing examples.
193
228
  #
@@ -198,12 +233,12 @@ module LucaRecord
198
233
  # 1. encoded month
199
234
  # 2. encoded day + record number of the day
200
235
  # 3. codes. More than 3 are all code set except first 2 parameters.
201
- #
202
236
  def open_records(basedir, subdir, filename = nil, code = nil, mode = 'r')
203
237
  return enum_for(:open_records, basedir, subdir, filename, code, mode) unless block_given?
204
238
 
205
239
  file_pattern = filename.nil? ? '*' : "#{filename}*"
206
240
  Dir.chdir(abs_path(basedir)) do
241
+ FileUtils.mkdir_p(subdir) if mode == 'w' && !Dir.exist?(subdir)
207
242
  Dir.glob("#{subdir}*/#{file_pattern}").sort.each do |subpath|
208
243
  next if skip_on_unmatch_code(subpath, code)
209
244
 
@@ -213,7 +248,6 @@ module LucaRecord
213
248
  end
214
249
  end
215
250
 
216
- #
217
251
  # git object like structure
218
252
  #
219
253
  def open_hashed(basedir, id, mode = 'r')
@@ -225,7 +259,6 @@ module LucaRecord
225
259
  File.open((dirpath + filename).to_s, mode) { |f| yield f }
226
260
  end
227
261
 
228
- #
229
262
  # scan through all files
230
263
  #
231
264
  def open_all(basedir, mode = 'r')
@@ -237,7 +270,6 @@ module LucaRecord
237
270
  end
238
271
  end
239
272
 
240
- #
241
273
  # Decode basic format.
242
274
  # If specific decode is needed, override this method in each class.
243
275
  #
@@ -249,7 +281,18 @@ module LucaRecord
249
281
  when 'json'
250
282
  # TODO: implement JSON parse
251
283
  else
252
- YAML.load(io.read)
284
+ YAML.load(io.read).tap { |obj| validate_keys(obj) }
285
+ .inject({}) { |h, (k, v)| h[k] = LucaSupport::Code.decimalize(v); h }
286
+ end
287
+ end
288
+
289
+ def validate_keys(obj)
290
+ return nil unless @required
291
+
292
+ keys = obj.keys
293
+ [].tap do |errors|
294
+ @required.each { |r| errors << r unless keys.include?(r) }
295
+ raise "Missing keys: #{errors.join(' ')}" unless errors.empty?
253
296
  end
254
297
  end
255
298
 
@@ -270,8 +313,10 @@ module LucaRecord
270
313
 
271
314
  # AUTO INCREMENT
272
315
  def new_record_no(basedir, date_obj)
273
- dir_name = (Pathname(basedir) + encode_dirname(date_obj)).to_s
274
- raise 'No target dir exists.' unless Dir.exist?(dir_name)
316
+ raise 'No target dir exists.' unless Dir.exist?(abs_path(basedir))
317
+
318
+ dir_name = (Pathname(abs_path(basedir)) / LucaSupport::Code.encode_dirname(date_obj)).to_s
319
+ return 1 unless Dir.exist?(dir_name)
275
320
 
276
321
  Dir.chdir(dir_name) do
277
322
  last_file = Dir.glob("#{LucaSupport::Code.encode_date(date_obj)}*").max
@@ -282,25 +327,28 @@ module LucaRecord
282
327
  end
283
328
  end # end of ClassModules
284
329
 
285
- def set_data_dir(dir_path = LucaSupport::Config::Pjdir)
286
- if dir_path.nil?
287
- raise 'No project path is specified'
288
- elsif !valid_project?(dir_path)
289
- raise 'Specified path is not for valid project'
290
- else
291
- project_dir = Pathname(dir_path)
292
- end
330
+ # Used @date for searching current settings
331
+ # query can be nested hash for other than 'val'
332
+ #
333
+ # where(contract_status: 'active')
334
+ # where(graded: {rank: 5})
335
+ #
336
+ def where(**query)
337
+ return enum_for(:where, **query) unless block_given?
293
338
 
294
- (project_dir + 'data/').to_s
295
- end
339
+ query.each do |key, val|
340
+ v = val.respond_to?(:values) ? val.values.first : val
341
+ label = val.respond_to?(:keys) ? val.keys.first : 'val'
342
+ self.class.all do |data|
343
+ next unless data.keys.map(&:to_sym).include?(key)
296
344
 
297
- def valid_project?(path)
298
- project_dir = Pathname(path)
299
- FileTest.file?((project_dir + 'config.yml').to_s) and FileTest.directory?( (project_dir + 'data').to_s)
345
+ processed = parse_current(data)
346
+ yield processed if v == processed.dig(key.to_s, label.to_s)
347
+ end
348
+ end
300
349
  end
301
350
 
302
- #
303
- # for date based records
351
+ # parse data dir and respond existing months
304
352
  #
305
353
  def scan_terms(base_dir, query = nil)
306
354
  pattern = query.nil? ? "*" : "#{query}*"
@@ -313,25 +361,11 @@ module LucaRecord
313
361
 
314
362
  def load_config(path = nil)
315
363
  path = path.to_s
316
- if File.exists?(path)
364
+ if File.exist?(path)
317
365
  YAML.load_file(path, **{})
318
366
  else
319
367
  {}
320
368
  end
321
369
  end
322
-
323
- def has_status?(dat, status)
324
- return false if dat['status'].nil?
325
-
326
- dat['status'].map { |h| h.key?(status) }
327
- .include?(true)
328
- end
329
-
330
- def load_tsv(path)
331
- return enum_for(:load_tsv, path) unless block_given?
332
-
333
- data = CSV.read(path, headers: true, col_sep: "\t", encoding: 'UTF-8')
334
- data.each { |row| yield row }
335
- end
336
370
  end
337
371
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module LucaRecord
4
- VERSION = '0.2.13'
4
+ VERSION = '0.2.18'
5
5
  end
@@ -3,6 +3,7 @@
3
3
  require 'date'
4
4
  require 'securerandom'
5
5
  require 'digest/sha1'
6
+ require 'luca_support/config'
6
7
 
7
8
  # implement Luca IDs convention
8
9
  module LucaSupport
@@ -12,7 +13,7 @@ module LucaSupport
12
13
  def encode_txid(num)
13
14
  txmap = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'
14
15
  l = txmap.length
15
- txmap[num / (l**2)] + txmap[(num%(l**2)) / l] + txmap[num % l]
16
+ txmap[num / (l**2)] + txmap[(num % (l**2)) / l] + txmap[num % l]
16
17
  end
17
18
 
18
19
  def decode_txid(id)
@@ -44,7 +45,12 @@ module LucaSupport
44
45
  num.to_s.reverse.gsub!(/(\d{3})(?=\d)/, '\1,').reverse!
45
46
  end
46
47
 
48
+ # encode directory name from year and month.
47
49
  #
50
+ def encode_dirname(date_obj)
51
+ date_obj.year.to_s + encode_month(date_obj)
52
+ end
53
+
48
54
  # Month to code conversion.
49
55
  # Date, DateTime, String, Integer is valid input. If nil, returns empty String for consistency.
50
56
  #
@@ -72,8 +78,40 @@ module LucaSupport
72
78
  Digest::SHA1.hexdigest(SecureRandom.uuid)
73
79
  end
74
80
 
81
+ def decimalize(obj)
82
+ case obj.class.name
83
+ when 'Array'
84
+ obj.map { |i| decimalize(i) }
85
+ when 'Hash'
86
+ obj.inject({}) { |h, (k, v)| h[k] = decimalize(v); h }
87
+ when 'Integer'
88
+ BigDecimal(obj.to_s)
89
+ when 'String'
90
+ /^[0-9\.]+$/.match(obj) ? BigDecimal(obj) : obj
91
+ when 'Float'
92
+ raise 'already float'
93
+ else
94
+ obj
95
+ end
96
+ end
97
+
98
+ def readable(obj, len = LucaSupport::Config::DECIMAL_NUM)
99
+ case obj.class.name
100
+ when 'Array'
101
+ obj.map { |i| readable(i) }
102
+ when 'Hash'
103
+ obj.inject({}) { |h, (k, v)| h[k] = readable(v); h }
104
+ when 'BigDecimal'
105
+ parts = obj.round(len).to_s('F').split('.')
106
+ len < 1 ? parts.first : "#{parts[0]}.#{parts[1][0, len]}"
107
+ else
108
+ obj
109
+ end
110
+ end
111
+
75
112
  #
76
- # convert effective/defunct data into current hash on @date
113
+ # convert effective/defunct data into current hash on @date.
114
+ # not parse nested children.
77
115
  #
78
116
  def parse_current(dat)
79
117
  {}.tap do |processed|
@@ -92,11 +130,11 @@ module LucaSupport
92
130
  # - effective: 2020-1-1
93
131
  # rank: 5
94
132
  # point: 1000
95
- # => { 'effective' => 2020-1-1, 'rank' => 5, '' => 'point' => 1000 }
133
+ # => { 'effective' => 2020-1-1, 'rank' => 5, 'point' => 1000 }
96
134
  #
97
135
  def take_current(dat, item)
98
136
  target = dat.dig(item)
99
- if target.class.name == 'Array' && target.map(&:keys).flatten.include?('effective')
137
+ if target.is_a?(Array) && target.map(&:keys).flatten.include?('effective')
100
138
  latest = target
101
139
  .filter { |a| Date.parse(a.dig('effective').to_s) < @date }
102
140
  .max { |a, b| Date.parse(a.dig('effective').to_s) <=> Date.parse(b.dig('effective').to_s) }
@@ -107,5 +145,12 @@ module LucaSupport
107
145
  target
108
146
  end
109
147
  end
148
+
149
+ def has_status?(dat, status)
150
+ return false if dat['status'].nil?
151
+
152
+ dat['status'].map { |h| h.key?(status) }
153
+ .include?(true)
154
+ end
110
155
  end
111
156
  end
@@ -1,11 +1,20 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require 'pathname'
4
+ require 'yaml'
5
+
3
6
  #
4
7
  # startup config
5
8
  #
6
9
  module LucaSupport
7
10
  module Config
8
11
  # Project top directory.
9
- Pjdir = Dir.pwd.freeze
12
+ Pjdir = ENV['LUCA_TEST_DIR'] || Dir.pwd.freeze
13
+ if File.exist?(Pathname(Pjdir) / 'config.yml')
14
+ DECIMAL_NUM = YAML.load_file(Pathname(Pjdir) / 'config.yml', **{})['decimal_number']
15
+ COUNTRY = YAML.load_file(Pathname(Pjdir) / 'config.yml', **{})['country']
16
+ DECIMAL_NUM ||= 0 if COUNTRY == 'jp'
17
+ end
18
+ DECIMAL_NUM ||= 2
10
19
  end
11
20
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: lucarecord
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.13
4
+ version: 0.2.18
5
5
  platform: ruby
6
6
  authors:
7
7
  - Chuma Takahiro
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2020-10-05 00:00:00.000000000 Z
11
+ date: 2020-11-08 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: mail
@@ -28,44 +28,44 @@ dependencies:
28
28
  name: bundler
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - "~>"
31
+ - - ">="
32
32
  - !ruby/object:Gem::Version
33
33
  version: '1.17'
34
34
  type: :development
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - "~>"
38
+ - - ">="
39
39
  - !ruby/object:Gem::Version
40
40
  version: '1.17'
41
41
  - !ruby/object:Gem::Dependency
42
- name: rake
42
+ name: minitest
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
45
  - - "~>"
46
46
  - !ruby/object:Gem::Version
47
- version: 12.3.3
47
+ version: '5.0'
48
48
  type: :development
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
52
  - - "~>"
53
53
  - !ruby/object:Gem::Version
54
- version: 12.3.3
54
+ version: '5.0'
55
55
  - !ruby/object:Gem::Dependency
56
- name: minitest
56
+ name: rake
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
- - - "~>"
59
+ - - ">="
60
60
  - !ruby/object:Gem::Version
61
- version: '5.0'
61
+ version: 12.3.3
62
62
  type: :development
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
- - - "~>"
66
+ - - ">="
67
67
  - !ruby/object:Gem::Version
68
- version: '5.0'
68
+ version: 12.3.3
69
69
  description: 'ERP File operation framework
70
70
 
71
71
  '
@@ -87,12 +87,13 @@ files:
87
87
  - lib/luca_support/config.rb
88
88
  - lib/luca_support/mail.rb
89
89
  - lib/luca_support/view.rb
90
- homepage: https://github.com/chumaltd/luca/lucarecord
91
- licenses: []
90
+ homepage: https://github.com/chumaltd/luca/tree/master/lucarecord
91
+ licenses:
92
+ - GPL
92
93
  metadata:
93
- homepage_uri: https://github.com/chumaltd/luca/lucarecord
94
- source_code_uri: https://github.com/chumaltd/luca/lucarecord
95
- changelog_uri: https://github.com/chumaltd/luca/lucarecord/CHANGELOG.md
94
+ homepage_uri: https://github.com/chumaltd/luca/tree/master/lucarecord
95
+ source_code_uri: https://github.com/chumaltd/luca/tree/master/lucarecord
96
+ changelog_uri: https://github.com/chumaltd/luca/tree/master/lucarecord/CHANGELOG.md
96
97
  post_install_message:
97
98
  rdoc_options: []
98
99
  require_paths:
@@ -101,7 +102,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
101
102
  requirements:
102
103
  - - ">="
103
104
  - !ruby/object:Gem::Version
104
- version: '0'
105
+ version: 2.6.0
105
106
  required_rubygems_version: !ruby/object:Gem::Requirement
106
107
  requirements:
107
108
  - - ">="