template-ruby 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (66) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +1 -0
  3. data/.rspec +1 -0
  4. data/Gemfile +3 -0
  5. data/Gemfile.lock +70 -0
  6. data/lib/code/node/base_10_decimal.rb +27 -0
  7. data/lib/code/node/base_10_integer.rb +23 -0
  8. data/lib/code/node/base_10_number.rb +19 -0
  9. data/lib/code/node/base_16_number.rb +19 -0
  10. data/lib/code/node/base_2_number.rb +19 -0
  11. data/lib/code/node/base_8_number.rb +19 -0
  12. data/lib/code/node/boolean.rb +13 -0
  13. data/lib/code/node/call.rb +19 -0
  14. data/lib/code/node/code.rb +19 -0
  15. data/lib/code/node/dictionnary.rb +18 -0
  16. data/lib/code/node/dictionnary_key_value.rb +23 -0
  17. data/lib/code/node/list.rb +13 -0
  18. data/lib/code/node/name.rb +17 -0
  19. data/lib/code/node/nothing.rb +12 -0
  20. data/lib/code/node/number.rb +23 -0
  21. data/lib/code/node/statement.rb +31 -0
  22. data/lib/code/node/string.rb +17 -0
  23. data/lib/code/node.rb +4 -0
  24. data/lib/code/object/boolean.rb +28 -0
  25. data/lib/code/object/decimal.rb +31 -0
  26. data/lib/code/object/dictionnary.rb +32 -0
  27. data/lib/code/object/integer.rb +29 -0
  28. data/lib/code/object/list.rb +37 -0
  29. data/lib/code/object/nothing.rb +22 -0
  30. data/lib/code/object/string.rb +30 -0
  31. data/lib/code/object.rb +11 -0
  32. data/lib/code/parser/boolean.rb +14 -0
  33. data/lib/code/parser/call.rb +16 -0
  34. data/lib/code/parser/code.rb +18 -0
  35. data/lib/code/parser/dictionnary.rb +41 -0
  36. data/lib/code/parser/list.rb +29 -0
  37. data/lib/code/parser/name.rb +49 -0
  38. data/lib/code/parser/nothing.rb +17 -0
  39. data/lib/code/parser/number.rb +98 -0
  40. data/lib/code/parser/statement.rb +11 -0
  41. data/lib/code/parser/string.rb +66 -0
  42. data/lib/code/parser.rb +4 -0
  43. data/lib/code.rb +27 -0
  44. data/lib/template/node/code_part.rb +13 -0
  45. data/lib/template/node/part.rb +19 -0
  46. data/lib/template/node/template.rb +13 -0
  47. data/lib/template/node/text_part.rb +13 -0
  48. data/lib/template/node.rb +4 -0
  49. data/lib/template/parser/template.rb +26 -0
  50. data/lib/template/parser.rb +4 -0
  51. data/lib/template-ruby.rb +6 -0
  52. data/lib/template.rb +20 -0
  53. data/spec/code/parser/boolean_spec.rb +18 -0
  54. data/spec/code/parser/call_spec.rb +39 -0
  55. data/spec/code/parser/dictionnary_spec.rb +46 -0
  56. data/spec/code/parser/list_spec.rb +29 -0
  57. data/spec/code/parser/name_spec.rb +15 -0
  58. data/spec/code/parser/nothing_spec.rb +19 -0
  59. data/spec/code/parser/number_spec.rb +117 -0
  60. data/spec/code/parser/string_spec.rb +29 -0
  61. data/spec/code_spec.rb +35 -0
  62. data/spec/spec_helper.rb +1 -0
  63. data/spec/template/parser/template_spec.rb +19 -0
  64. data/spec/template_spec.rb +30 -0
  65. data/template-ruby.gemspec +20 -0
  66. metadata +188 -0
