general 1.4.2 → 1.5.0

Sign up to get free protection for your applications and to get access to all the features.
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.4.2
4
+ version: 1.5.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-07-22 00:00:00.000000000 Z
11
+ date: 2016-11-02 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rspec
@@ -33,14 +33,30 @@ executables: []
33
33
  extensions: []
34
34
  extra_rdoc_files: []
35
35
  files:
36
+ - LICENSE
37
+ - README.md
38
+ - Rakefile
39
+ - exp/future.general
40
+ - exp/out.txt
41
+ - exp/sample.general
42
+ - lib/gdothash.rb
36
43
  - lib/general.rb
37
- - lib/gio.rb
38
44
  - lib/goperations.rb
39
- - lib/gpartials.rb
40
- - lib/gtemplate.rb
41
- - lib/gtimeformat.rb
42
- - spec/gio_spec.rb
43
- - spec/gtemplate_spec.rb
45
+ - lib/gpartials/gpartial.rb
46
+ - lib/gpartials/gplaceholder.rb
47
+ - lib/gpartials/gtext.rb
48
+ - 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
54
+ - spec/gdothash_spec.rb
55
+ - spec/goperations_spec.rb
56
+ - spec/gpartial_spec.rb
57
+ - spec/gplaceholder_spec.rb
58
+ - spec/gtemplates_spec.rb
59
+ - spec/gtext_spec.rb
44
60
  - spec/spec_require.rb
45
61
  homepage: https://andydevs.github.io/general
46
62
  licenses:
