lucarecord 0.2.13

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.
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module LucaRecord
4
+ VERSION = '0.2.13'
5
+ end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ module LucaSupport
4
+ autoload :Code, 'luca_support/code'
5
+ autoload :Config, 'luca_support/config'
6
+ autoload :Mail, 'luca_support/mail'
7
+ autoload :View, 'luca_support/view'
8
+
9
+ def self.match_score(a, b, n = 2)
10
+ v_a = to_ngram(a, n)
11
+ v_b = to_ngram(b, n)
12
+
13
+ v_a.map { |item| v_b.include?(item) ? 1 : 0 }.sum / v_a.length.to_f
14
+ end
15
+
16
+ def self.to_ngram(str, n = 2)
17
+ str.each_char.each_cons(n).map(&:join)
18
+ end
19
+ end
@@ -0,0 +1,111 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'date'
4
+ require 'securerandom'
5
+ require 'digest/sha1'
6
+
7
+ # implement Luca IDs convention
8
+ module LucaSupport
9
+ module Code
10
+ module_function
11
+
12
+ def encode_txid(num)
13
+ txmap = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'
14
+ l = txmap.length
15
+ txmap[num / (l**2)] + txmap[(num%(l**2)) / l] + txmap[num % l]
16
+ end
17
+
18
+ def decode_txid(id)
19
+ txmap = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'
20
+ l = txmap.length
21
+ txmap.index(id[0]) * (l**2) + txmap.index(id[1]) * l + txmap.index(id[2])
22
+ end
23
+
24
+ #
25
+ # Day of month to code conversion.
26
+ # Date, DateTime, String, Integer is valid input. If nil, returns empty String for consistency.
27
+ #
28
+ def encode_date(date)
29
+ return '' if date.nil?
30
+
31
+ index = date.day if date.respond_to?(:day)
32
+ index ||= date.to_i if date.respond_to?(:to_i)
33
+ index ||= 0
34
+ raise 'Invalid date specified' if index < 1 || index > 31
35
+
36
+ '0123456789ABCDEFGHIJKLMNOPQRSTUV'[index]
37
+ end
38
+
39
+ def decode_date(char)
40
+ '0123456789ABCDEFGHIJKLMNOPQRSTUV'.index(char)
41
+ end
42
+
43
+ def delimit_num(num)
44
+ num.to_s.reverse.gsub!(/(\d{3})(?=\d)/, '\1,').reverse!
45
+ end
46
+
47
+ #
48
+ # Month to code conversion.
49
+ # Date, DateTime, String, Integer is valid input. If nil, returns empty String for consistency.
50
+ #
51
+ def encode_month(date)
52
+ return '' if date.nil?
53
+
54
+ index = date.month if date.respond_to?(:month)
55
+ index ||= date.to_i if date.respond_to?(:to_i)
56
+ index ||= 0
57
+ raise 'Invalid month specified' if index < 1 || index > 12
58
+
59
+ '0ABCDEFGHIJKL'[index]
60
+ end
61
+
62
+ def decode_month(char)
63
+ '0ABCDEFGHIJKL'.index(char)
64
+ end
65
+
66
+ def decode_term(char)
67
+ m = /^([0-9]{4})([A-La-l])/.match(char)
68
+ [m[1].to_i, decode_month(m[2])]
69
+ end
70
+
71
+ def issue_random_id
72
+ Digest::SHA1.hexdigest(SecureRandom.uuid)
73
+ end
74
+
75
+ #
76
+ # convert effective/defunct data into current hash on @date
77
+ #
78
+ def parse_current(dat)
79
+ {}.tap do |processed|
80
+ dat.each { |k, _v| processed[k] = take_current(dat, k) }
81
+ end
82
+ end
83
+
84
+ #
85
+ # return current value with effective/defunct on target @date
86
+ # For multiple attribues, return hash on other than 'val'. Examples are as bellows:
87
+ #
88
+ # - effective: 2020-1-1
89
+ # val: 3000
90
+ # => 3000
91
+ #
92
+ # - effective: 2020-1-1
93
+ # rank: 5
94
+ # point: 1000
95
+ # => { 'effective' => 2020-1-1, 'rank' => 5, '' => 'point' => 1000 }
96
+ #
97
+ def take_current(dat, item)
98
+ target = dat.dig(item)
99
+ if target.class.name == 'Array' && target.map(&:keys).flatten.include?('effective')
100
+ latest = target
101
+ .filter { |a| Date.parse(a.dig('effective').to_s) < @date }
102
+ .max { |a, b| Date.parse(a.dig('effective').to_s) <=> Date.parse(b.dig('effective').to_s) }
103
+ return nil if !latest.dig('defunct').nil? && Date.parse(latest.dig('defunct').to_s) < @date
104
+
105
+ latest.dig('val') || latest
106
+ else
107
+ target
108
+ end
109
+ end
110
+ end
111
+ end
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ #
4
+ # startup config
5
+ #
6
+ module LucaSupport
7
+ module Config
8
+ # Project top directory.
9
+ Pjdir = Dir.pwd.freeze
10
+ end
11
+ end
@@ -0,0 +1,44 @@
1
+ require "mail"
2
+ require "pathname"
3
+ require "luca_record/io"
4
+
5
+ module LucaSupport
6
+ class Mail
7
+ include LucaRecord::IO
8
+
9
+ def initialize(mail=nil, pjdir=nil)
10
+ @pjdir = pjdir || Dir.pwd
11
+ @config = load_config( Pathname(@pjdir) + "config.yml" )
12
+ @mail = mail
13
+ set_message_default
14
+ @host = set_host
15
+ end
16
+
17
+ def deliver
18
+ # mail gem accepts hash for 2nd param, not keywords
19
+ @mail.delivery_method(:smtp, @host)
20
+ @mail.deliver
21
+ end
22
+
23
+ def set_host
24
+ {
25
+ authentication: :plain,
26
+ address: mail_config("address"),
27
+ port: mail_config("port"),
28
+ doomain: mail_config("domain"),
29
+ user_name: mail_config("user_name"),
30
+ password: mail_config("password")
31
+ }
32
+ end
33
+
34
+ def mail_config(attr=nil)
35
+ return nil if attr.nil?
36
+ @config.dig("mail", attr)
37
+ end
38
+
39
+ def set_message_default
40
+ @mail.from ||= @config.dig("mail", "from")
41
+ @mail.cc ||= @config.dig("mail", "cc")
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,46 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'erb'
4
+ require 'open3'
5
+ require 'pathname'
6
+
7
+ module LucaSupport
8
+ #
9
+ # File rendering functionality like HTML, PDF.
10
+ #
11
+ module View
12
+ module_function
13
+
14
+ def save_pdf(html_dat, path)
15
+ File.write(path, html2pdf(html_dat))
16
+ end
17
+
18
+ def erb2pdf(path)
19
+ html2pdf(render_erb(path))
20
+ end
21
+
22
+ def render_erb(path)
23
+ @template_dir = File.dirname(path)
24
+ erb = ERB.new(File.read(path.to_s), trim_mode: '-')
25
+ erb.result(binding)
26
+ end
27
+
28
+ #
29
+ # Requires wkhtmltopdf command
30
+ #
31
+ def html2pdf(html_dat)
32
+ out, err, stat = Open3.capture3('wkhtmltopdf - -', stdin_data: html_dat)
33
+ puts err
34
+ out
35
+ end
36
+
37
+ def search_template(file, dir = 'templates')
38
+ # TODO: load config
39
+ [@pjdir, lib_path].each do |base|
40
+ path = (Pathname(base) / dir / file)
41
+ return path.to_path if path.file?
42
+ end
43
+ nil
44
+ end
45
+ end
46
+ end
metadata ADDED
@@ -0,0 +1,115 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: lucarecord
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.2.13
5
+ platform: ruby
6
+ authors:
7
+ - Chuma Takahiro
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2020-10-05 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: mail
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: bundler
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '1.17'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '1.17'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rake
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: 12.3.3
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: 12.3.3
55
+ - !ruby/object:Gem::Dependency
56
+ name: minitest
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '5.0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '5.0'
69
+ description: 'ERP File operation framework
70
+
71
+ '
72
+ email:
73
+ - co.chuma@gmail.com
74
+ executables: []
75
+ extensions: []
76
+ extra_rdoc_files: []
77
+ files:
78
+ - CHANGELOG.md
79
+ - LICENSE
80
+ - lib/luca_record.rb
81
+ - lib/luca_record/base.rb
82
+ - lib/luca_record/dict.rb
83
+ - lib/luca_record/io.rb
84
+ - lib/luca_record/version.rb
85
+ - lib/luca_support.rb
86
+ - lib/luca_support/code.rb
87
+ - lib/luca_support/config.rb
88
+ - lib/luca_support/mail.rb
89
+ - lib/luca_support/view.rb
90
+ homepage: https://github.com/chumaltd/luca/lucarecord
91
+ licenses: []
92
+ 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
96
+ post_install_message:
97
+ rdoc_options: []
98
+ require_paths:
99
+ - lib
100
+ required_ruby_version: !ruby/object:Gem::Requirement
101
+ requirements:
102
+ - - ">="
103
+ - !ruby/object:Gem::Version
104
+ version: '0'
105
+ required_rubygems_version: !ruby/object:Gem::Requirement
106
+ requirements:
107
+ - - ">="
108
+ - !ruby/object:Gem::Version
109
+ version: '0'
110
+ requirements: []
111
+ rubygems_version: 3.1.2
112
+ signing_key:
113
+ specification_version: 4
114
+ summary: ERP File operation framework
115
+ test_files: []