general 1.5.0 → 2.0.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.
Files changed (59) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +166 -20
  3. data/Rakefile +11 -2
  4. data/exp/expected/applied1.txt +1 -0
  5. data/exp/expected/applied2.txt +3 -0
  6. data/exp/expected/applied3.txt +9 -0
  7. data/exp/expected/default1.txt +1 -0
  8. data/exp/expected/default2.txt +3 -0
  9. data/exp/expected/default3.txt +9 -0
  10. data/exp/out/sample1.txt +1 -0
  11. data/exp/out/sample2.txt +3 -0
  12. data/exp/out/sample3.txt +9 -0
  13. data/exp/templates/sample0.general +7 -0
  14. data/exp/templates/sample1.general +1 -0
  15. data/exp/templates/sample2.general +3 -0
  16. data/exp/templates/sample3.general +4 -0
  17. data/exp/templates/sampleE0.general +7 -0
  18. data/exp/templates/sampleE1.general +3 -0
  19. data/exp/templates/sampleE2.general +3 -0
  20. data/exp/templates/sampleE3.general +7 -0
  21. data/lib/general.rb +3 -3
  22. data/lib/gerror.rb +33 -0
  23. data/lib/goperations.rb +95 -27
  24. data/lib/gpartials/garrayplaceholder.rb +87 -0
  25. data/lib/gpartials/gfullplaceholder.rb +63 -0
  26. data/lib/gpartials/gpartial.rb +11 -1
  27. data/lib/gpartials/gplaceholder.rb +1 -52
  28. data/lib/gpartials/gspecial.rb +81 -0
  29. data/lib/gpartials/gtext.rb +5 -33
  30. data/lib/gprepartials/gextend.rb +42 -0
  31. data/lib/gprepartials/ginclude.rb +47 -0
  32. data/lib/gprepartials/gprepartial.rb +45 -0
  33. data/lib/gprepartials/gpretext.rb +33 -0
  34. data/lib/gprepartials/gyield.rb +33 -0
  35. data/lib/{templates → gtemplates}/gbasetemplate.rb +46 -3
  36. data/lib/gtemplates/gio.rb +143 -0
  37. data/lib/gtemplates/gmeta.rb +106 -0
  38. data/lib/{templates → gtemplates}/gtemplate.rb +10 -30
  39. data/lib/{templates → gtemplates}/gtimeformat.rb +6 -12
  40. data/spec/gdothash_spec.rb +6 -10
  41. data/spec/goperations_spec.rb +112 -82
  42. data/spec/gpartial_garrayplaceholder_spec.rb +165 -0
  43. data/spec/gpartial_gfullplaceholder_spec.rb +82 -0
  44. data/spec/gpartial_gplaceholder_spec.rb +237 -0
  45. data/spec/gpartial_gspecial_spec.rb +88 -0
  46. data/spec/gpartial_gtext_spec.rb +87 -0
  47. data/spec/gtamplate_gtemplate_spec.rb +266 -0
  48. data/spec/gtemplate_gio_spec.rb +147 -0
  49. data/spec/gtemplate_gtimeformat_spec.rb +77 -0
  50. data/spec/spec_require.rb +7 -4
  51. metadata +41 -13
  52. data/exp/future.general +0 -11
  53. data/exp/out.txt +0 -1
  54. data/exp/sample.general +0 -1
  55. data/lib/templates/gio.rb +0 -68
  56. data/spec/garrayplaceholder_spec.rb +0 -163
  57. data/spec/gplaceholder_spec.rb +0 -300
  58. data/spec/gtemplates_spec.rb +0 -480
  59. data/spec/gtext_spec.rb +0 -150