data/lib/gpartials.rb DELETED
@@ -1,191 +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
- # General is a templating system in ruby
18
- #
19
- # Author: Anshul Kharbanda
20
- # Created: 3 - 4 - 2016
21
- module General
22
- private
23
-
24
- # Represents a plain string partial in a GTemplate
25
- #
26
- # Author: Anshul Kharbanda
27
- # Created: 7 - 1 - 2016
28
- class GPartialString
29
- # Initializes the GPartialString with the given string
30
- #
31
- # Parameter: string - the string value of the GPartialString
32
- def initialize(string, match=nil)
33
- @string = match ? string[0...match.begin(0)] : string
34
- end
35
-
36
- # Returns the string
37
- #
38
- # Returns: the string
39
- def apply(data); @string; end
40
-
41
- # Returns the string
42
- #
43
- # Returns: the string
44
- def to_s; @string; end
45
- end
46
-
47
- # Represents a placeholder partial in a GTemplate
48
- #
49
- # Author: Anshul Kharbanda
50
- # Created: 7 - 1 - 2016
51
- class GPlaceholder
52
- # Regular expression that matches placeholders
53
- REGEX = /@\((?<name>[a-zA-Z]\w*)\s*(\:\s*(?<default>.*?))?\s*(->\s*(?<operation>[\w+\s+]+))?\)/
54
-
55
- # Read name
56
- attr :name
57
-
58
- # Initializes the GPlaceholder with the given match
59
- #
60
- # Parameter: match - the match data from the string being parsed
61
- # Parameter: defaults - the hash of default data from the GTemplate
62
- def initialize match, defaults
63
- @name = match[:name].to_sym
64
- @operation = match[:operation]
65
- @defaults = defaults
66
- end
67
-
68
- # Returns the value of the placeholder in the given data
69
- # with the given operation performed on it
70
- #
71
- # Parameter: data - the data being applied
72
- #
73
- # Return: the value of the placeholder in the given data
74
- # with the given operation performed on it
75
- def apply data
76
- # Get value from either data or defaults
77
- value = data[@name] || @defaults[@name]
78
-
79
- # Return value (operation performed if one is defined)
80
- return (@operation ? General::GOperations.send(@operation, value) : value).to_s
81
- end
82
-
83
- # Returns the string representation of the placeholder
84
- #
85
- # Return: the string representation of the placeholder
86
- def to_s
87
- str = "@(#{@name}"
88
- str += ": #{@defaults[@name]}" if @defaults[@name]
89
- str += "-> #{@operation}" if @operation
90
- return str + ")"
91
- end
92
- end
93
-
94
- # Represents an array placeholder partial in a GTemplate
95
- #
96
- # Author: Anshul Kharbanda
97
- # Created: 7 - 1 - 2016
98
- class GArrayPlaceholder
99
- # Regular expression that matches array placeholders
100
- REGEX = /@\[(?<name>[a-zA-Z]\w*)\]( +|\n+)?(?<text>.*?)( +|\n+)?@\[(?<delimeter>.+)?\]/m
101
-
102
- # Default delimeter
103
- DEFAULT_DELIMETER = " "
104
-
105
- # Read name
106
- attr :name
107
-
108
- # Initializes the GPlaceholder with the given match
109
- #
110
- # Parameter: match - the match data from the string being parsed
111
- def initialize match
112
- @name = match[:name].to_sym
113
- @delimeter = match[:delimeter] || DEFAULT_DELIMETER
114
- @template = General::GTemplate.new match[:text]
115
- end
116
-
117
- # Returns the value of the array placeholder in the given data
118
- # formatted by the given GTemplate and joined by the given delimeter
119
- #
120
- # Parameter: data - the data being applied
121
- #
122
- # Return: the value of the array placeholder in the given data
123
- # formatted by the given GTemplate and joined by the given delimeter
124
- def apply(data); @template.apply_all(data[@name]).join(@delimeter); end
125
-
126
- # Returns the string representation of the array placeholder
127
- #
128
- # Return: the string representation of the array placeholder
129
- def to_s; "@[#{@name}] #{@template.to_s} @[#{@delimeter.inspect}]"; end
130
- end
131
-
132
- # Represents an timeformat placeholder partial in a GTimeFormat
133
- #
134
- # Author: Anshul Kharbanda
135
- # Created: 7 - 1 - 2016
136
- class GTimeFormatPlaceholder
137
- # Regular expression that matches timeformat placeholders
138
- REGEX = /@(?<type>[A-Z]+)/
139
-
140
- # Read type
141
- attr :type
142
-
143
- # Initializes the GTimeFormatPlaceholder with the given match
144
- #
145
- # Parameter: match - the match data from the string being parsed
146
- def initialize(match); @type = match[:type]; end
147
-
148
- # Returns the value of the timeformat placeholder in the given time value
149
- # formatted according to the time format type
150
- #
151
- # Parameter: value - the time value being applied
152
- #
153
- # Return: the value of the timeformat placeholder in the given time value
154
- # formatted according to the time format type
155
- def apply value
156
- if value.is_a? Integer
157
- map = type_map(value).to_s
158
- return is_justify? ? map.rjust(@type.length, '0') : map
159
- else
160
- raise TypeError.new "Expected Integer, got: #{value.class}"
161
- end
162
- end
163
-
164
- # Returns true if the timeformat placeholder is a justifiable type
165
- #
166
- # Return: true if the timeformat placeholder is a justifiable type
167
- def is_justify?; "HIMS".include? @type[0]; end
168
-
169
- # Returns the string representation of the timeformat placeholder
170
- #
171
- # Return: the string representation of the timeformat placeholder
172
- def to_s; return "@#{@type}"; end
173
-
174
- private
175
-
176
- # Returns the value modified according to the raw timeformat type
177
- #
178
- # Parameter: value - the time value being applied
179
- #
180
- # Return: the value modified according to the raw timeformat type
181
- def type_map value
182
- case @type[0]
183
- when "H" then return (value / 3600)
184
- when "I" then return (value / 3600 % 12 + 1)
185
- when "M" then return (value % 3600 / 60)
186
- when "S" then return (value % 3600 % 60)
187
- when "A" then return (value / 3600 > 11 ? 'PM' : 'AM')
188
- end
189
- end
190
- end
191
- end
data/lib/gtemplate.rb DELETED
@@ -1,118 +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 "goperations"
18
- require_relative "gpartials"
19
-
20
- # General is a templating system in ruby
21
- #
22
- # Author: Anshul Kharbanda
23
- # Created: 3 - 4 - 2016
24
- module General
25
- # Implements the general templating system for strings
26
- #
27
- # Author: Anshul Kharbanda
28
- # Created: 3 - 4 - 2016
29
- class GTemplate
30
- # Creates a GTemplate with the given template string
31
- #
32
- # Parameter: string - the string being converted to a template
33
- def initialize string
34
- # The string gets split into partials by placeholder and array template
35
- @partials = []
36
- @defaults = {}
37
-
38
- parse_string string
39
- end
40
-
41
- # Returns a string representation of the string
42
- #
43
- # Return: a string representation of the string
44
- def to_s; @partials.collect(&:to_s).join; end
45
-
46
- # Applies the given data to the template and returns the generated string
47
- #
48
- # Parameter: data - the data to be applied (as a hash. merges with defaults)
49
- #
50
- # Return: string of the template with the given data applied
51
- def apply(data={}); @partials.collect { |partial| partial.apply(data) }.join; end
52
-
53
- # Applies each data structure in the array independently to the template
54
- # and returns an array of the generated strings
55
- #
56
- # Parameter: array - the array of data to be applied
57
- # (each data hash will be merged with defaults)
58
- #
59
- # Return: array of strings generated from the template with the given data applied
60
- def apply_all(array); array.collect { |data| apply(data) }; end
61
-
62
- private
63
-
64
- # Returns true if given string has a placeholder
65
- #
66
- # Parameter: string - the string to check for a placeholder
67
- #
68
- # Return: true if given string has a placeholder
69
- def has_next string
70
- next_p = General::GPlaceholder::REGEX =~ string
71
- next_a = General::GArrayPlaceholder::REGEX =~ string
72
- return !((next_p.nil? || next_p < 0) && (next_a.nil? || next_a < 0))
73
- end
74
-
75
- # Returns true if the next placeholder is an aray placeholder
76
- #
77
- # Parameter: string - the string to check for an array placeholder
78
- #
79
- # Return: true if the next placeholder is an aray placeholder
80
- def next_array_placeholder string
81
- next_p = General::GPlaceholder::REGEX =~ string
82
- next_a = General::GArrayPlaceholder::REGEX =~ string
83
- return !(next_a.nil? || next_p.nil?) && next_a < next_p
84
- end
85
-
86
- # Parses the string into General template data
87
- #
88
- # Parameter: string - the string to parse
89
- def parse_string string
90
- # While there is still a placeholder or array placeholder in string
91
- while has_next string
92
- # If next is array placeholder, process array placeholder
93
- if next_array_placeholder string
94
- # Split match and add partials
95
- match = General::GArrayPlaceholder::REGEX.match string
96
- @partials << General::GPartialString.new(string, match) \
97
- << General::GArrayPlaceholder.new(match)
98
-
99
- # Else process placeholder
100
- else
101
- # Split match and add partials
102
- match = General::GPlaceholder::REGEX.match string
103
- @partials << General::GPartialString.new(string, match) \
104
- << General::GPlaceholder.new(match, @defaults)
105
-
106
- # Push default information
107
- @defaults[match[:name].to_sym] ||= match[:default]
108
- end
109
-
110
- # Trim string
111
- string = string[match.end(0)..-1]
112
- end
113
-
114
- # Add end of string
115
- @partials << General::GPartialString.new(string)
116
- end
117
- end
118
- end
data/lib/gtimeformat.rb DELETED
@@ -1,53 +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
- require_relative "gpartials"
19
-
20
- # General is a templating system in ruby
21
- #
22
- # Author: Anshul Kharbanda
23
- # Created: 3 - 4 - 2016
24
- module General
25
- # A special template used for formatting time strings
26
- #
27
- # Author: Anshul Kharbanda
28
- # Created: 7 - 2 - 2016
29
- class GTimeFormat < GTemplate
30
- private
31
-
32
- # Parses the given string into GTimeFormat partials
33
- #
34
- # Parameter: string - the string to parse
35
- def parse_string string
36
- # While a GTimeFormatPlaceholder remains
37
- while !(General::GTimeFormatPlaceholder::REGEX =~ string).nil? \
38
- && (General::GTimeFormatPlaceholder::REGEX =~ string) > -1
39
-
40
- # Split match and add partials
41
- match = General::GTimeFormatPlaceholder::REGEX.match string
42
- @partials << General::GPartialString.new(string, match) \
43
- << General::GTimeFormatPlaceholder.new(match)
44
-
45
- # Trim string
46
- string = string[match.end(0)..-1]
47
- end
48
-
49
- # Add end partial of string
50
- @partials << General::GPartialString.new(string)
51
- end
52
- end
53
- end
data/spec/gio_spec.rb DELETED
@@ -1,64 +0,0 @@
1
- require "spec_require"
2
-
3
- describe General::GIO do
4
- before :all do
5
- @gio = General::GIO.load("exp/sample" + General::GIO::EXTENSION)
6
- @out = "exp/out.txt"
7
- @phony = 3
8
- @data = {name: "joe", food: "Joe's Schmoes"}
9
- @default_text = "There once was a chef name Gordon Ramsay, and he loved eating carrots."
10
- @applied_text = "There once was a chef name Joe, and he loved eating Joe's Schmoes."
11
- end
12
-
13
- describe "#new" do
14
- it "creates a new GIO with the given template string" do
15
- expect(@gio).to be_an_instance_of General::GIO
16
- end
17
- end
18
-
19
- describe "#write" do
20
- context "with target and no data" do
21
- context 'if target is string' do
22
- it "writes the default data to the file with the given filename (the target string)" do
23
- @gio.write @out
24
- expect(IO.read(@out)).to eql @default_text
25
- end
26
- end
27
-
28
- context 'if target is io' do
29
- it "writes the default data to the target io" do
30
- File.open(@out, "w+") { |ios| @gio.write ios }
31
- expect(IO.read(@out)).to eql @default_text
32
- end
33
- end
34
-
35
- context 'if target is not string or io' do
36
- it "raises TypeError" do
37
- expect{ @gio.write(@phony) }.to raise_error TypeError
38
- end
39
- end
40
- end
41
-
42
- context "with target and given data" do
43
- context 'if target is string' do
44
- it "writes the given data to the file with the given filename (the target string)" do
45
- @gio.write @out, @data
46
- expect(IO.read(@out)).to eql @applied_text
47
- end
48
- end
49
-
50
- context 'if target is io' do
51
- it "writes the given data to the target io" do
52
- File.open(@out, "w+") { |ios| @gio.write ios, @data }
53
- expect(IO.read(@out)).to eql @applied_text
54
- end
55
- end
56
-
57
- context 'if target is not string or io' do
58
- it "raises TypeError" do
59
- expect{ @gio.write(@phony, @data) }.to raise_error TypeError
60
- end
61
- end
62
- end
63
- end
64
- end
@@ -1,93 +0,0 @@
1
- require "spec_require"
2
-
3
- describe General::GTemplate do
4
- before :all do
5
- # General template test
6
- @template1 = General::GTemplate.new "There once was a man named @(name: Gordon Ramsay). @(name) loved @(food: Cat Food)!"
7
- @default_text = "There once was a man named Gordon Ramsay. Gordon Ramsay loved Cat Food!"
8
- @all_applied_text = "There once was a man named Joe. Joe loved Joe's Shmoes!"
9
- @name_applied_text = "There once was a man named Dog. Dog loved Cat Food!"
10
- @food_applied_text = "There once was a man named Gordon Ramsay. Gordon Ramsay loved Denny's Fennies!"
11
- @data1 = {name: "Joe", food: "Joe's Shmoes"}
12
- @name = "Dog"
13
- @food = "Denny's Fennies"
14
-
15
- # General array template test
16
- @template2 = General::GTemplate.new "@[greetings] Hello, @(name)! How is the @(pet)? @[\n]"
17
- @data2 = {greetings: [
18
- {name: "Ben", pet: "dog"},
19
- {name: "Jen", pet: "cat"},
20
- {name: "Ken", pet: "plant"}
21
- ]}
22
- @applied_text2 = "Hello, Ben! How is the dog?\nHello, Jen! How is the cat?\nHello, Ken! How is the plant?"
23
-
24
- # General array template and placeholders test
25
- @template3 = General::GTemplate.new "@(film: The Dark Knight)\nCrew:\n@[crew] \t@(name): @(role) @[\n]\nScore: @(score)/10"
26
- @data3 = {
27
- film: 'Batman Begins',
28
- crew: [
29
- {name: 'David S Goyer', role: 'Writer'},
30
- {name: 'Chris Nolan', role: 'Director'},
31
- {name: 'Wally Pfister', role: 'Director of Photography'},
32
- {name: 'Michael Caine', role: 'Alfred Pennyworth'},
33
- {name: 'Christian Bale', role: 'Bruce Wayne/Batman'}
34
- ],
35
- score: 10
36
- }
37
- @applied_text3 = "Batman Begins\nCrew:\n\tDavid S Goyer: Writer\n\tChris Nolan: Director\n\tWally Pfister: Director of Photography" \
38
- "\n\tMichael Caine: Alfred Pennyworth\n\tChristian Bale: Bruce Wayne/Batman\nScore: 10/10"
39
-
40
- # General operations test
41
- @template4 = General::GTemplate.new "There once was a dog named @(name: dog -> capitalize). @(name -> capitalize) earned @(amount -> dollars) last week."
42
- @data4 = {name: "cat", amount: 19999}
43
- @applied_text4 = "There once was a dog named Cat. Cat earned $199.99 last week."
44
- end
45
-
46
- describe "#new" do
47
- it "Creates a new GTemplate with the given template string" do
48
- expect(@template1).to be_an_instance_of General::GTemplate
49
- expect(@template2).to be_an_instance_of General::GTemplate
50
- expect(@template3).to be_an_instance_of General::GTemplate
51
- expect(@template4).to be_an_instance_of General::GTemplate
52
- end
53
- end
54
-
55
- describe "#apply" do
56
- context "with no data" do
57
- it "returns the template with the default data applied" do
58
- expect(@template1.apply).to eql @default_text
59
- end
60
- end
61
-
62
- context "with partial data" do
63
- it "returns the template with the given data applied to corresponding placeholders and default data applied to the rest" do
64
- expect(@template1.apply(name: @name)).to eql @name_applied_text
65
- expect(@template1.apply(food: @food)).to eql @food_applied_text
66
- end
67
- end
68
-
69
- context "with all data" do
70
- it "returns the template with the given data applied" do
71
- expect(@template1.apply(@data1)).to eql @all_applied_text
72
- end
73
- end
74
-
75
- context "with array template" do
76
- it "returns the template with the given array data applied and formatted according to the template" do
77
- expect(@template2.apply(@data2)).to eql @applied_text2
78
- end
79
- end
80
-
81
- context "with array template and regular placeholder" do
82
- it "returns the template with the given data applied (including array data) and formatted according to the template" do
83
- expect(@template3.apply(@data3)).to eql @applied_text3
84
- end
85
- end
86
-
87
- context "with placeholder operation" do
88
- it "returns the template with the given array data applied and formatted according to the format operations" do
89
- expect(@template4.apply(@data4)).to eql @applied_text4
90
- end
91
- end
92
- end
93
- end