amrita2 1.9.6 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (112) hide show
  1. data/README +112 -0
  2. data/init.rb +6 -0
  3. data/lib/amrita2/gettext.rb +116 -0
  4. data/lib/amrita2/macro.rb +153 -0
  5. data/lib/amrita2/rails_bridge.rb +172 -26
  6. data/lib/amrita2/template.rb +2634 -234
  7. data/lib/amrita2/testsupport.rb +171 -0
  8. data/lib/amrita2/version.rb +3 -3
  9. data/lib/amrita2.rb +1 -0
  10. data/sample/depot/app/controllers/admin_controller.rb +59 -0
  11. data/sample/depot/app/controllers/application.rb +20 -0
  12. data/sample/depot/app/controllers/info_controller.rb +19 -0
  13. data/sample/depot/app/controllers/login_controller.rb +85 -0
  14. data/sample/depot/app/controllers/store_controller.rb +68 -0
  15. data/sample/depot/app/helpers/admin_helper.rb +7 -0
  16. data/sample/depot/app/helpers/application_helper.rb +10 -0
  17. data/sample/depot/app/helpers/ar_form.rb +169 -0
  18. data/sample/depot/app/helpers/form_tag.rb +24 -0
  19. data/sample/depot/app/helpers/info_helper.rb +7 -0
  20. data/sample/depot/app/helpers/standard_form.rb +73 -0
  21. data/sample/depot/app/helpers/store_helper.rb +14 -0
  22. data/sample/depot/app/models/cart.rb +36 -0
  23. data/sample/depot/app/models/cart_item.rb +26 -0
  24. data/sample/depot/app/models/line_item.rb +34 -0
  25. data/sample/depot/app/models/order.rb +57 -0
  26. data/sample/depot/app/models/product.rb +41 -0
  27. data/sample/depot/app/models/user.rb +83 -0
  28. data/sample/depot/config/boot.rb +49 -0
  29. data/sample/depot/config/environment.rb +83 -0
  30. data/sample/depot/config/environments/development.rb +24 -0
  31. data/sample/depot/config/environments/production.rb +24 -0
  32. data/sample/depot/config/environments/test.rb +24 -0
  33. data/sample/depot/config/routes.rb +10 -0
  34. data/sample/depot/db/migrate/001_create_products.rb +18 -0
  35. data/sample/depot/db/migrate/002_add_price.rb +14 -0
  36. data/sample/depot/db/migrate/003_add_test_data.rb +68 -0
  37. data/sample/depot/db/migrate/004_add_sessions.rb +20 -0
  38. data/sample/depot/db/migrate/005_create_orders.rb +21 -0
  39. data/sample/depot/db/migrate/006_create_line_items.rb +27 -0
  40. data/sample/depot/db/migrate/007_create_users.rb +18 -0
  41. data/sample/depot/db/schema.rb +45 -0
  42. data/sample/depot/public/dispatch.rb +15 -0
  43. data/sample/depot/test/functional/admin_controller_test.rb +54 -0
  44. data/sample/depot/test/functional/info_controller_test.rb +23 -0
  45. data/sample/depot/test/functional/login_controller_test.rb +74 -0
  46. data/sample/depot/test/functional/store_controller_test.rb +57 -0
  47. data/sample/depot/test/integration/dsl_user_stories_test.rb +126 -0
  48. data/sample/depot/test/integration/user_stories_test.rb +70 -0
  49. data/sample/depot/test/performance/order_speed_test.rb +58 -0
  50. data/sample/depot/test/test_helper.rb +16 -0
  51. data/sample/depot/test/unit/cart_test.rb +39 -0
  52. data/sample/depot/test/unit/cart_test1.rb +31 -0
  53. data/sample/depot/test/unit/line_item_test.rb +15 -0
  54. data/sample/depot/test/unit/order_test.rb +15 -0
  55. data/sample/depot/test/unit/product_test.rb +98 -0
  56. data/sample/depot/vendor/plugins/amrita2/init.rb +6 -0
  57. data/sample/hello/hello.rb +22 -0
  58. data/sample/login_engine/app/controllers/application.rb +16 -0
  59. data/sample/login_engine/app/controllers/user_controller.rb +265 -0
  60. data/sample/login_engine/app/helpers/application_helper.rb +3 -0
  61. data/sample/login_engine/app/helpers/form_tag.rb +16 -0
  62. data/sample/login_engine/app/helpers/two_columns.rb +24 -0
  63. data/sample/login_engine/app/helpers/two_columns_form.rb +47 -0
  64. data/sample/login_engine/app/helpers/user_helper.rb +88 -0
  65. data/sample/login_engine/app/models/user.rb +7 -0
  66. data/sample/login_engine/app/models/user_notify.rb +75 -0
  67. data/sample/login_engine/config/boot.rb +45 -0
  68. data/sample/login_engine/config/environment.rb +140 -0
  69. data/sample/login_engine/config/environments/development.rb +21 -0
  70. data/sample/login_engine/config/environments/production.rb +18 -0
  71. data/sample/login_engine/config/environments/test.rb +19 -0
  72. data/sample/login_engine/config/routes.rb +23 -0
  73. data/sample/login_engine/db/migrate/001_create_users.rb +25 -0
  74. data/sample/login_engine/db/schema.rb +25 -0
  75. data/sample/login_engine/lib/config.rb +113 -0
  76. data/sample/login_engine/lib/hpricot_test_extension.rb +80 -0
  77. data/sample/login_engine/lib/login_engine/authenticated_system.rb +113 -0
  78. data/sample/login_engine/lib/login_engine/authenticated_user.rb +155 -0
  79. data/sample/login_engine/lib/login_engine.rb +62 -0
  80. data/sample/login_engine/public/dispatch.rb +10 -0
  81. data/sample/login_engine/test/functional/amrita2_test.rb +267 -0
  82. data/sample/login_engine/test/functional/user_controller_test.rb +544 -0
  83. data/sample/login_engine/test/mocks/mail.rb +14 -0
  84. data/sample/login_engine/test/mocks/time.rb +19 -0
  85. data/sample/login_engine/test/test_helper.rb +31 -0
  86. data/sample/login_engine/test/unit/user_test.rb +116 -0
  87. data/sample/login_engine/vendor/plugins/amrita2/init.rb +6 -0
  88. data/specs/attribute.rb +201 -0
  89. data/specs/datatypes.rb +231 -0
  90. data/specs/dictionary.rb +68 -0
  91. data/specs/erb_cdata.rb +187 -0
  92. data/specs/filters.rb +513 -0
  93. data/specs/gettext/erb_gettext.rb +42 -0
  94. data/specs/gettext/gettext_util.rb +65 -0
  95. data/specs/gettext/static_text.rb +103 -0
  96. data/specs/impl/code_generator.rb +87 -0
  97. data/specs/impl/dynamic_element.rb +92 -0
  98. data/specs/impl/hash_delegator.rb +57 -0
  99. data/specs/impl/parse_opt.rb +34 -0
  100. data/specs/impl/preprocess.rb +823 -0
  101. data/specs/impl/testsupport.rb +89 -0
  102. data/specs/inlineruby.rb +429 -0
  103. data/specs/intro.rb +654 -0
  104. data/specs/loop.rb +203 -0
  105. data/specs/macro.rb +532 -0
  106. data/specs/sample.rb +34 -0
  107. data/specs/sanitize.rb +110 -0
  108. data/specs/template.rb +189 -0
  109. data/specs/trace.rb +97 -0
  110. metadata +138 -19
  111. data/lib/amrita2/core.rb +0 -1897
  112. data/lib/amrita2/rd.rb +0 -314