@@ -0,0 +1,266 @@
1
+ # General is a templating system in ruby
2
+ # Copyright (C) 2016 Anshul Kharbanda
3
+ #
4
+ # This program is free software: you can redistribute it and/or modify
5
+ # it under the terms of the GNU General Public License as published by
6
+ # the Free Software Foundation, either version 3 of the License, or
7
+ # (at your option) any later version.
8
+ #
9
+ # This program is distributed in the hope that it will be useful,
10
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
11
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12
+ # GNU General Public License for more details.
13
+ #
14
+ # You should have received a copy of the GNU General Public License
15
+ # along with this program. If not, see <http://www.gnu.org/licenses/>.
16
+
17
+ require "spec_require"
18
+
19
+ # Describe General::GTemplate
20
+ #
21
+ # Implements the general templating system for strings
22
+ #
23
+ # Author: Anshul Kharbanda
24
+ # Created: 3 - 4 - 2016
25
+ describe General::GTemplate do
26
+ # Before all
27
+ before :all do
28
+ class Person
29
+ def initialize nam, food
30
+ @name = nam
31
+ @food = food
32
+ end
33
+ def generalized
34
+ {name: @name,
35
+ food: @food}
36
+ end
37
+ end
38
+
39
+ @template1 = General::GTemplate.new "There once was a man named @(name: Gordon Ramsay). @(name) loved @(food: Cat Food)!"
40
+ @template2 = General::GTemplate.new "@(user)@at;@(domain)"
41
+ @template3 = General::GTemplate.new "@[greetings] Hello, @(name)! How is the @(pet)? @[\n]"
42
+ @template4 = General::GTemplate.new "@(film: The Dark Knight)\nCrew:\n@[crew] \t@(name): @(role) @[\n]\nScore: @(score)/10"
43
+ @template5 = General::GTemplate.new "There once was a dog named @(name: dog -> capitalize). @(name -> capitalize) earned @(amount -> money) last week."
44
+ @template6 = General::GTemplate.new "There once was a cat named @(name -> capitalize all)."
45
+ @template7 = General::GTemplate.new "The time is @(time -> time). It may also be formatted as @(time -> time '@SS <- @MM <- @HH')"
46
+ @template8 = General::GTemplate.new "The name's @(name.last)... @(name.first) @(name.last)."
47
+ @template9 = General::GTemplate.new "My favorite color is @#!"
48
+ @template10 = General::GTemplate.new "@[list -> split] Need @#! @[\n]"
49
+ end
50
+
51
+ # Describe General::GTemplate::new
52
+ #
53
+ # Creates a GTemplate with the given template string
54
+ #
55
+ # Parameter: string - the string being converted to a template
56
+ describe "::new" do
57
+ it "creates a new GTemplate with the given template string" do
58
+ [@template1, @template2, @template3, @template4, @template5,
59
+ @template6, @template7, @template8, @template9, @template10]
60
+ .each{ |template| expect(template).to be_an_instance_of General::GTemplate }
61
+ end
62
+ end
63
+
64
+ # Describe General::GTemplate#apply
65
+ #
66
+ # Applies the given data to the template and returns the generated string
67
+ #
68
+ # Parameter: data - the data to be applied (as a hash. merges with defaults)
69
+ #
70
+ # Return: string of the template with the given data applied
71
+ describe "#apply" do
72
+ # ---------------------------------------------DATA----------------------------------------------
73
+ before :all do
74
+ # -------------------------------------BASIC PLACEHOLDER-------------------------------------
75
+ @data1 = {name: "Joe", food: "Joe's Shmoes"}
76
+ @name = "Dog"
77
+ @food = "Denny's Fennies"
78
+
79
+ @default_text = "There once was a man named Gordon Ramsay. Gordon Ramsay loved Cat Food!"
80
+ @name_text = "There once was a man named Dog. Dog loved Cat Food!"
81
+ @food_text = "There once was a man named Gordon Ramsay. Gordon Ramsay loved Denny's Fennies!"
82
+ @all_text = "There once was a man named Joe. Joe loved Joe's Shmoes!"
83
+
84
+ # ------------------------------------SPECIAL CHARACTERS------------------------------------
85
+ @data2 = { user: "hillary", domain: "clinton.org" }
86
+ @text2 = "hillary@clinton.org"
87
+
88
+ # --------------------------------------ARRAY TEMPLATE--------------------------------------
89
+ @data3 = {
90
+ greetings: [
91
+ {name: "Ben", pet: "dog"},
92
+ {name: "Jen", pet: "cat"},
93
+ {name: "Ken", pet: "plant"}
94
+ ]
95
+ }
96
+ @text3 = "Hello, Ben! How is the dog?\nHello, Jen! How is the cat?\nHello, Ken! How is the plant?"
97
+
98
+ @data4 = {
99
+ film: 'Batman Begins',
100
+ crew: [
101
+ {name: 'David S. Goyer', role: 'Writer'},
102
+ {name: 'Chris Nolan', role: 'Director'},
103
+ {name: 'Wally Pfister', role: 'Director of Photography'},
104
+ {name: 'Michael Caine', role: 'Alfred Pennyworth'},
105
+ {name: 'Christian Bale', role: 'Bruce Wayne/Batman'}
106
+ ],
107
+ score: 10
108
+ }
109
+ @text4 = "Batman Begins\nCrew:\n\tDavid S. Goyer: Writer\n\tChris Nolan: Director\n\tWally Pfister: Director of Photography" \
110
+ "\n\tMichael Caine: Alfred Pennyworth\n\tChristian Bale: Bruce Wayne/Batman\nScore: 10/10"
111
+
112
+ # ---------------------------------------OPERATIONS-----------------------------------------
113
+ @data5 = {name: "cat", amount: 19999}
114
+ @text5 = "There once was a dog named Cat. Cat earned $199.99 last week."
115
+
116
+ @data6 = {name: "joe schmoe"}
117
+ @text6 = "There once was a cat named Joe Schmoe."
118
+
119
+ hrs = 3; min = 14; sec = 12; pm = true
120
+ @data7 = {
121
+ time: ( ((pm ? 11 : 0) + hrs)*3600 + min*60 + sec )
122
+ }
123
+
124
+ @text7 = "The time is #{hrs}:#{min.to_s.rjust(2,'0')}:#{sec.to_s.rjust(2,'0')} #{pm ? 'PM' : 'AM'}. " \
125
+ "It may also be formatted as #{sec.to_s.rjust(2,'0')} <- #{min.to_s.rjust(2,'0')} <- #{((pm ? 11 : 0) + hrs).to_s.rjust(2,'0')}"
126
+
127
+ # --------------------------------------DOT NOTATION----------------------------------------
128
+ @data9 = General::GDotHash.new name: {first: "Gordon", last: "Ramsay"}
129
+ @text9 = "The name's Ramsay... Gordon Ramsay."
130
+
131
+ # ------------------------------------FULL PLACEHOLDER--------------------------------------
132
+ @data10 = "Gilbert"
133
+ @text10 = "My favorite color is Gilbert!"
134
+
135
+ # -----------------------------------TO-ARRAY OPERATION-------------------------------------
136
+ @data11 = {list: "Butter\nMilk\nEggs"}
137
+ @text11 = "Need Butter!\nNeed Milk!\nNeed Eggs!"
138
+
139
+ # ----------------------------------GENERALIZED INTERFACE-----------------------------------
140
+ @data12 = Person.new "Joe", "Joe's Schmoes"
141
+ @text12 = "There once was a man named Joe. Joe loved Joe's Schmoes!"
142
+ end
143
+
144
+ # ---------------------------------------------TEST----------------------------------------------
145
+
146
+ it "returns the template with data/defaults applied to corresponding placeholders" do
147
+ expect(@template1.apply).to eql @default_text
148
+ expect(@template1.apply name: @name).to eql @name_text
149
+ expect(@template1.apply food: @food).to eql @food_text
150
+ expect(@template1.apply @data1).to eql @all_text
151
+ end
152
+
153
+ it 'formats special @; characters appropriately' do
154
+ expect(@template2.apply @data2).to eql @text2
155
+ end
156
+
157
+ it "formatts array data according to array templates" do
158
+ expect(@template3.apply @data3).to eql @text3
159
+ expect(@template4.apply @data4).to eql @text4
160
+ end
161
+
162
+ it 'formats data according to given placeholder operations and arguments (if given)' do
163
+ expect(@template5.apply @data5).to eql @text5
164
+ expect(@template6.apply @data6).to eql @text6
165
+ expect(@template7.apply @data7).to eql @text7
166
+ end
167
+
168
+ it "applies data appropriately to dot notation placeholders" do
169
+ expect(@template8.apply @data9).to eql @text9
170
+ end
171
+
172
+ it "applies full data to full placeholders" do
173
+ expect(@template9.apply @data10).to eql @text10
174
+ end
175
+
176
+ it "formats array data generated by to-array operations according to array template" do
177
+ expect(@template10.apply @data11).to eql @text11
178
+ end
179
+
180
+ it "returns the template with the generalized data from object applied appropriately" do
181
+ expect(@template1.apply @data12).to eql @text12
182
+ end
183
+ end
184
+
185
+ # Describe General::GTemplate#apply_all
186
+ #
187
+ # Applies each data structure in the array independently to the template
188
+ # and returns an array of the generated strings
189
+ #
190
+ # Parameter: array - the array of data to be applied
191
+ # (each data hash will be merged with defaults)
192
+ #
193
+ # Return: array of strings generated from the template with the given
194
+ # data applied
195
+ describe '#apply_all' do
196
+ before :all do
197
+ @data5 = [
198
+ {name: "Joe", food: "Joe's Schmoes"},
199
+ {name: "Jane", food: "Jane's Danes"},
200
+ {name: "Denny", food: "Denny's Fennies"}
201
+ ]
202
+
203
+ @text5 = [
204
+ "There once was a man named Joe. Joe loved Joe's Schmoes!",
205
+ "There once was a man named Jane. Jane loved Jane's Danes!",
206
+ "There once was a man named Denny. Denny loved Denny's Fennies!"
207
+ ]
208
+ end
209
+
210
+ it 'applies all the values in the data array individually' do
211
+ expect(@template1.apply_all @data5).to eql @text5
212
+ end
213
+ end
214
+
215
+ # Describe General::GTemplate#regex (depricated)
216
+ #
217
+ # Returns the string as a regex
218
+ #
219
+ # Parameter: sub - true if the template is part of array template
220
+ #
221
+ # Returns: the string as a regex
222
+ describe '#regex (depricated)' do
223
+ before :all do
224
+ @regex1 = /\AThere once was a man named (?<name>.*)\. \k<name> loved (?<food>.*)!\z/
225
+ @sub_regex1 = "There once was a man named (?<name>.*)\\. \\k<name> loved (?<food>.*)!"
226
+ end
227
+
228
+ it 'returns the regex created from the GTemplate if template is not part of array template' do
229
+ expect(@template1.regex).to eql @regex1
230
+ end
231
+
232
+ it 'returns the sub regex string created from the GTemplate if template is part of array template' do
233
+ expect(@template1.regex true).to eql @sub_regex1
234
+ end
235
+ end
236
+
237
+ # Describe General::GTemplate#match (depricated)
238
+ #
239
+ # Matches the given string against the template and returns the
240
+ # collected information. Returns nil if the given string does
241
+ # not match.
242
+ #
243
+ # If a block is given, it will be run with the generated hash
244
+ # if the string matches. Alias for:
245
+ #
246
+ # if m = template.match(string)
247
+ # # Run block
248
+ # end
249
+ #
250
+ # Parameter: string the string to match
251
+ #
252
+ # Return: Information matched from the string or nil
253
+ describe '#match (depricated)' do
254
+ it 'returns the data generated from the string when the given string matches the template regex' do
255
+ expect(@template1.match @all_text).to eql @data1
256
+ end
257
+
258
+ it 'returns nil when the given string does not match the template regex' do
259
+ expect(@template1.match "").to be_nil
260
+ end
261
+
262
+ it 'passes the hash to a block if given' do
263
+ expect{ @template1.match(@all_text) { |hash| expect(hash).to eql @data1 } }.not_to raise_error
264
+ end
265
+ end
266
+ end
@@ -0,0 +1,147 @@
1
+ # General is a templating system in ruby
2
+ # Copyright (C) 2016 Anshul Kharbanda
3
+ #
4
+ # This program is free software: you can redistribute it and/or modify
5
+ # it under the terms of the GNU General Public License as published by
6
+ # the Free Software Foundation, either version 3 of the License, or
7
+ # (at your option) any later version.
8
+ #
9
+ # This program is distributed in the hope that it will be useful,
10
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
11
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12
+ # GNU General Public License for more details.
13
+ #
14
+ # You should have received a copy of the GNU General Public License
15
+ # along with this program. If not, see <http://www.gnu.org/licenses/>.
16
+
17
+ require_relative "spec_require"
18
+
19
+ # Describe General::GIO
20
+ #
21
+ # Implements the general IO writer template
22
+ #
23
+ # Author: Anshul Kharbanda
24
+ # Created: 3 - 4 - 2016
25
+ describe General::GIO do
26
+ before :all do
27
+ @default_data = {place: "virginia"}
28
+ @applied_data = {name: "joe", food: "Joe's Schmoes", place: "kentucky"}
29
+
30
+ @gio1 = General::GIO.load("exp/templates/sample1" + General::GIO::EXTENSION)
31
+ @gio2 = General::GIO.load("exp/templates/sample2" + General::GIO::EXTENSION)
32
+ @gio3 = General::GIO.load("exp/templates/sample3" + General::GIO::EXTENSION)
33
+
34
+ @out1 = "exp/out/sample1.txt"
35
+ @out2 = "exp/out/sample2.txt"
36
+ @out3 = "exp/out/sample3.txt"
37
+ @outF = 3
38
+
39
+ @default_text1 = IO.read "exp/expected/default1.txt"
40
+ @default_text2 = IO.read "exp/expected/default2.txt"
41
+ @default_text3 = IO.read "exp/expected/default3.txt"
42
+
43
+ @applied_text1 = IO.read "exp/expected/applied1.txt"
44
+ @applied_text2 = IO.read "exp/expected/applied2.txt"
45
+ @applied_text3 = IO.read "exp/expected/applied3.txt"
46
+ end
47
+
48
+ # Describe General::GIO::load
49
+ #
50
+ # Loads a GIO from a file with the given path
51
+ #
52
+ # Parameter: path - the path of the file to load
53
+ #
54
+ # Return: GIO loaded from the file
55
+ describe "::load" do
56
+ it "creates a new GIO with the given template string" do
57
+ expect(@gio1).to be_an_instance_of General::GIO
58
+ expect(@gio2).to be_an_instance_of General::GIO
59
+ expect(@gio3).to be_an_instance_of General::GIO
60
+ end
61
+
62
+ it "cannot load GMeta file (with @@yield defined)" do
63
+ expect { General::GIO.load("exp/templates/sample0"+General::GIO::EXTENSION) }.to raise_error General::GError
64
+ end
65
+
66
+ it "cannot load GMeta file with multiple @@yield statements" do
67
+ expect { General::GIO.load("exp/templates/sampleE1"+General::GIO::EXTENSION) }.to raise_error General::GError
68
+ end
69
+
70
+ it "cannot load GIO in which @@extend statement is not at the beginning of the template" do
71
+ expect { General::GIO.load("exp/templates/sampleE2"+General::GIO::EXTENSION) }.to raise_error General::GError
72
+ end
73
+
74
+ it "cannot load GIO with multiple @@extend statements" do
75
+ expect { General::GIO.load("exp/templates/sampleE3"+General::GIO::EXTENSION) }.to raise_error General::GError
76
+ end
77
+ end
78
+
79
+ # Describe General::GIO#write
80
+ #
81
+ # Writes the template with the given data applied to the target stream
82
+ #
83
+ # Parameter: ios - if String, is the name of the file to write to
84
+ # if IO, is the stream to write to
85
+ # Parameter: data - the data to be applied (merges with defaults)
86
+ describe "#write" do
87
+ # -------------------------------------------DEFAULT-------------------------------------------
88
+
89
+ context "with target and default data" do
90
+ it "writes the default data to the file with the given filename" do
91
+ @gio1.write @out1, @default_data
92
+ @gio2.write @out2, @default_data
93
+ @gio3.write @out3, @default_data
94
+
95
+ expect(IO.read @out1).to eql @default_text1
96
+ expect(IO.read @out2).to eql @default_text2
97
+ expect(IO.read @out3).to eql @default_text3
98
+ end
99
+
100
+ it "writes the default data to the given file io" do
101
+ File.open(@out1, "w+") { |ios| @gio1.write ios, @default_data }
102
+ File.open(@out2, "w+") { |ios| @gio2.write ios, @default_data }
103
+ File.open(@out3, "w+") { |ios| @gio3.write ios, @default_data }
104
+
105
+ expect(IO.read @out1).to eql @default_text1
106
+ expect(IO.read @out2).to eql @default_text2
107
+ expect(IO.read @out3).to eql @default_text3
108
+ end
109
+
110
+ it "raises TypeError if target is not string or io" do
111
+ expect{ @gio1.write @outF, @default_data }.to raise_error TypeError
112
+ expect{ @gio2.write @outF, @default_data }.to raise_error TypeError
113
+ expect{ @gio3.write @outF, @default_data }.to raise_error TypeError
114
+ end
115
+ end
116
+
117
+ # --------------------------------------------DATA---------------------------------------------
118
+
119
+ context "with target and given data" do
120
+ it "writes the given data to the file with the given filename" do
121
+ @gio1.write @out1, @applied_data
122
+ @gio2.write @out2, @applied_data
123
+ @gio3.write @out3, @applied_data
124
+
125
+ expect(IO.read @out1).to eql @applied_text1
126
+ expect(IO.read @out2).to eql @applied_text2
127
+ expect(IO.read @out3).to eql @applied_text3
128
+ end
129
+
130
+ it "writes the given data to the given file io" do
131
+ File.open(@out1, "w+") { |ios| @gio1.write ios, @applied_data }
132
+ File.open(@out2, "w+") { |ios| @gio2.write ios, @applied_data }
133
+ File.open(@out3, "w+") { |ios| @gio3.write ios, @applied_data }
134
+
135
+ expect(IO.read @out1).to eql @applied_text1
136
+ expect(IO.read @out2).to eql @applied_text2
137
+ expect(IO.read @out3).to eql @applied_text3
138
+ end
139
+
140
+ it "raises TypeError if target is not string or io" do
141
+ expect{ @gio1.write @outF, @applied_data }.to raise_error TypeError
142
+ expect{ @gio2.write @outF, @applied_data }.to raise_error TypeError
143
+ expect{ @gio3.write @outF, @applied_data }.to raise_error TypeError
144
+ end
145
+ end
146
+ end
147
+ end
@@ -0,0 +1,77 @@
1
+ # General is a templating system in ruby
2
+ # Copyright (C) 2016 Anshul Kharbanda
3
+ #
4
+ # This program is free software: you can redistribute it and/or modify
5
+ # it under the terms of the GNU General Public License as published by
6
+ # the Free Software Foundation, either version 3 of the License, or
7
+ # (at your option) any later version.
8
+ #
9
+ # This program is distributed in the hope that it will be useful,
10
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
11
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12
+ # GNU General Public License for more details.
13
+ #
14
+ # You should have received a copy of the GNU General Public License
15
+ # along with this program. If not, see <http://www.gnu.org/licenses/>.
16
+
17
+ require_relative "spec_require"
18
+
19
+ # Describe General::GTimeFormat
20
+ #
21
+ # A special template used for formatting time strings
22
+ #
23
+ # Author: Anshul Kharbanda
24
+ # Created: 7 - 2 - 2016
25
+ describe General::GTimeFormat do
26
+ before :all do
27
+ # Time value
28
+ @time = (11 + 3)*3600 + 42*60 + 9
29
+
30
+ # Phony value
31
+ @phony = {data: "Time, Yo!"}
32
+
33
+ # Formats
34
+ @format1 = General::GTimeFormat.new "@HH:@MM:@SS"
35
+ @format2 = General::GTimeFormat.new "@I:@MM:@S @A"
36
+ @format3 = General::GTimeFormat.new "@SS - @M - @H (@I @A)"
37
+
38
+ # Applied values
39
+ @applied1 = "14:42:09"
40
+ @applied2 = "3:42:9 PM"
41
+ @applied3 = "09 - 42 - 14 (3 PM)"
42
+ end
43
+
44
+ # Describe General::GTimeFormat::new
45
+ #
46
+ # Creates the GTimeFormat with the given string
47
+ #
48
+ # Parameter: string - the template string
49
+ describe "::new" do
50
+ it "creates a new GTimeFormat with the given format string" do
51
+ expect(@format1).to be_an_instance_of General::GTimeFormat
52
+ expect(@format2).to be_an_instance_of General::GTimeFormat
53
+ expect(@format3).to be_an_instance_of General::GTimeFormat
54
+ end
55
+ end
56
+
57
+ # Describe General::GTimeFormat#apply
58
+ #
59
+ # Applies the given integer value to the template and returns the generated string
60
+ #
61
+ # Parameter: value - the value to be applied (as a hash. merges with defaults)
62
+ #
63
+ # Return: string of the template with the given value applied
64
+ describe "#apply" do
65
+ it "returns the given integer time value value formatted according to the time format" do
66
+ expect(@format1.apply(@time)).to eql @applied1
67
+ expect(@format2.apply(@time)).to eql @applied2
68
+ expect(@format3.apply(@time)).to eql @applied3
69
+ end
70
+
71
+ it "raises TypeError if value given is not integer" do
72
+ expect{ @format1.apply(@phony) }.to raise_error TypeError
73
+ expect{ @format2.apply(@phony) }.to raise_error TypeError
74
+ expect{ @format3.apply(@phony) }.to raise_error TypeError
75
+ end
76
+ end
77
+ end
data/spec/spec_require.rb CHANGED
@@ -16,10 +16,13 @@
16
16
 
