wrong 0.3.1 → 0.3.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (70) hide show
  1. data/README.markdown +3 -1
  2. data/lib/wrong.rb +2 -1
  3. data/lib/wrong/chunk.rb +6 -1
  4. data/lib/wrong/irb.rb +16 -0
  5. data/lib/wrong/version.rb +1 -1
  6. data/test/adapters/rspec_test.rb +4 -2
  7. data/test/assert_test.rb +1 -1
  8. data/test/suite.rb +1 -1
  9. data/test/test_helper.rb +8 -1
  10. metadata +10 -69
  11. data/lib/predicated/Gemfile +0 -15
  12. data/lib/predicated/LICENSE +0 -20
  13. data/lib/predicated/README.markdown +0 -191
  14. data/lib/predicated/Rakefile +0 -51
  15. data/lib/predicated/lib/predicated.rb +0 -4
  16. data/lib/predicated/lib/predicated/autogen_call.rb +0 -37
  17. data/lib/predicated/lib/predicated/constrain.rb +0 -66
  18. data/lib/predicated/lib/predicated/evaluate.rb +0 -94
  19. data/lib/predicated/lib/predicated/from/callable_object.rb +0 -108
  20. data/lib/predicated/lib/predicated/from/json.rb +0 -59
  21. data/lib/predicated/lib/predicated/from/ruby_code_string.rb +0 -73
  22. data/lib/predicated/lib/predicated/from/url_part.rb +0 -104
  23. data/lib/predicated/lib/predicated/from/xml.rb +0 -61
  24. data/lib/predicated/lib/predicated/gem_check.rb +0 -34
  25. data/lib/predicated/lib/predicated/predicate.rb +0 -111
  26. data/lib/predicated/lib/predicated/print.rb +0 -62
  27. data/lib/predicated/lib/predicated/selectable.rb +0 -102
  28. data/lib/predicated/lib/predicated/simple_templated_predicate.rb +0 -79
  29. data/lib/predicated/lib/predicated/string_utils.rb +0 -20
  30. data/lib/predicated/lib/predicated/to/arel.rb +0 -41
  31. data/lib/predicated/lib/predicated/to/json.rb +0 -48
  32. data/lib/predicated/lib/predicated/to/sentence.rb +0 -94
  33. data/lib/predicated/lib/predicated/to/solr.rb +0 -15
  34. data/lib/predicated/lib/predicated/to/xml.rb +0 -67
  35. data/lib/predicated/lib/predicated/version.rb +0 -3
  36. data/lib/predicated/predicated.gemspec +0 -22
  37. data/lib/predicated/test/autogen_call_test.rb +0 -40
  38. data/lib/predicated/test/canonical_transform_cases.rb +0 -63
  39. data/lib/predicated/test/constrain_test.rb +0 -86
  40. data/lib/predicated/test/enumerable_test.rb +0 -32
  41. data/lib/predicated/test/equality_test.rb +0 -32
  42. data/lib/predicated/test/evaluate_test.rb +0 -149
  43. data/lib/predicated/test/from/callable_object_canonical_test.rb +0 -43
  44. data/lib/predicated/test/from/callable_object_test.rb +0 -78
  45. data/lib/predicated/test/from/json_test.rb +0 -83
  46. data/lib/predicated/test/from/ruby_code_string_canonical_test.rb +0 -37
  47. data/lib/predicated/test/from/ruby_code_string_test.rb +0 -103
  48. data/lib/predicated/test/from/url_part_parser_test.rb +0 -123
  49. data/lib/predicated/test/from/url_part_test.rb +0 -48
  50. data/lib/predicated/test/from/xml_test.rb +0 -57
  51. data/lib/predicated/test/json_conversion_test.rb +0 -33
  52. data/lib/predicated/test/print_test.rb +0 -66
  53. data/lib/predicated/test/selectable_test.rb +0 -123
  54. data/lib/predicated/test/simple_templated_predicate_test.rb +0 -39
  55. data/lib/predicated/test/suite.rb +0 -2
  56. data/lib/predicated/test/test_helper.rb +0 -64
  57. data/lib/predicated/test/test_helper_with_wrong.rb +0 -6
  58. data/lib/predicated/test/to/arel_test.rb +0 -85
  59. data/lib/predicated/test/to/json_test.rb +0 -74
  60. data/lib/predicated/test/to/sentence_test.rb +0 -90
  61. data/lib/predicated/test/to/solr_test.rb +0 -39
  62. data/lib/predicated/test/to/xml_test.rb +0 -72
  63. data/lib/predicated/test/xml_conversion_test.rb +0 -34
  64. data/lib/predicated/test_integration/arel_integration_test.rb +0 -52
  65. data/lib/predicated/test_integration/canonical_integration_cases.rb +0 -66
  66. data/lib/predicated/test_integration/schema.xml +0 -83
  67. data/lib/predicated/test_integration/solr_integration_test.rb +0 -71
  68. data/lib/predicated/test_integration/sqlite_db +0 -0
  69. data/lib/predicated/test_integration/suite.rb +0 -2
  70. data/lib/predicated/test_integration/usage_test.rb +0 -252