@@ -0,0 +1,42 @@
1
+ require 'rexml/document'
2
+ require 'amrita2'
3
+ require 'amrita2/testsupport'
4
+ require 'amrita2/template'
5
+ require 'amrita2/gettext'
6
+ require 'gettext/utils'
7
+ require 'fileutils'
8
+
9
+ include Amrita2
10
+ include Amrita2::Filters
11
+ include Amrita2::GetTextBridge
12
+
13
+ require File::dirname(__FILE__) + '/gettext_util'
14
+
15
+ $KCODE='u'
16
+
17
+ context "gettext erb element" do
18
+ include Amrita2::Runtime
19
+ include Amrita2GetTextTestSupport
20
+
21
+ specify "simple erb element" do
22
+ domain = "erb1"
23
+ temp = "/tmp/amrita_gettext_test.a2html"
24
+ Locale.set_current("ja", "JP", "utf8")
25
+ b = binding
26
+ test_gettext(
27
+ domain,
28
+ temp,
29
+ "<span><![CDATA[ <%=_('test message printed in ERB')%> ]]></span>",
30
+ [
31
+ %r[#: #{temp}:-],
32
+ %r[msgid "test message printed in ERB"],
33
+ ],
34
+ b,
35
+ "ERBで出力したテストメッセージ"
36
+ ) do |l|
37
+ l.sub!(%r[msgid "test message printed in ERB"\nmsgstr ""]m,
38
+ %[msgid "test message printed in ERB"\nmsgstr "ERBで出力したテストメッセージ"])
39
+ l
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,65 @@
1
+
2
+ module Amrita2GetTextTestSupport
3
+
4
+ def redirect_stderr
5
+ stderr_sv = STDERR.dup
6
+ STDERR.reopen("/dev/null")
7
+ yield
8
+ STDERR.flush
9
+ STDERR.reopen(stderr_sv)
10
+ end
11
+
12
+ def test_gettext(domain, fname, template, po_matchers, data, ja_result)
13
+ FileUtils::rm_rf("locale")
14
+ FileUtils::rm_rf("po")
15
+ FileUtils::rm_rf(fname)
16
+
17
+ File::open(fname, "w") do |f|
18
+ f.puts template
19
+ end
20
+
21
+
22
+ redirect_stderr do
23
+ GetText.update_pofiles(domain,
24
+ [fname],
25
+ "#{domain} 1.0.0"
26
+ )
27
+ end
28
+ po = File::open("po/#{domain}.pot").read
29
+
30
+ po_matchers.each do |m|
31
+ po.should match(m)
32
+ end
33
+
34
+ FileUtils::mkdir_p("po/ja")
35
+ File::open("po/#{domain}.pot") do |potf|
36
+ File::open("po/ja/#{domain}.po", "w") do |pof|
37
+ l = yield(potf.read)
38
+ pof.puts l
39
+ end
40
+ end
41
+
42
+ redirect_stderr do
43
+ GetText.create_mofiles(true, "po", "locale")
44
+ end
45
+
46
+ Locale.set_current("ja", "JP", "utf8")
47
+ ENV['GETTEXT_PATH'] = "./locale"
48
+
49
+ t = Template.new(template) do |e, src, filters|
50
+ filters << Amrita2::Filters::GetTextFilter.new
51
+ end
52
+
53
+ t.text_domain = domain
54
+ if data.kind_of?(Binding)
55
+ eval "bindtextdomain(#{domain.inspect})", data
56
+ end
57
+ t.test_with(data) do |result|
58
+ result.strip.should_be_samexml_as ja_result
59
+ end
60
+ ensure
61
+ FileUtils::rm_rf("locale")
62
+ FileUtils::rm_rf("po")
63
+ FileUtils::rm_rf(fname)
64
+ end
65
+ end
@@ -0,0 +1,103 @@
1
+ require 'rexml/document'
2
+ require 'amrita2'
3
+ require 'amrita2/testsupport'
4
+ require 'amrita2/template'
5
+ require 'amrita2/gettext'
6
+ require 'gettext/utils'
7
+ require 'fileutils'
8
+
9
+ include Amrita2
10
+ include Amrita2::Filters
11
+ include Amrita2::GetTextBridge
12
+
13
+ require File::dirname(__FILE__) + '/gettext_util'
14
+
15
+ $KCODE='u'
16
+
17
+ context "gettext static element" do
18
+ include Amrita2GetTextTestSupport
19
+ TEMPFILE='/tmp/test.a2html'
20
+
21
+ specify "every text becomes an entry of po" do
22
+ Locale.set_current("ja", "JP", "utf8")
23
+ test_gettext("test1",
24
+ TEMPFILE,
25
+ "<span>test message</span>",
26
+ [
27
+ %r[#: /tmp/test.a2html:-],
28
+ %r[msgid "test message"],
29
+ ],
30
+ {},
31
+ "テストメッセージ"
32
+ ) do |l|
33
+ l.sub!(%r[msgid "test message"\nmsgstr ""]m,
34
+ %[msgid "test message"\nmsgstr "テストメッセージ"])
35
+ l
36
+ end
37
+ end
38
+
39
+ specify "strip messages" do
40
+ Locale.set_current("ja", "JP", "utf8")
41
+ test_gettext("test1",
42
+ TEMPFILE,
43
+ "<span> test message </span>",
44
+ [
45
+ %r[#: /tmp/test.a2html:-],
46
+ %r[msgid "test message"],
47
+ ],
48
+ {},
49
+ "テストメッセージ"
50
+ ) do |l|
51
+ l.sub!(%r[msgid "test message"\nmsgstr ""]m,
52
+ %[msgid "test message"\nmsgstr "テストメッセージ"])
53
+ l
54
+ end
55
+ end
56
+
57
+ specify "two messages" do
58
+ test_gettext("test3",
59
+ TEMPFILE,
60
+ "<div><span> test message1 </span><span>test message2</span></div>",
61
+ [
62
+ %r[#: /tmp/test.a2html:-],
63
+ %r[msgid "test message1"],
64
+ %r[msgid "test message2"],
65
+ ],
66
+ {},
67
+ "<div>あああいいい</div>"
68
+ ) do |l|
69
+ l.sub!(%r[msgid "test message1"\nmsgstr ""]m,
70
+ %[msgid "test message1"\nmsgstr "あああ"])
71
+ l.sub!(%r[msgid "test message2"\nmsgstr ""]m,
72
+ %[msgid "test message2"\nmsgstr "いいい"])
73
+ l
74
+ end
75
+ end
76
+
77
+ end
78
+
79
+ context "format with gettext" do
80
+ include Amrita2GetTextTestSupport
81
+
82
+ specify "format1" do
83
+ Locale.set_current("ja", "JP", "utf8")
84
+ test_gettext(
85
+ "format1",
86
+ TEMPFILE,
87
+ "<span>%{filename} is %{filesize} byte</span>",
88
+ [
89
+ %r[#: #{TEMPFILE}:-],
90
+ %r[msgid "%\{filename\} is %\{filesize\} byte"],
91
+ ],
92
+ {
93
+ :filename => "foo.rb",
94
+ :filesize => 100
95
+ },
96
+ "foo.rbの大きさは100バイトです"
97
+ ) do |l|
98
+ l.sub!(%r[msgid "%\{filename\} is %\{filesize\} byte"\nmsgstr ""]m,
99
+ %[msgid "%\{filename\} is %\{filesize\} byte"\nmsgstr "%{filename}の大きさは%{filesize}バイトです"])
100
+ l
101
+ end
102
+ end
103
+ end
@@ -0,0 +1,87 @@
1
+
2
+ require 'amrita2'
3
+
4
+ context "" do
5
+ include Amrita2::Runtime
6
+ setup do
7
+ @g = Amrita2::Core::CodeGenerator.new
8
+ end
9
+
10
+ def cg_result
11
+ __binding__ = binding
12
+ eval @g.result
13
+ end
14
+
15
+ def cg_result_for_class(value)
16
+ cls = Class.new
17
+ cls.module_eval @g.result
18
+ cls.new.render_with(value)
19
+ end
20
+
21
+ specify "code" do
22
+ @g.code "1"
23
+ cg_result.should == 1
24
+ end
25
+
26
+ specify "put_constant" do
27
+ @g.with_stream do
28
+ @g.put_constant 1
29
+ end
30
+ cg_result.should == "1"
31
+ end
32
+
33
+ specify "if true" do
34
+ @g.with_stream do
35
+ @g.if_("true") do
36
+ @g.put_constant 2
37
+ end
38
+ end
39
+ cg_result.should == "2"
40
+ end
41
+
42
+ specify "if false " do
43
+ @g.with_stream do
44
+ @g.if_("false") do
45
+ @g.put_constant 2
46
+ end
47
+ end
48
+ cg_result.should == ""
49
+ end
50
+
51
+ specify "case " do
52
+ @g.with_stream do
53
+ @g.case_("1") do
54
+ @g.when_("String") do
55
+ @g.put_constant 1
56
+ end
57
+ @g.when_("Integer") do
58
+ @g.put_constant 2
59
+ end
60
+ end
61
+ end
62
+ cg_result.should == "2"
63
+ end
64
+
65
+ specify "def method" do
66
+ @g.def_method("render_with", "value") do
67
+ @g.put_constant("<")
68
+ @g.code("value +=1")
69
+ @g.put_expression("(value * 2).to_s")
70
+ @g.put_constant(">")
71
+ end
72
+ cg_result_for_class(3).should == "<8>"
73
+ end
74
+
75
+ specify "multi stream" do
76
+ @g.with_stream do
77
+ @g.put_constant("abc")
78
+ @g.with_stream(:aaa) do
79
+ @g.put_constant("123")
80
+ @g.put_constant("456")
81
+ end
82
+ @g.put_constant("def")
83
+ @g.put_stream(:aaa)
84
+ end
85
+ cg_result.should == "abcdef123456"
86
+ end
87
+ end
@@ -0,0 +1,92 @@
1
+
2
+ require 'rexml/element'
3
+ require 'amrita2'
4
+
5
+ include Amrita2
6
+
7
+ context "check hpricot" do
8
+ specify "no child" do
9
+ text = %q[<span am:src='aaa' />]
10
+ e = Hpricot.make(text)[0]
11
+ e.enum_for(:each_child).to_a.size.should == 0
12
+ end
13
+
14
+ specify "one child" do
15
+ text = %q[<span am:src='aaa'><span am:src='bbb' /></span>]
16
+ e = Hpricot.make(text)[0]
17
+ e.enum_for(:each_child).to_a.size.should == 1
18
+ end
19
+
20
+ specify "two children" do
21
+ text = %q[<span am:src='aaa'><span am:src='bbb' /><span am:src='ccc' /></span>]
22
+ e = Hpricot.make(text, :xml=>true)[0]
23
+ e.children.size == 2
24
+ e.enum_for(:each_child).to_a.size.should == 2
25
+ end
26
+ end
27
+
28
+ context "has_dynamic?" do
29
+ specify "single" do
30
+ text = %q[<span am:src='aaa' />]
31
+ t = Amrita2::Template.new(text)
32
+ t.setup
33
+ t.root.has_dynamic?.should == true
34
+ t.root.children.first.has_dynamic?.should == false
35
+ end
36
+
37
+ specify "nest" do
38
+ text = %q[<span am:src='aaa'><span am:src='bbb' /></span>]
39
+ t = Template.new(text)
40
+ t.setup
41
+ t.root.has_dynamic?.should == true
42
+ t.root.children.first.has_dynamic?.should == true
43
+ t.root.children.first.children.first.has_dynamic?.should == false
44
+ end
45
+
46
+ specify "nest2" do
47
+ text = %q[<span am:src='aaa'><span am:src='bbb' /><span am:src='ccc' /></span>]
48
+ t = Template.new(text)
49
+ t.setup
50
+ t.root.has_dynamic?.should == true
51
+ aaa = t.root.children.first
52
+ aaa.element.children.size.should == 2
53
+ aaa.children.size.should == 2
54
+ bbb, ccc = *aaa.children
55
+ bbb.should be_dynamic
56
+ ccc.should be_dynamic
57
+ end
58
+
59
+ specify "has text" do
60
+ text = %q[<span am:src='aaa'>text</span>]
61
+ t = Template.new(text)
62
+ t.setup
63
+ t.root.has_dynamic?.should == true
64
+ t.root.children.first.has_dynamic?.should == false
65
+ end
66
+
67
+ specify "has erb" do
68
+ text = %q[<span am:src='aaa'><% 1 %></span>]
69
+ t = Template.new(text)
70
+ t.setup
71
+ t.root.has_dynamic?.should == true
72
+ t.root.children.first.has_dynamic?.should == true
73
+ end
74
+ end
75
+
76
+ context "has_ruby?" do
77
+ specify "single" do
78
+ text = %q[<span am:src='aaa' />]
79
+ t = Amrita2::Template.new(text)
80
+ t.setup
81
+ t.root.has_ruby?.should == nil
82
+ t.root.children.first.has_ruby?.should == nil
83
+ end
84
+
85
+ specify "has erb" do
86
+ text = %q[<span am:src='aaa'><% 1 %></span>]
87
+ t = Template.new(text)
88
+ t.setup
89
+ t.root.has_ruby?.should == true
90
+ t.root.children.first.has_ruby?.should == true
91
+ end
92
+ end
@@ -0,0 +1,57 @@
1
+ require 'amrita2'
2
+
3
+ context "Hash Delegator" do
4
+ include Amrita2
5
+
6
+ specify "delegate to Hash" do
7
+ h = { :one => 1 }
8
+ c = Amrita2::HashDelegator.new(h) do
9
+ {
10
+ :two=>2,
11
+ }
12
+ end
13
+ c.one.should == 1
14
+ c.two.should == 2
15
+ c[:one].should == 1
16
+ c[:two].should == 2
17
+ c.three.should be_nil
18
+ c[:three].should be_nil
19
+ end
20
+
21
+ specify "delegate to Struct" do
22
+ s = Struct.new(:one).new(1)
23
+ c = Amrita2::HashDelegator.new(s) do
24
+ {
25
+ :two=>2,
26
+ }
27
+ end
28
+ c.one.should == 1
29
+ c.two.should == 2
30
+ c[:one].should == 1
31
+ c[:two].should == 2
32
+ proc { c.three }.should raise_error
33
+ c[:three].should be_nil
34
+ end
35
+
36
+ specify "double delegate to Struct" do
37
+ s = Struct.new(:one).new(1)
38
+ c1 = Amrita2::HashDelegator.new(s) do
39
+ {
40
+ :two=>2,
41
+ }
42
+ end
43
+ c2 = Amrita2::HashDelegator.new(c1) do
44
+ {
45
+ :three=>3,
46
+ }
47
+ end
48
+ c2.one.should == 1
49
+ c2.two.should == 2
50
+ c2[:one].should == 1
51
+ c2[:two].should == 2
52
+ c2.three.should == 3
53
+ c2[:three].should == 3
54
+ proc { c2.four }.should raise_error
55
+ c2[:four].should be_nil
56
+ end
57
+ end
@@ -0,0 +1,34 @@
1
+
2
+ require 'rexml/document'
3
+ require 'amrita2'
4
+ require 'amrita2/testsupport'
5
+
6
+ include Amrita2
7
+ include Amrita2::Util
8
+
9
+ context "parse_opt" do
10
+ include OptionSupport
11
+ setup do
12
+ doc = REXML::Document.new "<div class='aaa'><a href='bbb' title='ccc'>ddd</a></div>"
13
+ @e = doc.root
14
+ end
15
+
16
+ specify "give simbols" do
17
+ parse_opt().should == {}
18
+ parse_opt(:aaa).should == {:aaa=>:aaa}
19
+ parse_opt(:aaa, :bbb).should == {:aaa=>:aaa, :bbb=>:bbb}
20
+ end
21
+
22
+ specify "give hash" do
23
+ parse_opt(:aaa=>:aaa).should == {:aaa=>:aaa}
24
+ parse_opt(:aaa=>"aaa").should == {:aaa=>"aaa"}
25
+ parse_opt(:aaa=>"aaa", :bbb=>:bbb).should == {:aaa=>"aaa", :bbb=>:bbb}
26
+ end
27
+
28
+ specify "give hash and simbol" do
29
+ parse_opt(:aaa, :bbb=>:bbb).should == {:aaa=>:aaa, :bbb=>:bbb}
30
+ parse_opt(:aaa, :bbb=>"bbb").should == {:aaa=>:aaa, :bbb=>"bbb" }
31
+ parse_opt(:xxx, :aaa=>"aaa", :bbb=>:bbb).should == {:aaa=>"aaa", :bbb=>:bbb, :xxx=>:xxx}
32
+ end
33
+ end
34
+