17
17
  require_relative "../lib/gdothash"
18
18
  require_relative "../lib/goperations"
19
+ require_relative "../lib/gerror"
19
20
  require_relative "../lib/gpartials/gpartial"
20
21
  require_relative "../lib/gpartials/gtext"
21
22
  require_relative "../lib/gpartials/gplaceholder"
22
- require_relative "../lib/gpartials/gpartial"
23
- require_relative "../lib/templates/gtemplate"
24
- require_relative "../lib/templates/gio"
25
- require_relative "../lib/templates/gtimeformat"
23
+ require_relative "../lib/gpartials/garrayplaceholder"
24
+ require_relative "../lib/gpartials/gfullplaceholder"
25
+ require_relative "../lib/gpartials/gtimeformatplaceholder"
26
+ require_relative "../lib/gtemplates/gtemplate"
27
+ require_relative "../lib/gtemplates/gtimeformat"
28
+ require_relative "../lib/gtemplates/gio"
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: general
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.5.0
4
+ version: 2.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Anshul Kharbanda
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-11-02 00:00:00.000000000 Z
11
+ date: 2017-02-07 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rspec
@@ -36,27 +36,55 @@ files:
36
36
  - LICENSE
37
37
  - README.md
38
38
  - Rakefile
39
- - exp/future.general
40
- - exp/out.txt
41
- - exp/sample.general
39
+ - exp/expected/applied1.txt
40
+ - exp/expected/applied2.txt
41
+ - exp/expected/applied3.txt
42
+ - exp/expected/default1.txt
43
+ - exp/expected/default2.txt
44
+ - exp/expected/default3.txt
45
+ - exp/out/sample1.txt
46
+ - exp/out/sample2.txt
47
+ - exp/out/sample3.txt
48
+ - exp/templates/sample0.general
49
+ - exp/templates/sample1.general
50
+ - exp/templates/sample2.general
51
+ - exp/templates/sample3.general
52
+ - exp/templates/sampleE0.general
53
+ - exp/templates/sampleE1.general
54
+ - exp/templates/sampleE2.general
55
+ - exp/templates/sampleE3.general
42
56
  - lib/gdothash.rb
