thot 1.0.0 → 1.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +142 -1
- data/VERSION +1 -1
- data/exe/thot +33 -0
- data/lib/thot/cli.rb +63 -0
- data/lib/thot.rb +16 -9
- data/samples/.env.prod +3 -0
- data/samples/template.txt +1 -0
- data/samples/template2.txt +1 -0
- metadata +13 -7
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 57ada5bc80f13298187297034ec1b9c754cdf0cd2313bd5a2674f8bc8ad2f165
|
4
|
+
data.tar.gz: '0961751bbb5709516c88958ee50fee4e62c0802a9ce7b0d58c72bf1a2d544b1a'
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: bb39588c702fbc6ba92ffb46cc16dff45401f18bd8e82c68e10639f242b0ff571b3119b0ba3be83b83f212dffd6b354cfa1519a13603bba0a32e50e3da1d379f
|
7
|
+
data.tar.gz: a6533192e004e53ea6a9f456a60f11b72fa4e57ff7c9840a19b7e75f7846fa9a8477560f0655f5d2c1ad5d9f3898e4c05c5a52e23124a3f4b9e808a519117782
|
data/README.md
CHANGED
@@ -18,9 +18,150 @@ Or install it yourself as:
|
|
18
18
|
|
19
19
|
$ gem install thot
|
20
20
|
|
21
|
+
|
22
|
+
## Principe
|
23
|
+
|
24
|
+
Thot is a simple templating tool, with :
|
25
|
+
- a template including token, like : %%TOKEN_NAME%% => Token MUST be in uppercase
|
26
|
+
- a hash of data (symbols as keys) corresponding, like : <pre>{token_name: 'value'}</pre>
|
27
|
+
It could generate an output.
|
28
|
+
|
29
|
+
### Usecase
|
30
|
+
|
31
|
+
- with data : <pre>{name: 'Romain'}</pre>
|
32
|
+
- and template content : "Hello %%NAME%% !"
|
33
|
+
|
34
|
+
Thot simply generate :
|
35
|
+
'Hello Romain !'
|
36
|
+
|
37
|
+
### Advanced usecase
|
38
|
+
|
39
|
+
- with data : <pre>{firstname: 'romain', name: 'georges', nickname: 'zaidyur'}</pre>
|
40
|
+
- and template content : "Hello %%FIRSTNAME.capitalize%% %%NAME.upcase%% your nickname is : %%NICKNAME.reverse.capitalize%% !"
|
41
|
+
|
42
|
+
Thot generate :
|
43
|
+
"Hello Romain GEORGES your nickname is : Ruydiaz !"
|
44
|
+
|
45
|
+
|
46
|
+
Thot actually supports String to String piped filters :
|
47
|
+
- filters must be stacked seperated by '.'
|
48
|
+
- filters must be in lowercase
|
49
|
+
- filters must be String instance methods returning a String (Modifier)
|
50
|
+
|
51
|
+
Note : Your could monkey patch String or use Refinment for implementing our own filters.
|
52
|
+
|
53
|
+
|
21
54
|
## Usage
|
22
55
|
|
23
|
-
|
56
|
+
Thot is already a library for you usage and a CLI.
|
57
|
+
|
58
|
+
### Ruby Library usage
|
59
|
+
|
60
|
+
you could use Thot in your Ruby code :
|
61
|
+
|
62
|
+
#### Strict mode and accessor input
|
63
|
+
|
64
|
+
Note : Considering 'template.txt' with : 'Hello %%NAME !!'
|
65
|
+
Note : in strict mode if the Tokens in template file don't match exactly the given token list, Thot raise an exception.
|
66
|
+
|
67
|
+
```ruby
|
68
|
+
require 'thot'
|
69
|
+
include Thot
|
70
|
+
template = Template::new list_token: [:name] , template_file: './template.txt'
|
71
|
+
template.name = 'Romain'
|
72
|
+
puts template.output
|
73
|
+
````
|
74
|
+
|
75
|
+
return
|
76
|
+
|
77
|
+
Hello Romain !!
|
78
|
+
|
79
|
+
|
80
|
+
#### Strict mode false with accesor input and template_content
|
81
|
+
|
82
|
+
```ruby
|
83
|
+
require 'thot'
|
84
|
+
include Thot
|
85
|
+
template = Template::new list_token: [:name, :surname] , template_content: 'Hello %%NAME !!'
|
86
|
+
template.name = 'Romain'
|
87
|
+
puts template.output
|
88
|
+
````
|
89
|
+
|
90
|
+
return
|
91
|
+
|
92
|
+
Hello Romain !!
|
93
|
+
|
94
|
+
#### Strict mode false with map input and template_content
|
95
|
+
|
96
|
+
```ruby
|
97
|
+
require 'thot'
|
98
|
+
include Thot
|
99
|
+
template = Template::new list_token: [:name, :surname] , template_content: 'Hello %%NAME !!'
|
100
|
+
template.map {name: 'Romain', surname: 'Georges' }
|
101
|
+
puts template.output
|
102
|
+
````
|
103
|
+
|
104
|
+
return
|
105
|
+
|
106
|
+
Hello Romain !!
|
107
|
+
|
108
|
+
|
109
|
+
|
110
|
+
### CLI usage
|
111
|
+
|
112
|
+
Thot come with a CLI for templating :
|
113
|
+
- reading from STDIN or list files arguments
|
114
|
+
- getting values from variables file by argument [MANDATORY] --env-var-file FILENAME
|
115
|
+
- display output on STDOUT
|
116
|
+
- verbose mode on STDERR if -v options.
|
117
|
+
|
118
|
+
Note : CLI work only strict mode false, you could have unused keys in datas.
|
119
|
+
|
120
|
+
#### Pre-requisites
|
121
|
+
|
122
|
+
* a file 'template.txt' with : "Hello %%NAME%% !!"
|
123
|
+
* a variables file with lines, like :
|
124
|
+
```
|
125
|
+
key=value
|
126
|
+
key = value
|
127
|
+
key = value
|
128
|
+
# comments and other lines are ignored
|
129
|
+
```
|
130
|
+
|
131
|
+
sample, env.test:
|
132
|
+
|
133
|
+
```
|
134
|
+
name=Romain
|
135
|
+
```
|
136
|
+
|
137
|
+
In the same path
|
138
|
+
|
139
|
+
#### STDIN from echo
|
140
|
+
|
141
|
+
```
|
142
|
+
$ echo "Hello %%NAME%% !!" |thot -e env.test
|
143
|
+
```
|
144
|
+
|
145
|
+
#### STDIN from input
|
146
|
+
|
147
|
+
```
|
148
|
+
$ thot -e env.test < template.txt
|
149
|
+
```
|
150
|
+
|
151
|
+
#### Files list
|
152
|
+
|
153
|
+
```
|
154
|
+
$ thot -e env.test template1.txt template2.txt
|
155
|
+
```
|
156
|
+
|
157
|
+
#### Typical usage
|
158
|
+
|
159
|
+
```
|
160
|
+
$ thot -e env.test < template.txt > output.txt
|
161
|
+
```
|
162
|
+
|
163
|
+
###
|
164
|
+
|
24
165
|
|
25
166
|
## Development
|
26
167
|
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
1.
|
1
|
+
1.1.0
|
data/exe/thot
ADDED
@@ -0,0 +1,33 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
|
4
|
+
require 'optparse'
|
5
|
+
require 'thot'
|
6
|
+
require 'thot/cli'
|
7
|
+
|
8
|
+
options = {}
|
9
|
+
OptionParser.new do |opts|
|
10
|
+
opts.banner = "Usage: thot [options]"
|
11
|
+
opts.on("-v", "--[no-]verbose", "Run verbosely") do |v|
|
12
|
+
options[:verbose] = v
|
13
|
+
end
|
14
|
+
opts.on("-eFILENAME", "--env-var-file=FILENAME", "[MANDATORY] Environment variables file (key=value pairs by line)") do |file|
|
15
|
+
options[:env_var_file] = file
|
16
|
+
end
|
17
|
+
end.parse!
|
18
|
+
|
19
|
+
list_input = ARGV.dup
|
20
|
+
ARGV.clear
|
21
|
+
|
22
|
+
|
23
|
+
include Thot
|
24
|
+
|
25
|
+
cli = CLI::new options: options, list_templates_file: list_input
|
26
|
+
cli.generate
|
27
|
+
|
28
|
+
|
29
|
+
|
30
|
+
|
31
|
+
|
32
|
+
|
33
|
+
|
data/lib/thot/cli.rb
ADDED
@@ -0,0 +1,63 @@
|
|
1
|
+
module Thot
|
2
|
+
class CLI
|
3
|
+
|
4
|
+
def initialize(options: , list_templates_file: nil )
|
5
|
+
@list_templates_file = list_templates_file
|
6
|
+
@options = options
|
7
|
+
getting_data
|
8
|
+
getting_content
|
9
|
+
end
|
10
|
+
|
11
|
+
|
12
|
+
def generate
|
13
|
+
template = Template::new(list_token: @data.keys, template_content: @content, strict: false)
|
14
|
+
template.map @data
|
15
|
+
STDERR.puts "Generating output" if @options[:verbose]
|
16
|
+
puts template.output
|
17
|
+
end
|
18
|
+
|
19
|
+
private
|
20
|
+
|
21
|
+
def getting_data
|
22
|
+
if @options[:env_var_file] then
|
23
|
+
STDERR.puts "Environment file given : #{@options[:env_var_file]}" if @options[:verbose]
|
24
|
+
@data = read_evt_file(@options[:env_var_file])
|
25
|
+
else
|
26
|
+
raise "Environment variables file argument missing, (--env-var-file) "
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
def getting_content
|
31
|
+
@content = ""
|
32
|
+
if @list_templates_file.empty?
|
33
|
+
STDERR.puts "Reading content from STDIN" if @options[:verbose]
|
34
|
+
@content = ARGF.readlines.join
|
35
|
+
else
|
36
|
+
STDERR.puts "Reading content from file(s) : #{@list_templates_file}" if @options[:verbose]
|
37
|
+
@list_templates_file.each do |item|
|
38
|
+
if File::exist? item
|
39
|
+
@content.concat(File::readlines(item).join)
|
40
|
+
else
|
41
|
+
raise "file not found #{item}"
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
def read_evt_file(file)
|
48
|
+
res = {}
|
49
|
+
if File::exist? file
|
50
|
+
content = File::readlines(file)
|
51
|
+
else
|
52
|
+
raise "Environment variables file not found #{file}"
|
53
|
+
end
|
54
|
+
content.each do |line|
|
55
|
+
next if line =~ /#/
|
56
|
+
key,value = line.split('=')
|
57
|
+
res[key.strip.to_sym] = value.strip if value
|
58
|
+
end
|
59
|
+
return res
|
60
|
+
end
|
61
|
+
|
62
|
+
end
|
63
|
+
end
|
data/lib/thot.rb
CHANGED
@@ -17,16 +17,24 @@ module Thot
|
|
17
17
|
attr_reader :content
|
18
18
|
|
19
19
|
# constructor : generate the pseudo accessor for template Class from token list
|
20
|
-
def initialize(template_file: , list_token: , strict: true)
|
20
|
+
def initialize(template_file: nil, list_token: , strict: true, template_content: nil)
|
21
21
|
|
22
22
|
@result = ""
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
23
|
+
if template_file
|
24
|
+
@template_file = template_file
|
25
|
+
raise NoTemplateFile::new('No template file found') unless File::exist?(@template_file)
|
26
|
+
begin
|
27
|
+
@content = IO::readlines(@template_file).join.chomp
|
28
|
+
rescue
|
29
|
+
raise NoTemplateFile::new('Template file read error')
|
30
|
+
end
|
31
|
+
elsif template_content
|
32
|
+
@content = template_content
|
33
|
+
else
|
34
|
+
raise NoTemplateFile::new('No template file found or template content')
|
29
35
|
end
|
36
|
+
|
37
|
+
|
30
38
|
token_from_template = @content.scan(/%%(\w+)%%/).flatten.uniq.map{ |item| item.downcase.to_sym}
|
31
39
|
begin
|
32
40
|
@list_token = list_token
|
@@ -65,7 +73,6 @@ module Thot
|
|
65
73
|
raise ArgumentError::new("#{item} : Not a String") unless val.class == String
|
66
74
|
_data[item.to_s.downcase] = val
|
67
75
|
}
|
68
|
-
raise InvalidTokenList::new("Token list malformation") unless _data.keys.sort == @list_token.map{|_token| _token.to_s }.sort
|
69
76
|
@hash_token = _data
|
70
77
|
end
|
71
78
|
|
@@ -81,7 +88,7 @@ module Thot
|
|
81
88
|
@result = @content
|
82
89
|
@list_token.each{|_token|
|
83
90
|
self.filtering @content.scan(/%%(#{_token.to_s.upcase}[\.\w+]+)%%/).flatten
|
84
|
-
@result.gsub!(/%%#{_token.to_s.upcase}%%/,@hash_token[_token.to_s])
|
91
|
+
@result.gsub!(/%%#{_token.to_s.upcase}%%/,@hash_token[_token.to_s]) if @hash_token.include? _token.to_s
|
85
92
|
}
|
86
93
|
return @result
|
87
94
|
end
|
data/samples/.env.prod
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
Hello %%NAME.capitalize%% %%SURNAME.upcase%% !!
|
@@ -0,0 +1 @@
|
|
1
|
+
Hello %%NAME.capitalize%% %%SURNAME.upcase%% !!
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: thot
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Romain GEORGES
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2022-
|
11
|
+
date: 2022-12-12 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rake
|
@@ -125,7 +125,8 @@ dependencies:
|
|
125
125
|
description: the simpliest way to template in Ruby and command
|
126
126
|
email:
|
127
127
|
- gems@ultragreen.net
|
128
|
-
executables:
|
128
|
+
executables:
|
129
|
+
- thot
|
129
130
|
extensions: []
|
130
131
|
extra_rdoc_files: []
|
131
132
|
files:
|
@@ -139,8 +140,13 @@ files:
|
|
139
140
|
- VERSION
|
140
141
|
- bin/console
|
141
142
|
- bin/setup
|
143
|
+
- exe/thot
|
142
144
|
- lib/thot.rb
|
145
|
+
- lib/thot/cli.rb
|
143
146
|
- lib/thot/version.rb
|
147
|
+
- samples/.env.prod
|
148
|
+
- samples/template.txt
|
149
|
+
- samples/template2.txt
|
144
150
|
- thot.gemspec
|
145
151
|
- ultragreen_roodi_coding_convention.yml
|
146
152
|
homepage: https://github.com/Ultragreen/thot
|
@@ -148,7 +154,7 @@ licenses:
|
|
148
154
|
- MIT
|
149
155
|
metadata:
|
150
156
|
homepage_uri: https://github.com/Ultragreen/thot
|
151
|
-
post_install_message:
|
157
|
+
post_install_message:
|
152
158
|
rdoc_options: []
|
153
159
|
require_paths:
|
154
160
|
- lib
|
@@ -163,8 +169,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
163
169
|
- !ruby/object:Gem::Version
|
164
170
|
version: '0'
|
165
171
|
requirements: []
|
166
|
-
rubygems_version: 3.
|
167
|
-
signing_key:
|
172
|
+
rubygems_version: 3.3.5
|
173
|
+
signing_key:
|
168
174
|
specification_version: 4
|
169
175
|
summary: THe Operative Templating
|
170
176
|
test_files: []
|