tagen 0.1.1 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- data/Rakefile +10 -5
- data/lib/tagen/core/string/pyformat.rb +19 -12
- data/spec/tagen/core/string/pyformat_spec.rb +56 -43
- data/version.rb +2 -2
- metadata +1 -1
data/Rakefile
CHANGED
@@ -1,12 +1,17 @@
|
|
1
1
|
desc "build a gem file"
|
2
2
|
task :release do
|
3
|
-
`rm *.gem`
|
4
|
-
|
5
|
-
|
6
|
-
|
3
|
+
`rm *.gem &>/dev/null`
|
4
|
+
sh "gem build tagen.gemspec"
|
5
|
+
sh "gem push *.gem"
|
6
|
+
sh "rm *.gem"
|
7
7
|
end
|
8
8
|
|
9
9
|
desc "testing the library"
|
10
10
|
task :test do
|
11
|
-
|
11
|
+
sh "rspec --color spec"
|
12
|
+
end
|
13
|
+
|
14
|
+
def sh cmd
|
15
|
+
puts cmd
|
16
|
+
system cmd
|
12
17
|
end
|
@@ -6,30 +6,33 @@ a python like string format libraray.
|
|
6
6
|
|
7
7
|
1. "this is #{guten}" # Ruby Builtin
|
8
8
|
2. "this is %s" % "guten" # Ruby Builtin
|
9
|
-
3. "this is {guten}".format(guten: 'x')
|
9
|
+
3. "this is %{guten}".format(guten: 'x')
|
10
10
|
|
11
11
|
use "#{var}" is easy and quick in many cases, but some times we need a more powerful format support.
|
12
12
|
|
13
13
|
"I like %s and %s" % %(apple, football)
|
14
|
-
"I like {fruit} and {sport}".format(%w(apple football)) # it has semantic meaning.
|
14
|
+
"I like %{fruit} and %{sport}".format(%w(apple football)) # it has semantic meaning.
|
15
15
|
|
16
16
|
== Usage
|
17
17
|
|
18
18
|
require "tagen/core"
|
19
|
-
"it costs {:.2f} dollar".format(1.123) #=> "it costs 1.12 dollar"
|
19
|
+
"it costs %{:.2f} dollar".format(1.123) #=> "it costs 1.12 dollar"
|
20
20
|
|
21
21
|
* support abritry-argument or hash-argument
|
22
|
-
"{} {}".format(1,2) #=> "1 2"
|
23
|
-
"{a} {b}".format(a:1, b:2) #=> "1 2"
|
24
|
-
"{a} {b}".format(1, b:2) #=> "1 2"
|
22
|
+
"%{} %{}".format(1,2) #=> "1 2"
|
23
|
+
"%{a} %{b}".format(a:1, b:2) #=> "1 2"
|
24
|
+
"%{a} %{b}".format(1, b:2) #=> "1 2"
|
25
25
|
|
26
26
|
* escape
|
27
|
-
"my {
|
27
|
+
"my \\%{name} is %{name}".format("guten") #=> my name is guten.
|
28
28
|
|
29
29
|
== Examples
|
30
30
|
|
31
|
-
"{:.2f}"
|
32
|
-
"{name:.2f}"
|
31
|
+
"%{:.2f}"
|
32
|
+
"%{name:.2f}"
|
33
|
+
|
34
|
+
"I'm %{guten} and is #{age} years old".format(guten: "guten") # combine Ruby Buintin with PyFormat
|
35
|
+
|
33
36
|
|
34
37
|
== Specification
|
35
38
|
|
@@ -77,10 +80,14 @@ class PyFormat
|
|
77
80
|
# args -> argh and args
|
78
81
|
argh = Hash===args[-1] ? args.pop : {}
|
79
82
|
|
80
|
-
# "{0:.5f}"
|
81
|
-
pat = /
|
83
|
+
# "%{0:.5f}"
|
84
|
+
pat = /
|
85
|
+
\\%{.*?} # esacpe
|
86
|
+
| %{ (.*?)? (?: :(.*?) )? } # %{0:.f}
|
87
|
+
/x
|
88
|
+
|
82
89
|
ret = @fmt.gsub(pat) do |m|
|
83
|
-
if m.start_with? "{
|
90
|
+
if m.start_with? "\\%{"
|
84
91
|
m
|
85
92
|
else
|
86
93
|
field, spec = $1, $2
|
@@ -5,60 +5,61 @@ require "spec_helper"
|
|
5
5
|
describe PyFormat do
|
6
6
|
before :all do
|
7
7
|
# from go-src/fmt
|
8
|
-
@test_datas = [
|
8
|
+
@test_datas = [ #{{{1
|
9
9
|
|
10
10
|
# type ::= s c b o d x X ¦ f/F g/G e/E n %
|
11
|
-
[ "{}", 1, "1"],
|
12
|
-
[ "{:s}", 1, "1"],
|
13
|
-
[ "{:c}", 'a', "a" ],
|
14
|
-
[ "{:b}", 0b10, "10" ],
|
15
|
-
[ "{:o}", 010, "10" ],
|
16
|
-
[ "{:x}", 0xa, "a" ],
|
17
|
-
[ "{:X}", 0xa, "A" ],
|
18
|
-
[ "{:f}", 1, "1.0"],
|
19
|
-
[ "{:F}", 1, "1.0"],
|
20
|
-
[ "{:e}", 1, "1.000000e+00" ],
|
21
|
-
[ "{:E}", 1, "1.000000E+00" ],
|
22
|
-
[ "{:g}", 1, "1"],
|
23
|
-
[ "{:g}", 1e6, "1e+06" ],
|
24
|
-
[ "{:G}", 1e6, "1E+06" ],
|
11
|
+
[ "%{}", 1, "1"],
|
12
|
+
[ "%{:s}", 1, "1"],
|
13
|
+
[ "%{:c}", 'a', "a" ],
|
14
|
+
[ "%{:b}", 0b10, "10" ],
|
15
|
+
[ "%{:o}", 010, "10" ],
|
16
|
+
[ "%{:x}", 0xa, "a" ],
|
17
|
+
[ "%{:X}", 0xa, "A" ],
|
18
|
+
[ "%{:f}", 1, "1.0"],
|
19
|
+
[ "%{:F}", 1, "1.0"],
|
20
|
+
[ "%{:e}", 1, "1.000000e+00" ],
|
21
|
+
[ "%{:E}", 1, "1.000000E+00" ],
|
22
|
+
[ "%{:g}", 1, "1"],
|
23
|
+
[ "%{:g}", 1e6, "1e+06" ],
|
24
|
+
[ "%{:G}", 1e6, "1E+06" ],
|
25
25
|
#[ "{:n}" ],
|
26
|
-
[ "{:%}", 1, "100%" ],
|
26
|
+
[ "%{:%}", 1, "100%" ],
|
27
27
|
|
28
28
|
# width
|
29
|
-
[ "{:5s}", 1234, " 1234"],
|
30
|
-
[ "{:3s}", 1234, "1234"],
|
31
|
-
[ "{:.3s}", 1234, "123"],
|
29
|
+
[ "%{:5s}", 1234, " 1234"],
|
30
|
+
[ "%{:3s}", 1234, "1234"],
|
31
|
+
[ "%{:.3s}", 1234, "123"],
|
32
32
|
|
33
|
-
[ "{:3f}", 1.123, "1.123"],
|
34
|
-
[ "{:.1f}", 1.123, "1.1"],
|
35
|
-
[ "{:4.1f}", 1.123, " 1.1"],
|
33
|
+
[ "%{:3f}", 1.123, "1.123"],
|
34
|
+
[ "%{:.1f}", 1.123, "1.1"],
|
35
|
+
[ "%{:4.1f}", 1.123, " 1.1"],
|
36
36
|
|
37
37
|
# fill align
|
38
|
-
[ "{:0<2}", 1, "10"],
|
39
|
-
[ "{:0>2}", 1, "01"],
|
40
|
-
[ "{:0^4}", 1, "0100"],
|
41
|
-
[ "{:02}", 1, "01"],
|
38
|
+
[ "%{:0<2}", 1, "10"],
|
39
|
+
[ "%{:0>2}", 1, "01"],
|
40
|
+
[ "%{:0^4}", 1, "0100"],
|
41
|
+
[ "%{:02}", 1, "01"],
|
42
42
|
|
43
43
|
# sign
|
44
|
-
[ "{:+}", 1, "+1"],
|
45
|
-
[ "{: }", 1, " 1"],
|
46
|
-
[ "{:-}", 1, "1"],
|
44
|
+
[ "%{:+}", 1, "+1"],
|
45
|
+
[ "%{: }", 1, " 1"],
|
46
|
+
[ "%{:-}", 1, "1"],
|
47
47
|
|
48
|
-
[ "{:+3}", 1, " +1"],
|
49
|
-
[ "{:=3}", 1, "+01"],
|
48
|
+
[ "%{:+3}", 1, " +1"],
|
49
|
+
[ "%{:=3}", 1, "+01"],
|
50
50
|
|
51
51
|
# alternate
|
52
|
-
[ "{:#b}", 0b1, "0b1"],
|
53
|
-
[ "{:#4b}", 0b1, " 0b1"],
|
54
|
-
[ "{:#o}", 01, "01"],
|
55
|
-
[ "{:#x}", 0x1, "0x1"],
|
52
|
+
[ "%{:#b}", 0b1, "0b1"],
|
53
|
+
[ "%{:#4b}", 0b1, " 0b1"],
|
54
|
+
[ "%{:#o}", 01, "01"],
|
55
|
+
[ "%{:#x}", 0x1, "0x1"],
|
56
56
|
|
57
57
|
# comma
|
58
|
-
[ "{:,}", 1234, "1,234"],
|
58
|
+
[ "%{:,}", 1234, "1,234"],
|
59
59
|
|
60
60
|
] #
|
61
61
|
end
|
62
|
+
#}}}1
|
62
63
|
|
63
64
|
it "parse_spec. PAT.match()" do
|
64
65
|
a = "0> #07,.7f"
|
@@ -66,13 +67,23 @@ describe PyFormat do
|
|
66
67
|
PyFormat::Field::PAT.match(a).to_a[1..-1].should == b
|
67
68
|
end
|
68
69
|
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
70
|
+
describe "#format" do
|
71
|
+
it "parse %{name}" do
|
72
|
+
"%{a}".format(a: 1).should == "1"
|
73
|
+
"%{a}".format(1).should == "1"
|
74
|
+
end
|
75
|
+
|
76
|
+
it "parse empty format %{}" do
|
77
|
+
"%{}".format(1).should == "1"
|
78
|
+
end
|
79
|
+
|
80
|
+
it "parse escape format. \%{name}" do
|
81
|
+
'\%{a}'.format.should == '\%{a}'
|
82
|
+
end
|
83
|
+
|
84
|
+
it "parse all formats %{} %{name} \%{name}" do
|
85
|
+
'%{} %{a} \%{a}'.format(1,a: 2).should == '1 2 \%{a}'
|
86
|
+
'%{} %{a} \%{a}'.format(1, 2).should == '1 2 \%{a}'
|
76
87
|
end
|
77
88
|
end
|
78
89
|
|
@@ -83,3 +94,5 @@ describe PyFormat do
|
|
83
94
|
end
|
84
95
|
end
|
85
96
|
end
|
97
|
+
|
98
|
+
# vim: foldmethod=marker
|
data/version.rb
CHANGED