43
57
  - lib/general.rb
58
+ - lib/gerror.rb
44
59
  - lib/goperations.rb
60
+ - lib/gpartials/garrayplaceholder.rb
61
+ - lib/gpartials/gfullplaceholder.rb
45
62
  - lib/gpartials/gpartial.rb
46
63
  - lib/gpartials/gplaceholder.rb
64
+ - lib/gpartials/gspecial.rb
47
65
  - lib/gpartials/gtext.rb
48
66
  - lib/gpartials/gtimeformatplaceholder.rb
49
- - lib/templates/gbasetemplate.rb
50
- - lib/templates/gio.rb
51
- - lib/templates/gtemplate.rb
52
- - lib/templates/gtimeformat.rb
53
- - spec/garrayplaceholder_spec.rb
67
+ - lib/gprepartials/gextend.rb
68
+ - lib/gprepartials/ginclude.rb
69
+ - lib/gprepartials/gprepartial.rb
70
+ - lib/gprepartials/gpretext.rb
71
+ - lib/gprepartials/gyield.rb
72
+ - lib/gtemplates/gbasetemplate.rb
73
+ - lib/gtemplates/gio.rb
74
+ - lib/gtemplates/gmeta.rb
75
+ - lib/gtemplates/gtemplate.rb
76
+ - lib/gtemplates/gtimeformat.rb
54
77
  - spec/gdothash_spec.rb
