thot 0.1.0 → 1.0.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 3bc290fd549f5d8f74f3976bf295caf1948c4034c6b70b6d611481a9062d6192
4
- data.tar.gz: af1047cf61a5570eb1fdb6981689bbc099fd0c01455401a6842d951b36f001f9
3
+ metadata.gz: 66b39148b6f0d21ab8174c953757815943eda80b28000caba1dbdd7821d12ef2
4
+ data.tar.gz: 5a904474b751660d49e77f1c835490b3c945dda97dc49f9d16c427db9664ecdf
5
5
  SHA512:
6
- metadata.gz: b8d2156265be4a1f7521a2a05a9f928e1016e059c55451c4d7f7bc76022f7390888e8361ed6daee4111972b974c0eb06b9b2859767c28d9c8bfbdb15794ff5c0
7
- data.tar.gz: cc24897736a165ee81c3e8f38ba81e5d1926768192ad08c938664e18145a2a16f00a57aa0bb3772745476a63d2c0a77b2623d1a03ba72d77c7c5c6380b036c61
6
+ metadata.gz: 42cb44934894d02699bcd17c3ba22c7d32b2b1effe5d4e19acdc1e6c9662c4fb623103742de2f54d375cbfbcac47086d17ffb4ca2b2771ea34cc13159be020f4
7
+ data.tar.gz: 77c8256484294a9e089a2b7320bdf02382600ffd62e26b4e8967843d91710ad3a23dca2d4cce7b127e49b2126ce0150544604455aaaea727cc975a3d85dc52dd
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
- TODO: Write usage instructions here
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
- 0.1.0
1
+ 1.0.1
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: example.rb [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,62 @@
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
+ if @list_templates_file.empty?
32
+ STDERR.puts "Reading content from STDIN" if @options[:verbose]
33
+ @content = ARGF.readlines.join
34
+ else
35
+ STDERR.puts "Reading content from file(s) : #{@list_templates_file}" if @options[:verbose]
36
+ @list_templates_file.each do |item|
37
+ if File::exist? item
38
+ @content.concat(File::readlines(item)).join
39
+ else
40
+ raise "file not found #{item}"
41
+ end
42
+ end
43
+ end
44
+ end
45
+
46
+ def read_evt_file(file)
47
+ res = {}
48
+ if File::exist? file
49
+ content = File::readlines(file)
50
+ else
51
+ raise "Environment variables file not found #{file}"
52
+ end
53
+ content.each do |line|
54
+ next if line =~ /#/
55
+ key,value = line.split('=')
56
+ res[key.strip.to_sym] = value.strip if value
57
+ end
58
+ return res
59
+ end
60
+
61
+ end
62
+ 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
-
23
- @template_file = template_file
24
- raise NoTemplateFile::new('No template file found') unless File::exist?(@template_file)
25
- begin
26
- @content = IO::readlines(@template_file).join.chomp
27
- rescue
28
- raise NoTemplateFile::new('No template file found')
22
+ @result = ""
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
@@ -39,8 +47,13 @@ module Thot
39
47
  else
40
48
  raise InvalidTokenList::new("Token list doesn't match the template") unless (token_from_template.sort & @list_token.sort) == token_from_template.sort
41
49
  end
42
- @list_token.each{|_token| eval("def #{_token}=(_value); raise ArgumentError::new('Not a String') unless _value.class == String; @hash_token['#{_token}'] = _value ;end")}
43
- @list_token.each{|_token| eval("def #{_token}; @hash_token['#{_token}'] ;end")}
50
+ @list_token.each do |_token|
51
+ self.instance_eval do
52
+ define_singleton_method(:"#{_token}=") {|_value| raise ArgumentError::new('Not a String') unless _value.class == String; @hash_token[__callee__.to_s.chomp('=')] = _value }
53
+ define_singleton_method(_token.to_sym) { return @hash_token[__callee__.to_s] }
54
+ end
55
+ end
56
+
44
57
  end
45
58
 
46
59
  # generic accessor
@@ -73,14 +86,31 @@ module Thot
73
86
  # the templater;proceed to templating
74
87
  # @return [String] the template output
75
88
  def output
76
- _my_res = String::new('')
77
- _my_res = @content
89
+ @result = @content
78
90
  @list_token.each{|_token|
79
- _my_res.gsub!(/%%#{_token.to_s.upcase}%%/,@hash_token[_token.to_s])
91
+ self.filtering @content.scan(/%%(#{_token.to_s.upcase}[\.\w+]+)%%/).flatten
92
+ @result.gsub!(/%%#{_token.to_s.upcase}%%/,@hash_token[_token.to_s])
80
93
  }
81
- return _my_res
94
+ return @result
95
+ end
96
+
97
+ private
98
+
99
+ def filtering(list)
100
+ @filtered_tokens = {}
101
+ list.each do |pipe|
102
+ token, *filters = pipe.split('.')
103
+ @filtered_tokens[pipe] = @hash_token[token.downcase]
104
+ filters.each do |filter|
105
+ @filtered_tokens[pipe] = @filtered_tokens[pipe].send filter.to_sym if @filtered_tokens[pipe].respond_to? filter.to_sym
106
+ end
107
+ end
108
+ @filtered_tokens.each do |item,value|
109
+ @result.gsub!(/%%#{item}%%/,value)
110
+ end
82
111
  end
83
112
 
113
+
84
114
  end
85
115
 
86
116
  # Exception for an invalid Token list
@@ -91,3 +121,6 @@ module Thot
91
121
  class NoTemplateFile < Exception; end
92
122
 
93
123
  end
124
+
125
+
126
+
data/samples/.env.prod ADDED
@@ -0,0 +1,3 @@
1
+ # test
2
+ name=romain
3
+ surname = georges
@@ -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: 0.1.0
4
+ version: 1.0.1
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-10-15 00:00:00.000000000 Z
11
+ date: 2022-10-17 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,12 @@ 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
144
149
  - thot.gemspec
145
150
  - ultragreen_roodi_coding_convention.yml
146
151
  homepage: https://github.com/Ultragreen/thot
@@ -148,7 +153,7 @@ licenses:
148
153
  - MIT
149
154
  metadata:
150
155
  homepage_uri: https://github.com/Ultragreen/thot
151
- post_install_message:
156
+ post_install_message:
152
157
  rdoc_options: []
153
158
  require_paths:
154
159
  - lib
@@ -163,8 +168,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
163
168
  - !ruby/object:Gem::Version
164
169
  version: '0'
165
170
  requirements: []
166
- rubygems_version: 3.2.3
167
- signing_key:
171
+ rubygems_version: 3.1.2
172
+ signing_key:
168
173
  specification_version: 4
169
174
  summary: THe Operative Templating
170
175
  test_files: []