ecg 0.1.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.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 2d432e692077b27ad192543cd69643f2606bdcb4d70d383b989bbdc078d4333c
4
+ data.tar.gz: 1cbf186d08c99dd7da5bf8815dfd08a2a722eaa4a476e7a5d4a4de5e3efe4e2f
5
+ SHA512:
6
+ metadata.gz: b5618862b5b371464e25f4db7c1595e6c26a901a92def5886ce52826d4961deecd82a678c3b9242500fc74cbe5c06729964e739436d0f07f1ba12a8066d6233b
7
+ data.tar.gz: b7ca7953788a10e1e82a5f6a1783d0948811c48bdd2190d2f1fff1be94e2e830f520ce1e5d63e2228b3ec6e83ce0625e1cf8c3321bd1ee315eebe3d669cabe47
data/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2019 Ryo Maeda
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,46 @@
1
+ # ecg
2
+ ecg is an ERB(eRuby) based, simple and powerful configration file generator for general purpose.
3
+
4
+ ## Requirements
5
+ Ruby: 2.4 or higher
6
+
7
+ ## Install
8
+ ```sh
9
+ gem install ecg
10
+ ```
11
+
12
+ ## Simple Usage
13
+ ```sh
14
+ ecg --values name=epaew --values email="epaew.333@gmail.com" < template.json.erb
15
+ {
16
+ "type": "user",
17
+ "name": "epaew",
18
+ "email": "epaew.333@gmail.com"
19
+ }
20
+ ```
21
+ or
22
+ ```sh
23
+ ecg config.yml < template.json.erb
24
+ {
25
+ "type": "user",
26
+ "name": "epaew",
27
+ "email": "epaew.333@gmail.com"
28
+ }
29
+ ```
30
+ with
31
+ * template.json.erb
32
+ ```json
33
+ {
34
+ "type": "user",
35
+ "name": "<%= name %>",
36
+ "email": "<%= email %>"
37
+ }
38
+ ```
39
+ * config.yml
40
+ ```yaml
41
+ name: epaew
42
+ email: epaew.333@gmail.com
43
+ ```
44
+
45
+ ## License
46
+ [MIT](LICENSE)
data/bin/ecg ADDED
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ $LOAD_PATH.unshift File.expand_path('../lib', __dir__)
5
+ require 'ecg'
6
+
7
+ cmd = ECG::Command.new(ARGV)
8
+ cmd.execute
data/lib/ecg.rb ADDED
@@ -0,0 +1,3 @@
1
+ # frozen_string_literal: true
2
+
3
+ Dir[File.expand_path('ecg/*.rb', __dir__)].each(&method(:require))
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'erb'
4
+ require_relative 'option_parser'
5
+ require_relative 'store'
6
+
7
+ module ECG
8
+ class Command
9
+ def initialize(args)
10
+ parser = OptionParser.new(args)
11
+ @store = parser.parse!
12
+ end
13
+
14
+ def execute(input = $stdin, output = $stdout)
15
+ output.puts ERB.new(input.read).result(@store.binding)
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,72 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'optparse'
4
+ require_relative 'store'
5
+
6
+ module ECG
7
+ class LoadError < ::StandardError; end
8
+
9
+ class OptionParser
10
+ attr_reader :args, :option
11
+
12
+ def initialize(args)
13
+ @args = args
14
+ @option = {}
15
+ end
16
+
17
+ def parse!
18
+ parser.parse!(@args)
19
+ print_help(false) if @args.length > 1
20
+
21
+ Store.new(hash)
22
+ end
23
+
24
+ private
25
+
26
+ def banner
27
+ <<~__BANNER__
28
+ Usage: ecg [config.{json,yaml}] [options]
29
+ __BANNER__
30
+ end
31
+
32
+ def hash
33
+ hash = @args.empty? ? {} : load_file(@args.first)
34
+
35
+ hash.merge(@option)
36
+ end
37
+
38
+ def load_file(path)
39
+ case File.extname(path)
40
+ when '.json'
41
+ require 'json'
42
+ File.open(path) { |f| JSON.parse(f.read) }
43
+ when /\A\.ya?ml\z/
44
+ require 'yaml'
45
+ File.open(path) { |f| YAML.safe_load(f.read, [], [], true) }
46
+ else
47
+ raise ArgumentError,
48
+ "Cannot load file `#{path}`. Only JSON/YAML are allowed."
49
+ end
50
+ end
51
+
52
+ def parser
53
+ ::OptionParser.new do |opt|
54
+ opt.banner = banner
55
+
56
+ opt.on('-v', '--values Key=Value', <<~__DESC__) do |str|
57
+ Set the key-value mapping to be embedded in the template.
58
+ __DESC__
59
+
60
+ key, value = str.split('=', 2)
61
+ @option[key] = value
62
+ end
63
+ opt.on('-h', '--help', 'Print this help message', &method(:print_help))
64
+ end
65
+ end
66
+
67
+ def print_help(bool)
68
+ warn parser.help
69
+ exit bool
70
+ end
71
+ end
72
+ end
data/lib/ecg/store.rb ADDED
@@ -0,0 +1,68 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ECG
4
+ class Store
5
+ def initialize(hash)
6
+ map = hash.map { |k, v| [k.to_sym, transform_value(v)] }
7
+ @store = map.to_h
8
+ end
9
+
10
+ def initialize_copy
11
+ super
12
+ @store = @store.dup
13
+ end
14
+
15
+ def binding
16
+ super # NOTE: Kernel.#binding is private
17
+ end
18
+
19
+ def inspect
20
+ detail = @store.map { |k, v| " #{k}=#{v.inspect}" }.join(',')
21
+ "#<#{self.class}#{detail}>"
22
+ end
23
+
24
+ def method_missing(name, *args)
25
+ name = name.to_sym
26
+
27
+ if @store.key?(name)
28
+ transform_value(@store[name])
29
+ elsif @store.respond_to?(name)
30
+ @store.public_send(name)
31
+ else
32
+ super
33
+ end
34
+ end
35
+
36
+ def respond_to_missing?(symbol, include_private = false)
37
+ @store&.key?(symbol.to_sym) || super
38
+ end
39
+
40
+ def to_h
41
+ @store.transform_values do |v|
42
+ case v
43
+ when self.class then v.to_h
44
+ when Array then v.map(&:to_h)
45
+ else v
46
+ end
47
+ end
48
+ end
49
+
50
+ def to_json(*args)
51
+ require 'json'
52
+ to_h.to_json(args)
53
+ end
54
+
55
+ private
56
+
57
+ def transform_value(value)
58
+ case value
59
+ when Hash
60
+ self.class.new(value)
61
+ when Array
62
+ value.map(&method(:transform_value))
63
+ else
64
+ value
65
+ end
66
+ end
67
+ end
68
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ECG
4
+ VERSION = '0.1.0'
5
+ end
metadata ADDED
@@ -0,0 +1,167 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: ecg
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - epaew
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2019-10-19 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :development
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: pry
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rake
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rubocop
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: simplecov
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: simplecov-console
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: test-unit
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - "~>"
102
+ - !ruby/object:Gem::Version
103
+ version: '3.2'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - "~>"
109
+ - !ruby/object:Gem::Version
110
+ version: '3.2'
111
+ - !ruby/object:Gem::Dependency
112
+ name: test-unit-rr
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - "~>"
116
+ - !ruby/object:Gem::Version
117
+ version: '1.0'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - "~>"
123
+ - !ruby/object:Gem::Version
124
+ version: '1.0'
125
+ description: ecg is an ERB(eRuby) based, simple and powerful configration file generator
126
+ for general purpose.
127
+ email:
128
+ - epaew.333@gmail.com
129
+ executables:
130
+ - ecg
131
+ extensions: []
132
+ extra_rdoc_files: []
133
+ files:
134
+ - LICENSE
135
+ - README.md
136
+ - bin/ecg
137
+ - lib/ecg.rb
138
+ - lib/ecg/command.rb
139
+ - lib/ecg/option_parser.rb
140
+ - lib/ecg/store.rb
141
+ - lib/ecg/version.rb
142
+ homepage: https://github.com/epaew/ecg
143
+ licenses:
144
+ - MIT
145
+ metadata:
146
+ allowed_push_host: https://rubygems.org
147
+ post_install_message:
148
+ rdoc_options: []
149
+ require_paths:
150
+ - lib
151
+ required_ruby_version: !ruby/object:Gem::Requirement
152
+ requirements:
153
+ - - ">="
154
+ - !ruby/object:Gem::Version
155
+ version: 2.4.0
156
+ required_rubygems_version: !ruby/object:Gem::Requirement
157
+ requirements:
158
+ - - ">="
159
+ - !ruby/object:Gem::Version
160
+ version: '0'
161
+ requirements: []
162
+ rubygems_version: 3.0.3
163
+ signing_key:
164
+ specification_version: 4
165
+ summary: ecg is an ERB(eRuby) based, simple and powerful configration file generator
166
+ for general purpose.
167
+ test_files: []