55
78
  - spec/goperations_spec.rb
79
+ - spec/gpartial_garrayplaceholder_spec.rb
80
+ - spec/gpartial_gfullplaceholder_spec.rb
81
+ - spec/gpartial_gplaceholder_spec.rb
82
+ - spec/gpartial_gspecial_spec.rb
83
+ - spec/gpartial_gtext_spec.rb
56
84
  - spec/gpartial_spec.rb
57
- - spec/gplaceholder_spec.rb
58
- - spec/gtemplates_spec.rb
59
- - spec/gtext_spec.rb
85
+ - spec/gtamplate_gtemplate_spec.rb
86
+ - spec/gtemplate_gio_spec.rb
87
+ - spec/gtemplate_gtimeformat_spec.rb
60
88
  - spec/spec_require.rb
61
89
  homepage: https://andydevs.github.io/general
62
90
  licenses:
data/exp/future.general DELETED
@@ -1,11 +0,0 @@
1
- @@include sample
2
-
3
- @if(drives: true)
4
-
5
- @(name) drove to the store to get some @(food).
6
-
7
- @else
8
-
9
- @(name) walked thirty blocks uphil to the store to get some @(food)
10
-
11
- @end
data/exp/out.txt DELETED
@@ -1 +0,0 @@
1
- There once was a chef name Joe, and he loved eating Joe's Schmoes. He went to Kentucky.
data/exp/sample.general DELETED
@@ -1 +0,0 @@
1
- There once was a chef name @(name: gordon ramsay -> capitalize all), and he loved eating @(food: carrots). He went to @(place -> capitalize).
data/lib/templates/gio.rb DELETED
@@ -1,68 +0,0 @@
1
- # General is a templating system in ruby
2
- # Copyright (C) 2016 Anshul Kharbanda
3
- #
4
- # This program is free software: you can redistribute it and/or modify
5
- # it under the terms of the GNU General Public License as published by
6
- # the Free Software Foundation, either version 3 of the License, or
7
- # (at your option) any later version.
8
- #
9
- # This program is distributed in the hope that it will be useful,
10
- # but WITHOUT ANY WARRANTY; without even the implied warranty of
11
- # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12
- # GNU General Public License for more details.
13
- #
14
- # You should have received a copy of the GNU General Public License
15
- # along with this program. If not, see <http://www.gnu.org/licenses/>.
16
-
17
- require_relative "gtemplate"
18
-
19
- # General is a templating system in ruby
20
- #
21
- # Author: Anshul Kharbanda
22
- # Created: 3 - 4 - 2016
23
- module General
24
- # Implements the general IO writer template
25
- #
26
- # Author: Anshul Kharbanda
27
- # Created: 3 - 4 - 2016
28
- class GIO < GTemplate
29
- # The general file extension
30
- EXTENSION = ".general"
31
-
32
- # Public read source
33
- attr :source
34
-
35
- # Loads a GIO from a file with the given path
36
- #
37
- # Parameter: path - the path of the file to load
38
- #
39
- # Return: GIO loaded from the file
40
- def self.load path
41
- self.new IO.read(path), path
42
- end
43
-
44
- # Creates a GIO with the given template string and source filename
45
- #
46
- # Parameter: string - the string being converted to a template
47
- # Parameter: source - the name of the source file of the template
48
- def initialize string, source=nil
49
- super string
50
- @source = source
51
- end
52
-
53
- # Writes the template with the given data applied to the target stream
54
- #
55
- # Parameter: ios - if String, is the name of the file to write to
56
- # if IO, is the stream to write to
57
- # Parameter: data - the data to be applied (merges with defaults)
58
- def write ios, data={}
59
- if ios.is_a? String
60
- IO.write ios, apply(data)
61
- elsif ios.is_a? IO
62
- ios.write apply(data)
63
- else
64
- raise TypeError.new "Expected IO or String, got: #{ios.class}"
65
- end
66
- end
67
- end
68
- end