@@ -0,0 +1,19 @@
1
+ require "spec_helper"
2
+
3
+ RSpec.describe Code::Parser::Nothing do
4
+ subject { described_class.new.parse(input) }
5
+
6
+ [
7
+ ["nothing", { nothing: "nothing" }],
8
+ ["null", { nothing: "null" }],
9
+ ["nil", { nothing: "nil" }]
10
+ ].each do |(input, expected)|
11
+ context input.inspect do
12
+ let(:input) { input }
13
+
14
+ it "succeeds" do
15
+ expect(subject).to eq(expected)
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,117 @@
1
+ require "spec_helper"
2
+
3
+ RSpec.describe Code::Parser::Number do
4
+ subject { described_class.new.parse(input) }
5
+
6
+ [
7
+ ["1", { number: { base_10: { integer: { whole: "1" } } } }],
8
+ ["3", { number: { base_10: { integer: { whole: "3" } } } }],
9
+ ["1.0", { number: { base_10: { decimal: { whole: "1", decimal: "0" } } } }],
10
+ [
11
+ "-1.0",
12
+ {
13
+ number: {
14
+ base_10: {
15
+ decimal: {
16
+ sign: "-",
17
+ whole: "1",
18
+ decimal: "0"
19
+ }
20
+ }
21
+ }
22
+ }
23
+ ],
24
+ [
25
+ "+1.0",
26
+ {
27
+ number: {
28
+ base_10: {
29
+ decimal: {
30
+ sign: "+",
31
+ whole: "1",
32
+ decimal: "0"
33
+ }
34
+ }
35
+ }
36
+ }
37
+ ],
38
+ ["0", { number: { base_10: { integer: { whole: "0" } } } }],
39
+ ["+0", { number: { base_10: { integer: { sign: "+", whole: "0" } } } }],
40
+ ["-0", { number: { base_10: { integer: { sign: "-", whole: "0" } } } }],
41
+ ["0b010", { number: { base_2: "010" } }],
42
+ ["0o01234567", { number: { base_8: "01234567" } }],
43
+ [
44
+ "0x0123456789aAbBcCdDeEfF",
45
+ { number: { base_16: "0123456789aAbBcCdDeEfF" } }
46
+ ],
47
+ [
48
+ "10e20",
49
+ {
50
+ number: {
51
+ base_10: {
52
+ integer: {
53
+ whole: "10",
54
+ exponent: {
55
+ integer: {
56
+ whole: "20"
57
+ }
58
+ }
59
+ }
60
+ }
61
+ }
62
+ }
63
+ ],
64
+ [
65
+ "10.34e23.45",
66
+ {
67
+ number: {
68
+ base_10: {
69
+ decimal: {
70
+ whole: "10",
71
+ decimal: "34",
72
+ exponent: {
73
+ decimal: {
74
+ whole: "23",
75
+ decimal: "45"
76
+ }
77
+ }
78
+ }
79
+ }
80
+ }
81
+ }
82
+ ],
83
+ [
84
+ "+10e-20e1.0",
85
+ {
86
+ number: {
87
+ base_10: {
88
+ integer: {
89
+ sign: "+",
90
+ whole: "10",
91
+ exponent: {
92
+ integer: {
93
+ sign: "-",
94
+ whole: "20",
95
+ exponent: {
96
+ decimal: {
97
+ whole: "1",
98
+ decimal: "0"
99
+ }
100
+ }
101
+ }
102
+ }
103
+ }
104
+ }
105
+ }
106
+ }
107
+ ]
108
+ ].each do |(input, expected)|
109
+ context input.inspect do
110
+ let(:input) { input }
111
+
112
+ it "succeeds" do
113
+ expect(subject).to eq(expected)
114
+ end
115
+ end
116
+ end
117
+ end
@@ -0,0 +1,29 @@
1
+ require "spec_helper"
2
+
3
+ RSpec.describe Code::Parser::String do
4
+ subject { described_class.new.parse(input) }
5
+
6
+ [
7
+ ["'hello'", { string: "hello" }],
8
+ ['"hello"', { string: "hello" }],
9
+ ["''", { string: "" }],
10
+ ['""', { string: "" }],
11
+ ["'\\''", { string: "'" }],
12
+ ['"\\t"', { string: "\\t" }],
13
+ ["'\\r'", { string: "\\r" }],
14
+ ['"\\b\\f\\n\\r\\t"', { string: "\\b\\f\\n\\r\\t" }],
15
+ ['"\\uABCG"', { string: "uABCG" }],
16
+ [
17
+ "'\\u0123\\u4567\\u89aA\\ubBcC\\UdDeE\\ufFfF'",
18
+ { string: "\\u0123\\u4567\\u89aA\\ubBcC\\UdDeE\\ufFfF" }
19
+ ]
20
+ ].each do |(input, expected)|
21
+ context input.inspect do
22
+ let(:input) { input }
23
+
24
+ it "succeeds" do
25
+ expect(subject).to eq(expected)
26
+ end
27
+ end
28
+ end
29
+ end
data/spec/code_spec.rb ADDED
@@ -0,0 +1,35 @@
1
+ require "spec_helper"
2
+
3
+ RSpec.describe Code do
4
+ subject { described_class.evaluate(input).to_s }
5
+
6
+ [
7
+ ["nothing", ""],
8
+ ["null", ""],
9
+ ["nil", ""],
10
+ %w[true true],
11
+ %w[false false],
12
+ %w[1 1],
13
+ %w[1.2 1.2],
14
+ %w[0b10 2],
15
+ %w[0o10 8],
16
+ %w[0x10 16],
17
+ %w[1e2 100],
18
+ %w[1.2e2.2 190.1871830953336182242521644],
19
+ %w[1e1e1 10000000000],
20
+ %w['hello' hello],
21
+ %w["hello" hello],
22
+ ["user", ""],
23
+ ["user.first_name", ""],
24
+ ["[true, 1, nothing]", "[true, 1, nothing]"],
25
+ ['{a: 1, "b": 2}', '{"a" => 1, "b" => 2}']
26
+ ].each do |(input, expected)|
27
+ context input.inspect do
28
+ let(:input) { input }
29
+
30
+ it "succeeds" do
31
+ expect(subject).to eq(expected)
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1 @@
1
+ require_relative "../lib/template-ruby"
@@ -0,0 +1,19 @@
1
+ require "spec_helper"
2
+
3
+ RSpec.describe Template::Parser::Template do
4
+ subject { described_class.new.parse(input) }
5
+
6
+ [
7
+ ["hello", [{ text: "hello" }]],
8
+ ["hello {name}", [{ text: "hello " }, { code: [{ name: "name" }] }]],
9
+ ["{name", [{ code: [{ name: "name" }] }]]
10
+ ].each do |(input, expected)|
11
+ context input.inspect do
12
+ let(:input) { input }
13
+
14
+ it "succeeds" do
15
+ expect(subject).to eq(expected)
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,30 @@
1
+ require "spec_helper"
2
+
3
+ RSpec.describe Template do
4
+ subject { described_class.render(input, input_context) }
5
+
6
+ [
7
+ ["Hello World", "", "Hello World"],
8
+ ["1 + 1 = {2}", "", "1 + 1 = 2"],
9
+ ["Hello {name}", '{ name: "Dorian" }', "Hello Dorian"],
10
+ [
11
+ "Hello {user.first_name}",
12
+ '{ user: { first_name: "Dorian" } }',
13
+ "Hello Dorian"
14
+ ],
15
+ [
16
+ "Hello {user.first_name}",
17
+ "",
18
+ "Hello "
19
+ ]
20
+ ].each do |(input, input_context, expected)|
21
+ context "#{input.inspect} #{input_context.inspect}" do
22
+ let(:input) { input }
23
+ let(:input_context) { input_context }
24
+
25
+ it "succeeds" do
26
+ expect(subject).to eq(expected)
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,20 @@
1
+ Gem::Specification.new do |s|
2
+ s.name = "template-ruby"
3
+ s.version = "0.1.0"
4
+ s.summary = "A templating programming language"
5
+ s.description = 'Like "Hello {name}" with {name: "Dorian"} gives "Hello Dorian"'
6
+ s.authors = ["Dorian Marié"]
7
+ s.email = "dorian@dorianmarie.fr"
8
+ s.files = `git ls-files`.split($/)
9
+ s.test_files = s.files.grep(%r{^(test|spec|features)/})
10
+ s.require_paths = ["lib"]
11
+ s.homepage = "https://github.com/dorianmariefr/template-ruby"
12
+ s.license = "MIT"
13
+
14
+ s.add_dependency "activesupport", "~> 7"
15
+ s.add_dependency "parslet", "~> 2"
16
+ s.add_dependency "zeitwerk", "~> 2"
17
+
18
+ s.add_development_dependency "prettier", "~> 3"
19
+ s.add_development_dependency "rspec", "~> 3"
20
+ end
metadata ADDED
@@ -0,0 +1,188 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: template-ruby
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Dorian Marié
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2022-07-28 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: activesupport
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '7'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '7'
27
+ - !ruby/object:Gem::Dependency
28
+ name: parslet
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '2'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '2'
41
+ - !ruby/object:Gem::Dependency
42
+ name: zeitwerk
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '2'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '2'
55
+ - !ruby/object:Gem::Dependency
56
+ name: prettier
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '3'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '3'
69
+ - !ruby/object:Gem::Dependency
70
+ name: rspec
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '3'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '3'
83
+ description: 'Like "Hello {name}" with {name: "Dorian"} gives "Hello Dorian"'
84
+ email: dorian@dorianmarie.fr
85
+ executables: []
86
+ extensions: []
87
+ extra_rdoc_files: []
88
+ files:
89
+ - ".gitignore"
90
+ - ".rspec"
91
+ - Gemfile
92
+ - Gemfile.lock
93
+ - lib/code.rb
94
+ - lib/code/node.rb
95
+ - lib/code/node/base_10_decimal.rb
96
+ - lib/code/node/base_10_integer.rb
97
+ - lib/code/node/base_10_number.rb
98
+ - lib/code/node/base_16_number.rb
99
+ - lib/code/node/base_2_number.rb
100
+ - lib/code/node/base_8_number.rb
101
+ - lib/code/node/boolean.rb
102
+ - lib/code/node/call.rb
103
+ - lib/code/node/code.rb
104
+ - lib/code/node/dictionnary.rb
105
+ - lib/code/node/dictionnary_key_value.rb
106
+ - lib/code/node/list.rb
107
+ - lib/code/node/name.rb
108
+ - lib/code/node/nothing.rb
109
+ - lib/code/node/number.rb
110
+ - lib/code/node/statement.rb
111
+ - lib/code/node/string.rb
112
+ - lib/code/object.rb
113
+ - lib/code/object/boolean.rb
114
+ - lib/code/object/decimal.rb
115
+ - lib/code/object/dictionnary.rb
116
+ - lib/code/object/integer.rb
117
+ - lib/code/object/list.rb
118
+ - lib/code/object/nothing.rb
119
+ - lib/code/object/string.rb
120
+ - lib/code/parser.rb
121
+ - lib/code/parser/boolean.rb
122
+ - lib/code/parser/call.rb
123
+ - lib/code/parser/code.rb
124
+ - lib/code/parser/dictionnary.rb
125
+ - lib/code/parser/list.rb
126
+ - lib/code/parser/name.rb
127
+ - lib/code/parser/nothing.rb
128
+ - lib/code/parser/number.rb
129
+ - lib/code/parser/statement.rb
130
+ - lib/code/parser/string.rb
131
+ - lib/template-ruby.rb
132
+ - lib/template.rb
133
+ - lib/template/node.rb
134
+ - lib/template/node/code_part.rb
135
+ - lib/template/node/part.rb
136
+ - lib/template/node/template.rb
137
+ - lib/template/node/text_part.rb
138
+ - lib/template/parser.rb
139
+ - lib/template/parser/template.rb
140
+ - spec/code/parser/boolean_spec.rb
141
+ - spec/code/parser/call_spec.rb
142
+ - spec/code/parser/dictionnary_spec.rb
143
+ - spec/code/parser/list_spec.rb
144
+ - spec/code/parser/name_spec.rb
145
+ - spec/code/parser/nothing_spec.rb
146
+ - spec/code/parser/number_spec.rb
147
+ - spec/code/parser/string_spec.rb
148
+ - spec/code_spec.rb
149
+ - spec/spec_helper.rb
150
+ - spec/template/parser/template_spec.rb
151
+ - spec/template_spec.rb
152
+ - template-ruby.gemspec
153
+ homepage: https://github.com/dorianmariefr/template-ruby
154
+ licenses:
155
+ - MIT
156
+ metadata: {}
157
+ post_install_message:
158
+ rdoc_options: []
159
+ require_paths:
160
+ - lib
161
+ required_ruby_version: !ruby/object:Gem::Requirement
162
+ requirements:
163
+ - - ">="
164
+ - !ruby/object:Gem::Version
165
+ version: '0'
166
+ required_rubygems_version: !ruby/object:Gem::Requirement
167
+ requirements:
168
+ - - ">="
169
+ - !ruby/object:Gem::Version
170
+ version: '0'
171
+ requirements: []
172
+ rubygems_version: 3.3.18
173
+ signing_key:
174
+ specification_version: 4
175
+ summary: A templating programming language
176
+ test_files:
177
+ - spec/code/parser/boolean_spec.rb
178
+ - spec/code/parser/call_spec.rb
179
+ - spec/code/parser/dictionnary_spec.rb
180
+ - spec/code/parser/list_spec.rb
181
+ - spec/code/parser/name_spec.rb
182
+ - spec/code/parser/nothing_spec.rb
183
+ - spec/code/parser/number_spec.rb
184
+ - spec/code/parser/string_spec.rb
185
+ - spec/code_spec.rb
186
+ - spec/spec_helper.rb
187
+ - spec/template/parser/template_spec.rb
188
+ - spec/template_spec.rb