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.
- checksums.yaml +4 -4
- data/README.md +166 -20
- data/Rakefile +11 -2
- data/exp/expected/applied1.txt +1 -0
- data/exp/expected/applied2.txt +3 -0
- data/exp/expected/applied3.txt +9 -0
- data/exp/expected/default1.txt +1 -0
- data/exp/expected/default2.txt +3 -0
- data/exp/expected/default3.txt +9 -0
- data/exp/out/sample1.txt +1 -0
- data/exp/out/sample2.txt +3 -0
- data/exp/out/sample3.txt +9 -0
- data/exp/templates/sample0.general +7 -0
- data/exp/templates/sample1.general +1 -0
- data/exp/templates/sample2.general +3 -0
- data/exp/templates/sample3.general +4 -0
- data/exp/templates/sampleE0.general +7 -0
- data/exp/templates/sampleE1.general +3 -0
- data/exp/templates/sampleE2.general +3 -0
- data/exp/templates/sampleE3.general +7 -0
- data/lib/general.rb +3 -3
- data/lib/gerror.rb +33 -0
- data/lib/goperations.rb +95 -27
- data/lib/gpartials/garrayplaceholder.rb +87 -0
- data/lib/gpartials/gfullplaceholder.rb +63 -0
- data/lib/gpartials/gpartial.rb +11 -1
- data/lib/gpartials/gplaceholder.rb +1 -52
- data/lib/gpartials/gspecial.rb +81 -0
- data/lib/gpartials/gtext.rb +5 -33
- data/lib/gprepartials/gextend.rb +42 -0
- data/lib/gprepartials/ginclude.rb +47 -0
- data/lib/gprepartials/gprepartial.rb +45 -0
- data/lib/gprepartials/gpretext.rb +33 -0
- data/lib/gprepartials/gyield.rb +33 -0
- data/lib/{templates → gtemplates}/gbasetemplate.rb +46 -3
- data/lib/gtemplates/gio.rb +143 -0
- data/lib/gtemplates/gmeta.rb +106 -0
- data/lib/{templates → gtemplates}/gtemplate.rb +10 -30
- data/lib/{templates → gtemplates}/gtimeformat.rb +6 -12
- data/spec/gdothash_spec.rb +6 -10
- data/spec/goperations_spec.rb +112 -82
- data/spec/gpartial_garrayplaceholder_spec.rb +165 -0
- data/spec/gpartial_gfullplaceholder_spec.rb +82 -0
- data/spec/gpartial_gplaceholder_spec.rb +237 -0
- data/spec/gpartial_gspecial_spec.rb +88 -0
- data/spec/gpartial_gtext_spec.rb +87 -0
- data/spec/gtamplate_gtemplate_spec.rb +266 -0
- data/spec/gtemplate_gio_spec.rb +147 -0
- data/spec/gtemplate_gtimeformat_spec.rb +77 -0
- data/spec/spec_require.rb +7 -4
- metadata +41 -13
- data/exp/future.general +0 -11
- data/exp/out.txt +0 -1
- data/exp/sample.general +0 -1
- data/lib/templates/gio.rb +0 -68
- data/spec/garrayplaceholder_spec.rb +0 -163
- data/spec/gplaceholder_spec.rb +0 -300
- data/spec/gtemplates_spec.rb +0 -480
- data/spec/gtext_spec.rb +0 -150
@@ -0,0 +1,143 @@
|
|
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 "gmeta"
|
19
|
+
require_relative "../gerror"
|
20
|
+
require_relative "../gprepartials/gpretext"
|
21
|
+
require_relative "../gprepartials/ginclude"
|
22
|
+
require_relative "../gprepartials/gextend"
|
23
|
+
require_relative "../gprepartials/gyield"
|
24
|
+
|
25
|
+
# General is a templating system in ruby
|
26
|
+
#
|
27
|
+
# Author: Anshul Kharbanda
|
28
|
+
# Created: 3 - 4 - 2016
|
29
|
+
module General
|
30
|
+
# Implements the general IO writer template
|
31
|
+
#
|
32
|
+
# Author: Anshul Kharbanda
|
33
|
+
# Created: 3 - 4 - 2016
|
34
|
+
class GIO < GTemplate
|
35
|
+
# The general file extension
|
36
|
+
EXTENSION = ".general"
|
37
|
+
|
38
|
+
# Public read source
|
39
|
+
attr :source
|
40
|
+
|
41
|
+
# Loads a GIO from a file with the given path
|
42
|
+
#
|
43
|
+
# Parameter: path - the path of the file to load
|
44
|
+
#
|
45
|
+
# Return: GIO loaded from the file
|
46
|
+
def self.load path
|
47
|
+
# Get current working directory
|
48
|
+
cwd = Dir.getwd
|
49
|
+
|
50
|
+
# Change to path of file
|
51
|
+
Dir.chdir File.dirname(path)
|
52
|
+
|
53
|
+
# Read raw text
|
54
|
+
string = IO.read File.basename(path)
|
55
|
+
|
56
|
+
# Prepartial types
|
57
|
+
ptypes = [
|
58
|
+
General::GExtend,
|
59
|
+
General::GInclude,
|
60
|
+
General::GYield,
|
61
|
+
General::GPretext
|
62
|
+
]
|
63
|
+
|
64
|
+
# Breakdown algorithm
|
65
|
+
preparts = []
|
66
|
+
m = nil
|
67
|
+
while string.length > 0
|
68
|
+
# Match the front of the string to a preprocessor
|
69
|
+
prepart = ptypes.find { |ptype| m = ptype::REGEX.match(string) }
|
70
|
+
|
71
|
+
# Raise error if no matching prepart can be found
|
72
|
+
if prepart.nil?
|
73
|
+
Dir.chdir cwd # Make sure to change back to current directory
|
74
|
+
raise GError.new "Unmatched prepartial at #{(string.length <= 5 ? string : string[0..5] + "...").inspect}"
|
75
|
+
end
|
76
|
+
|
77
|
+
# Add the partial to the array
|
78
|
+
preparts << prepart.new(m)
|
79
|
+
|
80
|
+
# Trim the front of the string
|
81
|
+
string = string[m.end(0)..-1]
|
82
|
+
end
|
83
|
+
|
84
|
+
# Find an extend
|
85
|
+
extindex = preparts.index{ |prepart| prepart.is_a? General::GExtend }
|
86
|
+
|
87
|
+
# Run extend algorithm (throw error if extend is found elsewhere)
|
88
|
+
if extindex == 0
|
89
|
+
begin
|
90
|
+
preparts = GMeta.load(preparts[extindex].filename+General::GIO::EXTENSION).gextend(preparts[1..-1])
|
91
|
+
rescue GError => e
|
92
|
+
Dir.chdir cwd # Make sure to change back to current directory
|
93
|
+
raise e
|
94
|
+
end
|
95
|
+
elsif !extindex.nil?
|
96
|
+
Dir.chdir cwd # Make sure to change back to current directory
|
97
|
+
raise GError.new "@@extend prepartial needs to be at beginning of template."
|
98
|
+
end
|
99
|
+
|
100
|
+
# Find a yield
|
101
|
+
yindex = preparts.index{ |prepart| prepart.is_a? General::GYield }
|
102
|
+
|
103
|
+
# Raise error if yield is found
|
104
|
+
unless yindex.nil?
|
105
|
+
Dir.chdir cwd # Make sure to change back to current directory
|
106
|
+
raise GError.new "#{path} is a meta template and cannot be parsed. Must be extended by other GIO template"
|
107
|
+
end
|
108
|
+
|
109
|
+
# Combine text
|
110
|
+
text = preparts.collect{ |prepart| prepart.apply }.join
|
111
|
+
|
112
|
+
# Change to current directory
|
113
|
+
Dir.chdir cwd
|
114
|
+
|
115
|
+
# Return new GIO
|
116
|
+
return self.new text, path
|
117
|
+
end
|
118
|
+
|
119
|
+
# Creates a GIO with the given template string and source filename
|
120
|
+
#
|
121
|
+
# Parameter: string - the string being converted to a template
|
122
|
+
# Parameter: source - the name of the source file of the template
|
123
|
+
def initialize string, source=nil
|
124
|
+
super string
|
125
|
+
@source = source
|
126
|
+
end
|
127
|
+
|
128
|
+
# Writes the template with the given data applied to the target stream
|
129
|
+
#
|
130
|
+
# Parameter: ios - if String, is the name of the file to write to
|
131
|
+
# if IO, is the stream to write to
|
132
|
+
# Parameter: data - the data to be applied (merges with defaults)
|
133
|
+
def write ios, data={}
|
134
|
+
if ios.is_a? String
|
135
|
+
IO.write ios, apply(data)
|
136
|
+
elsif ios.is_a? IO
|
137
|
+
ios.write apply(data)
|
138
|
+
else
|
139
|
+
raise TypeError.new "Expected IO or String, got: #{ios.class}"
|
140
|
+
end
|
141
|
+
end
|
142
|
+
end
|
143
|
+
end
|
@@ -0,0 +1,106 @@
|
|
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
|
+
# Represents an abstract meta file
|
25
|
+
#
|
26
|
+
# Author: Anshul Kharbanda
|
27
|
+
# Created: 1 - 31 - 2016
|
28
|
+
class GMeta < GTemplate
|
29
|
+
def self.load filename
|
30
|
+
# Read file
|
31
|
+
string = IO.read filename
|
32
|
+
|
33
|
+
# Prepartial types
|
34
|
+
ptypes = [
|
35
|
+
General::GExtend,
|
36
|
+
General::GInclude,
|
37
|
+
General::GYield,
|
38
|
+
General::GPretext
|
39
|
+
]
|
40
|
+
|
41
|
+
# Breakdown algorithm
|
42
|
+
preparts = []
|
43
|
+
m = nil
|
44
|
+
loop do
|
45
|
+
# Match the front of the string to a preprocessor
|
46
|
+
prepart = ptypes.find { |ptype| m = ptype::REGEX.match(string) }
|
47
|
+
|
48
|
+
# Raise error if no matching prepart can be found
|
49
|
+
raise GError.new("Unmatched prepartial at #{(string.length <= 5 ? string : string[0..5] + "...").inspect}") if prepart.nil?
|
50
|
+
|
51
|
+
# Add the partial to the array
|
52
|
+
preparts << prepart.new(m)
|
53
|
+
|
54
|
+
# Trim the front of the string
|
55
|
+
string = string[m.end(0)..-1]
|
56
|
+
|
57
|
+
# End when string is empty
|
58
|
+
break if string.length == 0
|
59
|
+
end
|
60
|
+
|
61
|
+
# Find an extend
|
62
|
+
extindex = preparts.index{ |prepart| prepart.is_a? General::GExtend }
|
63
|
+
|
64
|
+
# Run extend algorithm (throw error if extend is found elsewhere)
|
65
|
+
if extindex == 0
|
66
|
+
GMeta.load(extindex.filename).gextend(preparts)
|
67
|
+
elsif !extindex.nil? && extindex > 0
|
68
|
+
raise GError.new "@@extend prepartial needs to be at beginning of template."
|
69
|
+
end
|
70
|
+
|
71
|
+
# Check for multiple yields
|
72
|
+
yields = preparts.find_all{ |prepart| prepart.is_a? General::GYield }
|
73
|
+
raise GError.new "@@yield prepartial can only appear ONCE!" if yields.length > 1
|
74
|
+
|
75
|
+
# Find the yield
|
76
|
+
yindex = preparts.index{ |prepart| prepart.is_a? General::GYield }
|
77
|
+
|
78
|
+
# Return a new meta file if yield is found. Else default is end.
|
79
|
+
unless yindex.nil?
|
80
|
+
return self.new preparts[0...yindex], preparts[(yindex + 1)..-1], filename
|
81
|
+
else
|
82
|
+
return self.new preparts, [], filename
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
# Creates a new GMeta
|
87
|
+
#
|
88
|
+
# Parameter: top - the top end of the meta (in preparts)
|
89
|
+
# Parameter: bottom - the bottom end of the data (in preparts)
|
90
|
+
# Parameter: source - the source of the file
|
91
|
+
def initialize top, bottom, source=nil
|
92
|
+
@top = top
|
93
|
+
@bottom = bottom
|
94
|
+
@source = source
|
95
|
+
end
|
96
|
+
|
97
|
+
# Extends the given preparts from the GMeta
|
98
|
+
#
|
99
|
+
# Parameter: preparts - the preparts array to extend
|
100
|
+
#
|
101
|
+
# Returns: the extended preparts
|
102
|
+
def gextend preparts
|
103
|
+
return @top + preparts + [General::GPretext.new("\r\n")] + @bottom
|
104
|
+
end
|
105
|
+
end
|
106
|
+
end
|
@@ -16,7 +16,10 @@
|
|
16
16
|
|
17
17
|
require_relative "gbasetemplate"
|
18
18
|
require_relative "../gpartials/gtext"
|
19
|
+
require_relative "../gpartials/gspecial"
|
19
20
|
require_relative "../gpartials/gplaceholder"
|
21
|
+
require_relative "../gpartials/garrayplaceholder"
|
22
|
+
require_relative "../gpartials/gfullplaceholder"
|
20
23
|
|
21
24
|
# General is a templating system in ruby
|
22
25
|
#
|
@@ -32,36 +35,13 @@ module General
|
|
32
35
|
#
|
33
36
|
# Parameter: string - the string being converted to a template
|
34
37
|
def initialize string
|
35
|
-
super(string
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
elsif match = General::GSpecial::REGEX.match(string)
|
43
|
-
@partials << General::GSpecial.new(match)
|
44
|
-
elsif match = General::GArrayPlaceholder::REGEX.match(string)
|
45
|
-
@partials << General::GArrayPlaceholder.new(match)
|
46
|
-
elsif match = General::GPlaceholder::REGEX.match(string)
|
47
|
-
@partials << General::GPlaceholder.new(match, @defaults)
|
48
|
-
else
|
49
|
-
return
|
50
|
-
end
|
51
|
-
string = string[match.end(0)..-1]
|
52
|
-
end
|
53
|
-
end
|
54
|
-
|
55
|
-
# Returns a string representation of the string
|
56
|
-
#
|
57
|
-
# Return: a string representation of the string
|
58
|
-
def to_s
|
59
|
-
first = Hash.new(true); str = ""
|
60
|
-
@partials.each do |part|
|
61
|
-
str += part.string(first[part.name])
|
62
|
-
first[part.name] &&= false
|
63
|
-
end
|
64
|
-
return str
|
38
|
+
super(string, [
|
39
|
+
General::GText,
|
40
|
+
General::GSpecial,
|
41
|
+
General::GArrayPlaceholder,
|
42
|
+
General::GPlaceholder,
|
43
|
+
General::GFullPlaceholder
|
44
|
+
])
|
65
45
|
end
|
66
46
|
|
67
47
|
# Returns the string as a regex
|
@@ -16,6 +16,7 @@
|
|
16
16
|
|
17
17
|
require_relative "gbasetemplate"
|
18
18
|
require_relative "../gpartials/gtext"
|
19
|
+
require_relative "../gpartials/gspecial"
|
19
20
|
require_relative "../gpartials/gtimeformatplaceholder"
|
20
21
|
|
21
22
|
# General is a templating system in ruby
|
@@ -32,18 +33,11 @@ module General
|
|
32
33
|
#
|
33
34
|
# Parameter: string - the template string
|
34
35
|
def initialize string
|
35
|
-
super
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
elsif match = General::GTimeFormatPlaceholder::REGEX.match(string)
|
41
|
-
@partials << General::GTimeFormatPlaceholder.new(match)
|
42
|
-
else
|
43
|
-
return
|
44
|
-
end
|
45
|
-
string = string[match.end(0)..-1]
|
46
|
-
end
|
36
|
+
super(string, [
|
37
|
+
General::GSpecial,
|
38
|
+
General::GText,
|
39
|
+
General::GTimeFormatPlaceholder
|
40
|
+
])
|
47
41
|
end
|
48
42
|
|
49
43
|
# Applies the given integer value to the template and returns the generated string
|
data/spec/gdothash_spec.rb
CHANGED
@@ -70,18 +70,14 @@ describe General::GDotHash do
|
|
70
70
|
# Parameter: key - the key to set
|
71
71
|
# Parameter: value - the value to set
|
72
72
|
describe '#[]=' do
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
expect(@gdothash[@key1]).to eql @newvalue1
|
77
|
-
end
|
73
|
+
it 'sets the position addressed by the given dot notation key (if it exists) to the given value' do
|
74
|
+
expect { @gdothash[@key1] = @newvalue1 }.not_to raise_error
|
75
|
+
expect(@gdothash[@key1]).to eql @newvalue1
|
78
76
|
end
|
79
77
|
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
expect(@gdothash[@key2]).to eql @newvalue2
|
84
|
-
end
|
78
|
+
it 'creates position addressed by the given dot notation key (if it does not exist) and sets it to the given value' do
|
79
|
+
expect { @gdothash[@key2] = @newvalue2 }.not_to raise_error
|
80
|
+
expect(@gdothash[@key2]).to eql @newvalue2
|
85
81
|
end
|
86
82
|
end
|
87
83
|
end
|
data/spec/goperations_spec.rb
CHANGED
@@ -39,41 +39,31 @@ describe General::GOperations do
|
|
39
39
|
@out_all = "Joe Schmoe"
|
40
40
|
end
|
41
41
|
|
42
|
-
context 'with
|
42
|
+
context 'with no second argument given' do
|
43
43
|
it 'capitalizes the first letter in the string' do
|
44
44
|
expect(General::GOperations.capitalize(@input)).to eql @out_first
|
45
45
|
end
|
46
|
-
end
|
47
46
|
|
48
|
-
|
49
|
-
|
50
|
-
it 'capitalizes the first letter in the string' do
|
51
|
-
expect(General::GOperations.capitalize @input, "first").to eql @out_first
|
52
|
-
end
|
47
|
+
it 'raises GOperationError with no string argument' do
|
48
|
+
expect { General::GOperations.capitalize }.to raise_error General::GOperationError
|
53
49
|
end
|
54
50
|
|
55
|
-
|
56
|
-
|
57
|
-
expect(General::GOperations.capitalize @input, "all").to eql @out_all
|
58
|
-
end
|
51
|
+
it 'raises GOperationError with argument of another type' do
|
52
|
+
expect { General::GOperations.capitalize(0) }.to raise_error General::GOperationError
|
59
53
|
end
|
54
|
+
end
|
60
55
|
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
end
|
56
|
+
context 'with string argument and second string argument is given' do
|
57
|
+
it 'capitalizes the first letter in the string when the second argument is "first"' do
|
58
|
+
expect(General::GOperations.capitalize @input, "first").to eql @out_first
|
65
59
|
end
|
66
|
-
end
|
67
60
|
|
68
|
-
|
69
|
-
|
70
|
-
expect { General::GOperations.capitalize }.to raise_error ArgumentError
|
61
|
+
it 'capitalizes all words in the string when the second argument is "all"' do
|
62
|
+
expect(General::GOperations.capitalize @input, "all").to eql @out_all
|
71
63
|
end
|
72
|
-
end
|
73
64
|
|
74
|
-
|
75
|
-
|
76
|
-
expect { General::GOperations.capitalize(0) }.to raise_error TypeError
|
65
|
+
it 'raises GOperationError when the second argument is neither "first" or "all"' do
|
66
|
+
expect{General::GOperations.capitalize @input, "foo"}.to raise_error General::GOperationError
|
77
67
|
end
|
78
68
|
end
|
79
69
|
end
|
@@ -91,22 +81,16 @@ describe General::GOperations do
|
|
91
81
|
@output = "JOE SCHMOE"
|
92
82
|
end
|
93
83
|
|
94
|
-
|
95
|
-
|
96
|
-
expect(General::GOperations.uppercase @input).to eql @output
|
97
|
-
end
|
84
|
+
it 'converts the string to uppercase' do
|
85
|
+
expect(General::GOperations.uppercase @input).to eql @output
|
98
86
|
end
|
99
87
|
|
100
|
-
|
101
|
-
|
102
|
-
expect { General::GOperations.uppercase }.to raise_error ArgumentError
|
103
|
-
end
|
88
|
+
it 'raises GOperationError with no string argument' do
|
89
|
+
expect { General::GOperations.uppercase }.to raise_error General::GOperationError
|
104
90
|
end
|
105
91
|
|
106
|
-
|
107
|
-
|
108
|
-
expect { General::GOperations.capitalize(0) }.to raise_error TypeError
|
109
|
-
end
|
92
|
+
it 'raises GOperationError with argument of another type' do
|
93
|
+
expect { General::GOperations.capitalize(0) }.to raise_error General::GOperationError
|
110
94
|
end
|
111
95
|
end
|
112
96
|
|
@@ -123,22 +107,16 @@ describe General::GOperations do
|
|
123
107
|
@output = "joe schmoe"
|
124
108
|
end
|
125
109
|
|
126
|
-
|
127
|
-
|
128
|
-
expect(General::GOperations.lowercase @input).to eql @output
|
129
|
-
end
|
110
|
+
it 'converts the string to lowercase' do
|
111
|
+
expect(General::GOperations.lowercase @input).to eql @output
|
130
112
|
end
|
131
113
|
|
132
|
-
|
133
|
-
|
134
|
-
expect { General::GOperations.lowercase }.to raise_error ArgumentError
|
135
|
-
end
|
114
|
+
it 'raises GOperationError with no string argument' do
|
115
|
+
expect { General::GOperations.lowercase }.to raise_error General::GOperationError
|
136
116
|
end
|
137
117
|
|
138
|
-
|
139
|
-
|
140
|
-
expect { General::GOperations.capitalize(0) }.to raise_error TypeError
|
141
|
-
end
|
118
|
+
it 'raises GOperationError with argument of another type' do
|
119
|
+
expect { General::GOperations.capitalize(0) }.to raise_error General::GOperationError
|
142
120
|
end
|
143
121
|
end
|
144
122
|
|
@@ -162,37 +140,29 @@ describe General::GOperations do
|
|
162
140
|
@output4 = "-€3.44"
|
163
141
|
end
|
164
142
|
|
165
|
-
context 'with
|
143
|
+
context 'with no second string value given' do
|
166
144
|
it 'formats the monetary value into USD' do
|
167
145
|
expect(General::GOperations.money @money1).to eql @output1
|
168
146
|
expect(General::GOperations.money @money2).to eql @output2
|
169
147
|
end
|
170
|
-
end
|
171
148
|
|
172
|
-
|
173
|
-
|
174
|
-
it 'formats the monetary value according the the money type' do
|
175
|
-
expect(General::GOperations.money @money1, "EUR").to eql @output3
|
176
|
-
expect(General::GOperations.money @money2, "EUR").to eql @output4
|
177
|
-
end
|
149
|
+
it 'raises GOperationError with no integer value given' do
|
150
|
+
expect { General::GOperations.money }.to raise_error General::GOperationError
|
178
151
|
end
|
179
152
|
|
180
|
-
|
181
|
-
|
182
|
-
expect { General::GOperations.money(@money1, "RUE") }.to raise_error TypeError
|
183
|
-
end
|
153
|
+
it 'raises GOperationError with argument of another type' do
|
154
|
+
expect { General::GOperations.money "" }.to raise_error General::GOperationError
|
184
155
|
end
|
185
156
|
end
|
186
157
|
|
187
|
-
context 'with
|
188
|
-
it '
|
189
|
-
expect
|
158
|
+
context 'with an integer value given and another string value given' do
|
159
|
+
it 'formats the monetary value according to the money type' do
|
160
|
+
expect(General::GOperations.money @money1, "EUR").to eql @output3
|
161
|
+
expect(General::GOperations.money @money2, "EUR").to eql @output4
|
190
162
|
end
|
191
|
-
end
|
192
163
|
|
193
|
-
|
194
|
-
|
195
|
-
expect { General::GOperations.money "" }.to raise_error TypeError
|
164
|
+
it 'raises GOperationError if the money type is not supported' do
|
165
|
+
expect { General::GOperations.money(@money1, "RUE") }.to raise_error General::GOperationError
|
196
166
|
end
|
197
167
|
end
|
198
168
|
end
|
@@ -219,28 +189,88 @@ describe General::GOperations do
|
|
219
189
|
@out2 = General::GTimeFormat.new(@formatter).apply(@time)
|
220
190
|
end
|
221
191
|
|
222
|
-
|
223
|
-
|
224
|
-
expect(General::GOperations.time(@time)).to eql @out1
|
225
|
-
end
|
192
|
+
it 'formats the given time value to the default time format' do
|
193
|
+
expect(General::GOperations.time(@time)).to eql @out1
|
226
194
|
end
|
227
195
|
|
228
|
-
|
229
|
-
|
230
|
-
expect(General::GOperations.time(@time, @formatter)).to eql @out2
|
231
|
-
end
|
196
|
+
it 'formats the given time value to the given time format' do
|
197
|
+
expect(General::GOperations.time(@time, @formatter)).to eql @out2
|
232
198
|
end
|
233
199
|
|
234
|
-
|
235
|
-
|
236
|
-
expect { General::GOperations.time }.to raise_error ArgumentError
|
237
|
-
end
|
200
|
+
it 'raises GOperationError with argument of another type' do
|
201
|
+
expect { General::GOperations.time "" }.to raise_error General::GOperationError
|
238
202
|
end
|
203
|
+
end
|
239
204
|
|
240
|
-
|
241
|
-
|
242
|
-
|
243
|
-
|
205
|
+
#----------------------------------TO ARRAY OPERATIONS------------------------------------
|
206
|
+
|
207
|
+
# Splits the string by the given delimeter (or by newline if no delimeter is given)
|
208
|
+
#
|
209
|
+
# Parameter: string - the string to split
|
210
|
+
# Parameter: delimeter - the delimeter to split by (defaults to newline)
|
211
|
+
#
|
212
|
+
# Return: the array containing the split string chunks
|
213
|
+
describe '::split' do
|
214
|
+
before(:all) do
|
215
|
+
@string1 = "Hello World\nI am dog"
|
216
|
+
@array1 = ["Hello World", "I am dog"]
|
217
|
+
|
218
|
+
@string2 = "Butter, Milk, Eggs, Bread"
|
219
|
+
@delim2 = ",\s*"
|
220
|
+
@array2 = ["Butter", "Milk", "Eggs", "Bread"]
|
221
|
+
|
222
|
+
@string4 = 3
|
223
|
+
end
|
224
|
+
|
225
|
+
it 'splits the string by whitespace if no delimeter is given' do
|
226
|
+
expect(General::GOperations.split(@string1)).to eql @array1
|
227
|
+
end
|
228
|
+
|
229
|
+
it 'splits the string using the given delimeter' do
|
230
|
+
expect(General::GOperations.split(@string2, @delim2)).to eql @array2
|
231
|
+
end
|
232
|
+
|
233
|
+
it 'raises GOperationError with no string value given' do
|
234
|
+
expect { General::GOperations.split }.to raise_error General::GOperationError
|
235
|
+
end
|
236
|
+
|
237
|
+
it 'raises GOperationError with value of other type given' do
|
238
|
+
expect { General::GOperations.split @string4 }.to raise_error General::GOperationError
|
239
|
+
end
|
240
|
+
end
|
241
|
+
|
242
|
+
# Splits a sequence by a set number of words (defaults to 10)
|
243
|
+
#
|
244
|
+
# Parameter: string - the string to split
|
245
|
+
# Parameter: words - the number of words to split by (defaults to 10)
|
246
|
+
#
|
247
|
+
# Return: an array containing hashes representing the chunks of the string split by words
|
248
|
+
describe '::splitwords' do
|
249
|
+
before(:all) do
|
250
|
+
@string1 = "The number of words in this string is greater than ten!"
|
251
|
+
@array1 = ["The number of words in this string is greater than", "ten!"]
|
252
|
+
|
253
|
+
@string2 = "The number of words (in this string) is greater than five, so every \"fifth\" word is on Joe's new line!"
|
254
|
+
@words2 = 5
|
255
|
+
@array2 = ["The number of words (in", "this string) is greater than", "five, so every \"fifth\" word", "is on Joe's new line!"]
|
256
|
+
|
257
|
+
@string3 = 4
|
258
|
+
end
|
259
|
+
|
260
|
+
it 'splits the string by ten words if no word count is given' do
|
261
|
+
expect(General::GOperations.splitwords @string1).to eql @array1
|
262
|
+
end
|
263
|
+
|
264
|
+
it 'splits the string by the given number of words' do
|
265
|
+
expect(General::GOperations.splitwords @string2, @words2).to eql @array2
|
266
|
+
end
|
267
|
+
|
268
|
+
it 'raises GOperationError with no string value given' do
|
269
|
+
expect { General::GOperations.splitwords }.to raise_error General::GOperationError
|
270
|
+
end
|
271
|
+
|
272
|
+
it 'raises GOperationError with value of other type given' do
|
273
|
+
expect { General::GOperations.splitwords @string3 }.to raise_error General::GOperationError
|
244
274
|
end
|
245
275
|
end
|
246
276
|
end
|