@@ -1,37 +0,0 @@
1
- require "./test/test_helper_with_wrong"
2
- require "./test/canonical_transform_cases"
3
-
4
- require "predicated/from/ruby_code_string"
5
- include Predicated
6
-
7
- regarding "ruby code string - canoical transform cases" do
8
- include CanonicalTransformCases
9
-
10
- @expectations = {
11
- "simple operations" => {
12
- "eq" => Predicate.from_ruby_code_string("'a'==3"),
13
- "gt" => Predicate.from_ruby_code_string("'a'>3"),
14
- "lt" => Predicate.from_ruby_code_string("'a'<3"),
15
- "gte" => Predicate.from_ruby_code_string("'a'>=3"),
16
- "lte" => Predicate.from_ruby_code_string("'a'<=3")
17
- },
18
- "primitive types" => {
19
- "false" => Predicate.from_ruby_code_string("'a'==false"),
20
- "true" => Predicate.from_ruby_code_string("'a'==true"),
21
- "string" => Predicate.from_ruby_code_string("'a'=='yyy'"),
22
- },
23
- "not" => {
24
- "simple" => Predicate.from_ruby_code_string("!('a'==true)")
25
- },
26
- "simple and / or" => {
27
- #parens are necessary around AND's in solr in order to force precedence
28
- "and" => Predicate.from_ruby_code_string("'a'==1 && 'b'==2"),
29
- "or" => Predicate.from_ruby_code_string("'a'==1 || 'b'==2")
30
- },
31
- "complex and / or" => {
32
- "or and" => Predicate.from_ruby_code_string("'a'==1 && 'b'==2 || 'c'==3")
33
- }
34
- }
35
-
36
- create_canonical_tests(@expectations)
37
- end
@@ -1,103 +0,0 @@
1
- require "./test/test_helper"
2
-
3
- require "predicated/from/ruby_code_string"
4
- include Predicated
5
-
6
- regarding "parse a ruby predicate string" do
7
-
8
- regarding "basic operations" do
9
-
10
- #'Wrong'-style asserts are specifically avoided here.
11
- #the circularity between the two projects will make you crazy if you're not careful
12
-
13
- test "word and" do
14
- assert_equal Predicate.from_ruby_code_string("1==1 and 2==2"), Predicate{ And(Eq(1,1),Eq(2,2)) }
15
- end
16
-
17
- test "substitute in from the binding" do
18
- a = 1
19
- b = "1"
20
- c = "c"
21
- d = Color.new("purple")
22
-
23
- assert_equal Predicate.from_ruby_code_string("a==1", binding()), Predicate{ Eq(1,1) }
24
- assert_equal Predicate.from_ruby_code_string("b==1", binding()), Predicate{ Eq("1",1) }
25
- assert_equal Predicate.from_ruby_code_string("c==b", binding()), Predicate{ Eq("c","1") }
26
- assert_equal Predicate.from_ruby_code_string("d==d", binding()), Predicate{ Eq(Color.new("purple"),
27
- Color.new("purple")) }
28
- assert_equal Predicate.from_ruby_code_string("d==d", binding()).left, d
29
-
30
- assert_equal Predicate.from_ruby_code_string("a==b && b==c", binding()),
31
- Predicate{ And(Eq(1,"1"),Eq("1","c")) }
32
- end
33
-
34
-
35
- test "parens change precedence" do
36
- assert_equal Predicate.from_ruby_code_string("1==1 || 2==2 && 3==3"),
37
- Predicate{ Or( Eq(1,1), And(Eq(2,2),Eq(3,3)) ) }
38
-
39
- assert_equal Predicate.from_ruby_code_string("(1==1 || 2==2) && 3==3"),
40
- Predicate{ And( Or(Eq(1,1),Eq(2,2)), Eq(3,3) ) }
41
- end
42
-
43
- regarding "only pay attention to the final line" do
44
- #might hate myself one day for this. but what else does it make sense to do?
45
-
46
- test "simple" do
47
- assert_equal Predicate.from_ruby_code_string("z=2\nb=5\n1==1"), Predicate{ Eq(1,1) }
48
- end
49
-
50
- test "can make use of variables defined earlier in the block" do
51
- #might hate myself one day for this. but what else does it make sense to do?
52
- assert_equal Predicate.from_ruby_code_string("z=2\nb=5\nz==1"), Predicate{ Eq(2,1) }
53
- end
54
- end
55
-
56
- test "a call that returns a boolean result" do
57
- assert_equal Predicate.from_ruby_code_string("'abc'.include?('bc')"),
58
- Predicate{ Call("abc", :include?, "bc") }
59
-
60
- color = Color.new("purple")
61
- assert_equal Predicate.from_ruby_code_string("color.name.include?('rp')", binding()),
62
- Predicate{ Call("purple", :include?, "rp") }
63
-
64
- assert_equal Predicate.from_ruby_code_string("'abc'.nil?"),
65
- Predicate{ Call("abc", :nil?, nil) }
66
- end
67
-
68
- test "use of instance variables" do
69
- @a = 1
70
-
71
- assert_equal Predicate.from_ruby_code_string("@a==1", binding()), Predicate{ Eq(1,1) }
72
- end
73
-
74
- test "use of inline assignments" do
75
- assert_equal Predicate.from_ruby_code_string("(a=2)==1 && a==1"),
76
- Predicate{ And(Eq(2,1), Eq(2,1)) }
77
- end
78
-
79
- test "use of inline expressions" do
80
- assert_equal Predicate.from_ruby_code_string("(2*1)==1"),
81
- Predicate{ Eq(2,1) }
82
-
83
- assert_equal Predicate.from_ruby_code_string("[2,1].first==1"),
84
- Predicate{ Eq(2,1) }
85
- end
86
-
87
-
88
- end
89
-
90
- regarding "errors" do
91
- test "can't parse" do
92
- assert_raises(Racc::ParseError) do
93
- Predicate.from_ruby_code_string("bad ruby @@@@@****()(((")
94
- end
95
- end
96
-
97
- test "predicates only" do
98
- assert_raises(Predicated::Predicate::DontKnowWhatToDoWithThisSexpError) do
99
- Predicate.from_ruby_code_string("a=1")
100
- end
101
- end
102
- end
103
- end
@@ -1,123 +0,0 @@
1
- require "./test/test_helper_with_wrong"
2
-
3
- require "predicated/predicate"
4
- require "predicated/from/url_part"
5
- include Predicated
6
-
7
- regarding "parse a url part, the result is a parse tree" do
8
-
9
- before do
10
- @parser = TreetopUrlPartParser.new
11
- end
12
-
13
- regarding "simple operations" do
14
-
15
- test "parse" do
16
- tree = @parser.parse("a=1")
17
-
18
- assert{ tree.is_a?(Predicated::TreetopUrlPart::OperationNode) }
19
- assert{ [tree.left_text, tree.sign_text, tree.right_text] == ["a", "=", "1"] }
20
-
21
- tree = @parser.parse("a>1")
22
- assert{ [tree.left_text, tree.sign_text, tree.right_text] == ["a", ">", "1"] }
23
-
24
- tree = @parser.parse("a<1")
25
- assert{ [tree.left_text, tree.sign_text, tree.right_text] == ["a", "<", "1"] }
26
-
27
- tree = @parser.parse("a>=1")
28
- assert{ [tree.left_text, tree.sign_text, tree.right_text] == ["a", ">=", "1"] }
29
-
30
- tree = @parser.parse("a<=1")
31
- assert{ [tree.left_text, tree.sign_text, tree.right_text] == ["a", "<=", "1"] }
32
- end
33
-
34
- test "...to predicate" do
35
- assert{ @parser.parse("a=1").to_predicate == Predicate{Eq("a", "1")} }
36
- assert{ @parser.parse("a>1").to_predicate == Predicate{Gt("a", "1")} }
37
- assert{ @parser.parse("a<1").to_predicate == Predicate{Lt("a", "1")} }
38
- assert{ @parser.parse("a>=1").to_predicate == Predicate{Gte("a", "1")} }
39
- assert{ @parser.parse("a<=1").to_predicate == Predicate{Lte("a", "1")} }
40
- end
41
-
42
- end
43
-
44
- regarding "simple and" do
45
- test "parse" do
46
- tree = @parser.parse("a=1&b=2")
47
-
48
- assert{ tree.is_a?(Predicated::TreetopUrlPart::AndNode) }
49
- assert{ [[tree.left.left_text, tree.left.sign_text, tree.left.right_text],
50
- [tree.right.left_text, tree.right.sign_text, tree.right.right_text]] ==
51
- [["a", "=", "1"], ["b", "=", "2"]] }
52
- end
53
-
54
- test "...to predicate" do
55
- assert{ @parser.parse("a=1&b=2").to_predicate == Predicate{ And( Eq("a", "1"),Eq("b", "2") ) } }
56
- end
57
- end
58
-
59
- regarding "simple or" do
60
- test "parse" do
61
- tree = @parser.parse("a=1|b=2")
62
-
63
- assert{ tree.is_a?(Predicated::TreetopUrlPart::OrNode) }
64
- assert{ [[tree.left.left_text, tree.left.sign_text, tree.left.right_text],
65
- [tree.right.left_text, tree.right.sign_text, tree.right.right_text]] ==
66
- [["a", "=", "1"], ["b", "=", "2"]] }
67
- end
68
-
69
- test "...to predicate" do
70
- assert{ @parser.parse("a=1|b=2").to_predicate == Predicate{ Or( Eq("a", "1"),Eq("b", "2") ) } }
71
- end
72
- end
73
-
74
- regarding "complex and/or" do
75
- test "many or's" do
76
- assert{ @parser.parse("a=1|b=2|c=3").to_predicate ==
77
- Predicate{ Or( Eq("a", "1"), Or(Eq("b", "2"),Eq("c", "3")) ) } }
78
- end
79
-
80
- test "many and's" do
81
- assert{ @parser.parse("a=1&b=2&c=3").to_predicate ==
82
- Predicate{ And( Eq("a", "1"), And(Eq("b", "2"),Eq("c", "3")) ) } }
83
- end
84
-
85
- test "mixed and/or" do
86
- assert{ @parser.parse("a=1|b=2&c=3").to_predicate ==
87
- Predicate{ Or( Eq("a", "1"), And(Eq("b", "2"),Eq("c", "3")) ) } }
88
-
89
- assert{ @parser.parse("a=1&b=2|c=3").to_predicate ==
90
- Predicate{ Or( And(Eq("a", "1"),Eq("b", "2")), Eq("c", "3") ) } }
91
- end
92
- end
93
-
94
- regarding "parens (force higher precedence)" do
95
- test "no effect" do
96
- str = "(a=1|b=2)|c=3"
97
- assert{ @parser.parse(str).to_predicate ==
98
- Predicate{ Or( Or(Eq("a", "1"),Eq("b", "2")), Eq("c", "3") ) } }
99
-
100
- str = "((a=1|b=2))|c=3"
101
- assert{ @parser.parse(str).to_predicate ==
102
- Predicate{ Or( Or(Eq("a", "1"),Eq("b", "2")), Eq("c", "3") ) } }
103
- end
104
-
105
- test "force precedence" do
106
- #before
107
- assert{ @parser.parse("a=1|b=2&c=3").to_predicate ==
108
- Predicate{ Or( Eq("a", "1"), And(Eq("b", "2"),Eq("c", "3")) ) } }
109
-
110
- #after
111
- assert{ @parser.parse("(a=1|b=2)&c=3").to_predicate ==
112
- Predicate{ And( Or(Eq("a", "1"),Eq("b", "2")), Eq("c", "3") ) } }
113
- end
114
- end
115
-
116
- regarding "not" do
117
- test "force precedence" do
118
- assert{ @parser.parse("!(a=1)").to_predicate ==
119
- Predicate{ Not(Eq("a", "1")) } }
120
- end
121
- end
122
-
123
- end
@@ -1,48 +0,0 @@
1
- require "./test/test_helper_with_wrong"
2
-
3
- require "predicated/from/url_part"
4
- require "./test/canonical_transform_cases"
5
- include Predicated
6
-
7
- regarding "parse url parts and convert them into predicates" do
8
- include CanonicalTransformCases
9
-
10
- @expectations = {
11
- "simple operations" => {
12
- "eq" => Predicate.from_url_part("a=3"),
13
- "gt" => Predicate.from_url_part("a>3"),
14
- "lt" => Predicate.from_url_part("a<3"),
15
- "gte" => Predicate.from_url_part("a>=3"),
16
- "lte" => Predicate.from_url_part("a<=3")
17
- },
18
- "primitive types" => {
19
- "false" => Predicate.from_url_part("a=false"),
20
- "true" => Predicate.from_url_part("a=true"),
21
- "string" => Predicate.from_url_part("a=yyy"),
22
- },
23
- "not" => {
24
- "simple" => Predicate.from_url_part("!(a=true)")
25
- },
26
- "simple and / or" => {
27
- #parens are necessary around AND's in solr in order to force precedence
28
- "and" => Predicate.from_url_part("a=1&b=2"),
29
- "or" => Predicate.from_url_part("a=1|b=2")
30
- },
31
- "complex and / or" => {
32
- "or and" => Predicate.from_url_part("a=1&b=2|c=3")
33
- }
34
- }
35
-
36
- create_canonical_tests(@expectations, proper_typing=false)
37
-
38
-
39
-
40
- test "parens change precedence" do
41
- assert { Predicate.from_url_part("a=1|b=2&c=3") ==
42
- Predicate{ Or( Eq("a","1"), And(Eq("b","2"),Eq("c","3")) ) } }
43
-
44
- assert { Predicate.from_url_part("(a=1|b=2)&c=3") ==
45
- Predicate{ And( Or(Eq("a","1"),Eq("b","2")), Eq("c","3") ) } }
46
- end
47
-
48
- end
@@ -1,57 +0,0 @@
1
- require "./test/test_helper_with_wrong"
2
- require "./test/canonical_transform_cases"
3
-
4
- require "predicated/from/xml"
5
- include Predicated
6
-
7
- regarding "convert an xml string to a predicate" do
8
- include CanonicalTransformCases
9
-
10
- @expectations = {
11
- "simple operations" => {
12
- "eq" => Predicate.from_xml("<equal><left>a</left><right>3</right></equal>"),
13
- "gt" => Predicate.from_xml("<greaterThan><left>a</left><right>3</right></greaterThan>"),
14
- "lt" => Predicate.from_xml("<lessThan><left>a</left><right>3</right></lessThan>"),
15
- "gte" =>
16
- Predicate.from_xml("<greaterThanOrEqualTo><left>a</left><right>3</right></greaterThanOrEqualTo>"),
17
- "lte" =>
18
- Predicate.from_xml("<lessThanOrEqualTo><left>a</left><right>3</right></lessThanOrEqualTo>")
19
- },
20
- "primitive types" => {
21
- "false" => Predicate.from_xml("<equal><left>a</left><right>false</right></equal>"),
22
- "true" => Predicate.from_xml("<equal><left>a</left><right>true</right></equal>"),
23
- "string" => Predicate.from_xml("<equal><left>a</left><right>yyy</right></equal>"),
24
- },
25
- "not" => {
26
- "simple" => Predicate.from_xml("<not><equal><left>a</left><right>true</right></equal></not>")
27
- },
28
- "simple and / or" => {
29
- #parens are necessary around AND's in solr in order to force precedence
30
- "and" => Predicate.from_xml(%{
31
- <and>
32
- <equal><left>a</left><right>1</right></equal>
33
- <equal><left>b</left><right>2</right></equal>
34
- </and>
35
- }),
36
- "or" => Predicate.from_xml(%{
37
- <or>
38
- <equal><left>a</left><right>1</right></equal>
39
- <equal><left>b</left><right>2</right></equal>
40
- </or>
41
- })
42
- },
43
- "complex and / or" => {
44
- "or and" => Predicate.from_xml(%{
45
- <or>
46
- <and>
47
- <equal><left>a</left><right>1</right></equal>
48
- <equal><left>b</left><right>2</right></equal>
49
- </and>
50
- <equal><left>c</left><right>3</right></equal>
51
- </or>
52
- })
53
- }
54
- }
55
-
56
- create_canonical_tests(@expectations, proper_typing=false)
57
- end
@@ -1,33 +0,0 @@
1
- require "./test/test_helper_with_wrong"
2
-
3
- require "predicated/from/json"
4
- require "predicated/to/json"
5
- include Predicated
6
-
7
- regarding "convert json back and forth" do
8
-
9
- test "string to predicate to string" do
10
- assert{ Predicate.from_json_str(%{["a","==",3]}).to_json_str ==
11
- JSON.pretty_generate(JSON.parse(%{["a","==",3]})) }
12
-
13
- complex_json_str = %{
14
- {
15
- "or":[
16
- {"and":[["a","==",1],["b","==",2]]},
17
- ["c","==",3]
18
- ]
19
- }
20
- }
21
-
22
- assert{ Predicate.from_json_str(complex_json_str).to_json_str ==
23
- JSON.pretty_generate(JSON.parse(complex_json_str)) }
24
- end
25
-
26
- test "predicate to string to predicate" do
27
- assert{ Predicate.from_json_str(Predicate{ Eq("a",3) }.to_json_str) == Predicate{ Eq("a",3) } }
28
-
29
- assert{ Predicate.from_json_str(Predicate{ Or(And(Eq("a",1),Eq("b",2)), Eq("c",3)) }.to_json_str) ==
30
- Predicate{ Or(And(Eq("a",1),Eq("b",2)), Eq("c",3)) } }
31
- end
32
-
33
- end
@@ -1,66 +0,0 @@
1
- require "./test/test_helper_with_wrong"
2
-
3
- require "predicated/predicate"
4
- include Predicated
5
-
6
- regarding "a predicate looks nice with you to_s it" do
7
- test "numbers" do
8
- assert { Predicate { Eq(1, 1) }.to_s == "Eq(1,1)" }
9
- assert { Predicate { Lt(1, 2) }.to_s == "Lt(1,2)" }
10
- end
11
-
12
- test "booleans" do
13
- assert { Predicate { Eq(false, true) }.to_s == "Eq(false,true)" }
14
- end
15
-
16
- test "strings" do
17
- assert { Predicate { Eq("foo", "bar") }.to_s == "Eq('foo','bar')" }
18
- end
19
-
20
- test "nil" do
21
- assert { Predicate { Eq("foo", nil) }.to_s == "Eq('foo',nil)" }
22
- end
23
-
24
- test "objects" do
25
- assert {
26
- Predicate {
27
- Eq(Color.new("red"), Color.new("blue"))
28
- }.to_s == "Eq(Color{'name:red'},Color{'name:blue'})"
29
- }
30
- end
31
-
32
- test "and, or" do
33
- assert { Predicate { And(true, false) }.to_s == "And(true,false)" }
34
- assert { Predicate { Or(true, false) }.to_s == "Or(true,false)" }
35
-
36
- assert { Predicate { And(Eq(1, 1) , Eq(2, 2)) }.to_s == "And(Eq(1,1),Eq(2,2))" }
37
-
38
- assert { Predicate { And(Eq(1, 1), Or(Eq(2, 2), Eq(3, 3))) }.to_s == "And(Eq(1,1),Or(Eq(2,2),Eq(3,3)))" }
39
- end
40
-
41
- test "not" do
42
- assert { Predicate { Not(Eq(1, 1)) }.to_s == "Not(Eq(1,1))" }
43
- end
44
-
45
- end
46
-
47
- regarding "inspect is like to_s except it's multiline, so you see the tree structure" do
48
-
49
- test "an uncomplicated predicate prints on one line" do
50
- assert { Predicate { Eq(1, 1) }.inspect == "Eq(1,1)" }
51
- end
52
-
53
- test "complex" do
54
- assert {
55
- Predicate { And(Eq(1, 1), Or(Eq(2, 2), Eq(3, 3))) }.inspect ==
56
- %{And(
57
- Eq(1,1),
58
- Or(
59
- Eq(2,2),
60
- Eq(3,3)
61
- )
62
- )
63
- }
64
- }
65
- end
66
- end