manatee 0.0.1.pre1

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.
Files changed (58) hide show
  1. checksums.yaml +7 -0
  2. data/Gemfile +23 -0
  3. data/LICENSE.txt +22 -0
  4. data/README.mdown +55 -0
  5. data/Rakefile +7 -0
  6. data/app/assets/javascripts/manatee.js +1 -0
  7. data/app/assets/javascripts/manatee/helpers.js +4 -0
  8. data/app/assets/javascripts/manatee/helpers/asset_tag.jsh.coffee +138 -0
  9. data/app/assets/javascripts/manatee/helpers/asset_url.jsh.coffee +90 -0
  10. data/app/assets/javascripts/manatee/helpers/csrf.jsh.coffee +5 -0
  11. data/app/assets/javascripts/manatee/helpers/date.jsh.coffee +54 -0
  12. data/app/assets/javascripts/manatee/helpers/debug.jsh.coffee +2 -0
  13. data/app/assets/javascripts/manatee/helpers/form.jsh.coffee +25 -0
  14. data/app/assets/javascripts/manatee/helpers/form_builder.jsh.coffee +24 -0
  15. data/app/assets/javascripts/manatee/helpers/form_options.jsh.coffee +267 -0
  16. data/app/assets/javascripts/manatee/helpers/form_tag.jsh.coffee +204 -0
  17. data/app/assets/javascripts/manatee/helpers/javascript.jsh.coffee +15 -0
  18. data/app/assets/javascripts/manatee/helpers/number.jsh.coffee +58 -0
  19. data/app/assets/javascripts/manatee/helpers/sanitize.jsh.coffee +5 -0
  20. data/app/assets/javascripts/manatee/helpers/tag.jsh.coffee +58 -0
  21. data/app/assets/javascripts/manatee/helpers/text.jsh.coffee +12 -0
  22. data/app/assets/javascripts/manatee/helpers/translation.jsh.coffee +7 -0
  23. data/app/assets/javascripts/manatee/helpers/url.jsh.coffee +36 -0
  24. data/app/assets/javascripts/manatee/helpers/util.jsh.coffee +41 -0
  25. data/app/assets/javascripts/manatee/rails_helpers.js +2 -0
  26. data/app/assets/javascripts/manatee/rails_helpers/routes.js.erb +195 -0
  27. data/app/assets/javascripts/manatee/rails_routes.js +1 -0
  28. data/app/assets/javascripts/manatee/renderer.js.erb +53 -0
  29. data/app/assets/javascripts/manatee_railsless.js +1 -0
  30. data/lib/manatee.rb +87 -0
  31. data/lib/manatee/config.rb +51 -0
  32. data/lib/manatee/handler.rb +45 -0
  33. data/lib/manatee/rails.rb +6 -0
  34. data/lib/manatee/rails/extensions.rb +23 -0
  35. data/lib/manatee/rails/handler.rb +16 -0
  36. data/lib/manatee/rails/hash_visitor.rb +35 -0
  37. data/lib/manatee/rails/helper.rb +9 -0
  38. data/lib/manatee/rails/resolver.rb +70 -0
  39. data/lib/manatee/rails/routes_compiler.rb +34 -0
  40. data/lib/manatee/sprockets.rb +8 -0
  41. data/lib/manatee/sprockets/jsh_processor_2x.rb +32 -0
  42. data/lib/manatee/sprockets/jsh_processor_3x.rb +31 -0
  43. data/lib/manatee/version.rb +3 -0
  44. data/manatee.gemspec +32 -0
  45. data/test/example/renderer.js.erb +8 -0
  46. data/test/example/translations.en.yml +410 -0
  47. data/test/example/views/index.jst.eco +12 -0
  48. data/test/helpers/asset_tag_test.rb +175 -0
  49. data/test/helpers/asset_url_test.rb +349 -0
  50. data/test/helpers/form_options_test.rb +718 -0
  51. data/test/helpers/form_tag_test.rb +387 -0
  52. data/test/helpers/javascript_test.rb +39 -0
  53. data/test/helpers/number_test.rb +111 -0
  54. data/test/helpers/tag_test.rb +71 -0
  55. data/test/support/dom_assertion.rb +49 -0
  56. data/test/support/view_test.rb +91 -0
  57. data/test/test_helper.rb +17 -0
  58. metadata +213 -0
@@ -0,0 +1,71 @@
1
+ require_relative '../test_helper'
2
+
3
+ class TagTest < Manatee::ViewTest
4
+
5
+ def test_simple_tag
6
+ assert_dom_helper '<simple />', :tag, 'simple'
7
+ end
8
+
9
+ def test_simple_with_attributes
10
+ assert_dom_helper "<attributed attribute='lorem' data-attribute='this is a data attribute' booleantrue='booleantrue' booleanfalse='false'/>", :tag, 'attributed', attribute: 'lorem', data: { attribute: 'this is a data attribute' }, booleantrue: true, booleanfalse: false
11
+ end
12
+
13
+ def test_simple_escapes_attribute
14
+ assert_dom_helper %(<escaped attribute="'escaped' &#34;attribute&#34;"/>), :tag, 'escaped', attribute: %('escaped' "attribute")
15
+ end
16
+
17
+ def test_empty_content_tag
18
+ assert_dom_helper '<simple></simple>', :contentTag, 'simple'
19
+ end
20
+
21
+ def test_empty_content_with_attributes
22
+ assert_dom_helper "<attributed attribute='lorem' data-attribute='this is a data attribute' booleantrue='booleantrue' booleanfalse='false'></attributed>", :contentTag, 'attributed', attribute: 'lorem', data: { attribute: 'this is a data attribute' }, booleantrue: true, booleanfalse: false
23
+ end
24
+
25
+ def test_null_content_tag
26
+ assert_dom_helper '<simple></simple>', :contentTag, 'simple', nil
27
+ end
28
+
29
+ def test_null_content_with_attributes
30
+ assert_dom_helper "<attributed attribute='lorem' data-attribute='this is a data attribute' booleantrue='booleantrue' booleanfalse='false'></attributed>", :contentTag, 'attributed', nil, attribute: 'lorem', data: { attribute: 'this is a data attribute' }, booleantrue: true, booleanfalse: false
31
+ assert_dom_helper "<attributed attribute='lorem' data-attribute='this is a data attribute' booleantrue='booleantrue' booleanfalse='false'></attributed>", :contentTag, 'attributed', { attribute: 'lorem', data: { attribute: 'this is a data attribute' }, booleantrue: true, booleanfalse: false }, nil
32
+ end
33
+
34
+ def test_block_content_tag
35
+ assert_dom_helper '<simple>content from block</simple>', :contentTag, 'simple', lambda{ 'content from block' }
36
+ assert_dom_js_helper '<simple>content from function</simple>', :contentTag, %('simple', function(){ return 'content from function'; })
37
+ end
38
+
39
+ def test_block_content_with_attributes
40
+ assert_dom_helper "<attributed attribute='lorem' data-attribute='this is a data attribute' booleantrue='booleantrue' booleanfalse='false'>content from block</attributed>", :contentTag, 'attributed', lambda{ 'content from block' }, attribute: 'lorem', data: { attribute: 'this is a data attribute' }, booleantrue: true, booleanfalse: false
41
+ assert_dom_helper "<attributed attribute='lorem' data-attribute='this is a data attribute' booleantrue='booleantrue' booleanfalse='false'>content from block</attributed>", :contentTag, 'attributed', { attribute: 'lorem', data: { attribute: 'this is a data attribute' }, booleantrue: true, booleanfalse: false }, lambda{ 'content from block' }
42
+ assert_dom_js_helper "<attributed attribute='lorem' data-attribute='this is a data attribute' booleantrue='booleantrue' booleanfalse='false'>content from function</attributed>", :contentTag, %( 'attributed', function(){ return 'content from function'; }, { attribute: 'lorem', data: { attribute: 'this is a data attribute' }, booleantrue: true, booleanfalse: false } )
43
+ assert_dom_js_helper "<attributed attribute='lorem' data-attribute='this is a data attribute' booleantrue='booleantrue' booleanfalse='false'>content from function</attributed>", :contentTag, %( 'attributed', { attribute: 'lorem', data: { attribute: 'this is a data attribute' }, booleantrue: true, booleanfalse: false }, function(){ return 'content from function'; } )
44
+ end
45
+
46
+ def test_content_tag
47
+ assert_dom_helper '<simple>some data</simple>', :contentTag, 'simple', 'some data'
48
+ end
49
+
50
+ def test_content_with_attributes
51
+ assert_dom_helper "<attributed attribute='lorem' data-attribute='this is a data attribute' booleantrue='booleantrue' booleanfalse='false'>some data</attributed>", :contentTag, 'attributed', 'some data', attribute: 'lorem', data: { attribute: 'this is a data attribute' }, booleantrue: true, booleanfalse: false
52
+ end
53
+
54
+ def test_content_escaped_attribute
55
+ assert_dom_helper %(<escaped attribute="'escaped' &#34;attribute&#34;"></escaped>), :contentTag, 'escaped', attribute: %('escaped' "attribute")
56
+ end
57
+
58
+ def test_composing_some_tags
59
+ raw_template = <<-EOT
60
+ this.contentTag('body', { class: 'body_class'}, function(){
61
+ return this.tag('br', { style: 'line-height: 10px' }) +
62
+ this.contentTag('h1', 'Headline', {class: 'main_headline'}) +
63
+ this.tag('hr') +
64
+ this.contentTag('p', 'Once upon a time...');
65
+ })
66
+ EOT
67
+ html_code = %(<body class="body_class"><br style="line-height: 10px"/><h1 class="main_headline">Headline</h1><hr/><p>Once upon a time...</p></body>)
68
+ assert_dom_template html_code, raw_template
69
+ end
70
+
71
+ end
@@ -0,0 +1,49 @@
1
+ module Manatee
2
+ class DomAssertion
3
+ attr_reader :node
4
+
5
+ def initialize(node)
6
+ @node = node
7
+ end
8
+
9
+ def attributes
10
+ Hash[ @node.attributes.map{ |name, attr| [name.to_sym, attr.value] } ]
11
+ end
12
+
13
+ def children
14
+ @node.children.map do |child|
15
+ DomAssertion.new child
16
+ end
17
+ end
18
+
19
+ def text
20
+ @node.to_s
21
+ end
22
+
23
+ def inspect
24
+ content = if @node.is_a? Nokogiri::XML::Element
25
+ @node.children.map(&:to_s).join
26
+ else
27
+ @node.to_s
28
+ end
29
+ "DomAssertion: #{content}"
30
+ end
31
+
32
+ def ==(other)
33
+ case @node
34
+ when Nokogiri::XML::Element
35
+ other.node.class == Nokogiri::XML::Element && self.attributes == other.attributes && self.children == other.children
36
+ when Nokogiri::XML::CDATA
37
+ other.node.class == Nokogiri::XML::CDATA && self.text == other.text
38
+ when Nokogiri::XML::Text
39
+ other.node.class == Nokogiri::XML::Text && self.text == other.text
40
+ else
41
+ false
42
+ end
43
+ end
44
+
45
+ def self.parse(xml_code)
46
+ DomAssertion.new Nokogiri::XML("<root_tag>#{xml_code}</root_tag>").children.first
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,91 @@
1
+ module Manatee
2
+ class ViewTest < Test::Unit::TestCase
3
+
4
+ CSRF_TOKEN = "gYGgKHmGVZdc56rk5atNpQed2Vntd16L+LVxcBsrEEU="
5
+
6
+ protected
7
+ def assert_template(expected, template_identifier, *params)
8
+ assert_equal template_handler.eval_template(template_identifier, params), expected
9
+ end
10
+
11
+ def assert_js_helper(expected, helper_name, js_params)
12
+ assert_equal expected, js_helper_call(helper_name, js_params)
13
+ end
14
+
15
+ def assert_dom_js_helper(expected, helper_name, js_params)
16
+ assert_equal DomAssertion.parse(expected), DomAssertion.parse( js_helper_call(helper_name, js_params) )
17
+ end
18
+
19
+ def assert_helper(expected, helper_name, *attributes, &block)
20
+ assert_equal helper_call(helper_name, *attributes, &block), expected
21
+ end
22
+
23
+ def assert_dom_helper(expected, helper_name, *attributes, &block)
24
+ assert_equal DomAssertion.parse( helper_call(helper_name, *attributes, &block) ), DomAssertion.parse(expected)
25
+ end
26
+
27
+ def js_helper_call(helper_name, js_params)
28
+ javascript_call "#{Manatee.renderer_namespace}[#{helper_name.to_s.inspect}](#{js_params})"
29
+ end
30
+
31
+ def helper_call(helper_name, *attributes, &block)
32
+ helper_function = "#{Manatee.renderer_namespace}[#{helper_name.to_s.inspect}]"
33
+ if block_given?
34
+ attributes << block
35
+ end
36
+ template_handler.context.call helper_function, *attributes
37
+ end
38
+
39
+ def assert_javascript(expected, javascript_code)
40
+ assert_equal javascript_call(javascript_code), expected
41
+ end
42
+
43
+ def assert_dom_javascript(expected, javascript_code)
44
+ assert_equal DomAssertion.parse(javascript_call(javascript_code)), DomAssertion.parse(expected)
45
+ end
46
+
47
+ def assert_dom_template(expected, raw_template)
48
+ assert_equal DomAssertion.parse(eval_simulated_template(raw_template)), DomAssertion.parse(expected)
49
+ end
50
+
51
+ def javascript_call(javascript_code)
52
+ template_handler.eval javascript_code
53
+ end
54
+
55
+ def template_handler
56
+ Manatee::Handler.instance
57
+ end
58
+
59
+ def config_renderer(&block)
60
+ return if self.class.config_js_already?
61
+
62
+ Manatee.config do |config|
63
+ config.assets = self.class.sprockets_environment
64
+ yield config
65
+ end
66
+
67
+ template_handler.reset!
68
+ end
69
+
70
+ def eval_simulated_template(raw_template)
71
+ javascript_call "function(){ return (#{raw_template}); }.call(#{Manatee.renderer_namespace})"
72
+ end
73
+
74
+ def self.sprockets_environment
75
+ environment = ::Sprockets::Environment.new
76
+ environment.append_path File.expand_path('../../example', __FILE__)
77
+ environment.append_path File.expand_path('../../../app/assets/javascripts', __FILE__)
78
+ environment.append_path File.join(Gem.loaded_specs['i18n-js'].full_gem_path, 'app/assets/javascripts')
79
+
80
+ # Done this way to handle differences between sprockets 3.x and 2.x
81
+ Manatee::Sprockets::JshProcessor.subscribe environment
82
+
83
+ environment
84
+ end
85
+
86
+ def self.config_js_already?
87
+ @config_js_already || ( (@config_js_already = true) && false )
88
+ end
89
+
90
+ end
91
+ end
@@ -0,0 +1,17 @@
1
+ load File.expand_path('../../lib/manatee.rb', __FILE__)
2
+
3
+ require 'pry'
4
+ require 'nokogiri'
5
+ require 'test/unit'
6
+
7
+ Dir.glob(File.expand_path('../support/**/*.rb', __FILE__)) do |file|
8
+ load file
9
+ end
10
+
11
+ Manatee.config do |config|
12
+ config.assets = Manatee::ViewTest.sprockets_environment
13
+ config.views_asset = 'renderer'
14
+ config.assets_path = '/'
15
+ config.full_domain = 'http://www.example.com'
16
+ config.assets_domain = 'http://www.example.com'
17
+ end
metadata ADDED
@@ -0,0 +1,213 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: manatee
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1.pre1
5
+ platform: ruby
6
+ authors:
7
+ - Dalton Pinto
8
+ - Felipe JAPM
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2015-03-28 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: i18n-js
16
+ requirement: !ruby/object:Gem::Requirement
17
+ requirements:
18
+ - - ">="
19
+ - !ruby/object:Gem::Version
20
+ version: '0'
21
+ type: :runtime
22
+ prerelease: false
23
+ version_requirements: !ruby/object:Gem::Requirement
24
+ requirements:
25
+ - - ">="
26
+ - !ruby/object:Gem::Version
27
+ version: '0'
28
+ - !ruby/object:Gem::Dependency
29
+ name: execjs
30
+ requirement: !ruby/object:Gem::Requirement
31
+ requirements:
32
+ - - ">="
33
+ - !ruby/object:Gem::Version
34
+ version: '0'
35
+ type: :runtime
36
+ prerelease: false
37
+ version_requirements: !ruby/object:Gem::Requirement
38
+ requirements:
39
+ - - ">="
40
+ - !ruby/object:Gem::Version
41
+ version: '0'
42
+ - !ruby/object:Gem::Dependency
43
+ name: sprockets
44
+ requirement: !ruby/object:Gem::Requirement
45
+ requirements:
46
+ - - ">="
47
+ - !ruby/object:Gem::Version
48
+ version: '0'
49
+ type: :runtime
50
+ prerelease: false
51
+ version_requirements: !ruby/object:Gem::Requirement
52
+ requirements:
53
+ - - ">="
54
+ - !ruby/object:Gem::Version
55
+ version: '0'
56
+ - !ruby/object:Gem::Dependency
57
+ name: coffee-script
58
+ requirement: !ruby/object:Gem::Requirement
59
+ requirements:
60
+ - - ">="
61
+ - !ruby/object:Gem::Version
62
+ version: '0'
63
+ type: :runtime
64
+ prerelease: false
65
+ version_requirements: !ruby/object:Gem::Requirement
66
+ requirements:
67
+ - - ">="
68
+ - !ruby/object:Gem::Version
69
+ version: '0'
70
+ - !ruby/object:Gem::Dependency
71
+ name: rake
72
+ requirement: !ruby/object:Gem::Requirement
73
+ requirements:
74
+ - - ">="
75
+ - !ruby/object:Gem::Version
76
+ version: '0'
77
+ type: :development
78
+ prerelease: false
79
+ version_requirements: !ruby/object:Gem::Requirement
80
+ requirements:
81
+ - - ">="
82
+ - !ruby/object:Gem::Version
83
+ version: '0'
84
+ - !ruby/object:Gem::Dependency
85
+ name: bundler
86
+ requirement: !ruby/object:Gem::Requirement
87
+ requirements:
88
+ - - ">="
89
+ - !ruby/object:Gem::Version
90
+ version: '0'
91
+ type: :development
92
+ prerelease: false
93
+ version_requirements: !ruby/object:Gem::Requirement
94
+ requirements:
95
+ - - ">="
96
+ - !ruby/object:Gem::Version
97
+ version: '0'
98
+ - !ruby/object:Gem::Dependency
99
+ name: nokogiri
100
+ requirement: !ruby/object:Gem::Requirement
101
+ requirements:
102
+ - - ">="
103
+ - !ruby/object:Gem::Version
104
+ version: '0'
105
+ type: :development
106
+ prerelease: false
107
+ version_requirements: !ruby/object:Gem::Requirement
108
+ requirements:
109
+ - - ">="
110
+ - !ruby/object:Gem::Version
111
+ version: '0'
112
+ description: Renders javascript templates with ease on client and server sides
113
+ email:
114
+ - dalton@akidog.com.br
115
+ - felipe@akidog.com.br
116
+ executables: []
117
+ extensions: []
118
+ extra_rdoc_files: []
119
+ files:
120
+ - Gemfile
121
+ - LICENSE.txt
122
+ - README.mdown
123
+ - Rakefile
124
+ - app/assets/javascripts/manatee.js
125
+ - app/assets/javascripts/manatee/helpers.js
126
+ - app/assets/javascripts/manatee/helpers/asset_tag.jsh.coffee
127
+ - app/assets/javascripts/manatee/helpers/asset_url.jsh.coffee
128
+ - app/assets/javascripts/manatee/helpers/csrf.jsh.coffee
129
+ - app/assets/javascripts/manatee/helpers/date.jsh.coffee
130
+ - app/assets/javascripts/manatee/helpers/debug.jsh.coffee
131
+ - app/assets/javascripts/manatee/helpers/form.jsh.coffee
132
+ - app/assets/javascripts/manatee/helpers/form_builder.jsh.coffee
133
+ - app/assets/javascripts/manatee/helpers/form_options.jsh.coffee
134
+ - app/assets/javascripts/manatee/helpers/form_tag.jsh.coffee
135
+ - app/assets/javascripts/manatee/helpers/javascript.jsh.coffee
136
+ - app/assets/javascripts/manatee/helpers/number.jsh.coffee
137
+ - app/assets/javascripts/manatee/helpers/sanitize.jsh.coffee
138
+ - app/assets/javascripts/manatee/helpers/tag.jsh.coffee
139
+ - app/assets/javascripts/manatee/helpers/text.jsh.coffee
140
+ - app/assets/javascripts/manatee/helpers/translation.jsh.coffee
141
+ - app/assets/javascripts/manatee/helpers/url.jsh.coffee
142
+ - app/assets/javascripts/manatee/helpers/util.jsh.coffee
143
+ - app/assets/javascripts/manatee/rails_helpers.js
144
+ - app/assets/javascripts/manatee/rails_helpers/routes.js.erb
145
+ - app/assets/javascripts/manatee/rails_routes.js
146
+ - app/assets/javascripts/manatee/renderer.js.erb
147
+ - app/assets/javascripts/manatee_railsless.js
148
+ - lib/manatee.rb
149
+ - lib/manatee/config.rb
150
+ - lib/manatee/handler.rb
151
+ - lib/manatee/rails.rb
152
+ - lib/manatee/rails/extensions.rb
153
+ - lib/manatee/rails/handler.rb
154
+ - lib/manatee/rails/hash_visitor.rb
155
+ - lib/manatee/rails/helper.rb
156
+ - lib/manatee/rails/resolver.rb
157
+ - lib/manatee/rails/routes_compiler.rb
158
+ - lib/manatee/sprockets.rb
159
+ - lib/manatee/sprockets/jsh_processor_2x.rb
160
+ - lib/manatee/sprockets/jsh_processor_3x.rb
161
+ - lib/manatee/version.rb
162
+ - manatee.gemspec
163
+ - test/example/renderer.js.erb
164
+ - test/example/translations.en.yml
165
+ - test/example/views/index.jst.eco
166
+ - test/helpers/asset_tag_test.rb
167
+ - test/helpers/asset_url_test.rb
168
+ - test/helpers/form_options_test.rb
169
+ - test/helpers/form_tag_test.rb
170
+ - test/helpers/javascript_test.rb
171
+ - test/helpers/number_test.rb
172
+ - test/helpers/tag_test.rb
173
+ - test/support/dom_assertion.rb
174
+ - test/support/view_test.rb
175
+ - test/test_helper.rb
176
+ homepage: ''
177
+ licenses:
178
+ - MIT
179
+ metadata: {}
180
+ post_install_message:
181
+ rdoc_options: []
182
+ require_paths:
183
+ - lib
184
+ required_ruby_version: !ruby/object:Gem::Requirement
185
+ requirements:
186
+ - - ">="
187
+ - !ruby/object:Gem::Version
188
+ version: '0'
189
+ required_rubygems_version: !ruby/object:Gem::Requirement
190
+ requirements:
191
+ - - ">"
192
+ - !ruby/object:Gem::Version
193
+ version: 1.3.1
194
+ requirements: []
195
+ rubyforge_project:
196
+ rubygems_version: 2.4.6
197
+ signing_key:
198
+ specification_version: 4
199
+ summary: Javascript Template Render [for Rails]?
200
+ test_files:
201
+ - test/example/renderer.js.erb
202
+ - test/example/translations.en.yml
203
+ - test/example/views/index.jst.eco
204
+ - test/helpers/asset_tag_test.rb
205
+ - test/helpers/asset_url_test.rb
206
+ - test/helpers/form_options_test.rb
207
+ - test/helpers/form_tag_test.rb
208
+ - test/helpers/javascript_test.rb
209
+ - test/helpers/number_test.rb
210
+ - test/helpers/tag_test.rb
211
+ - test/support/dom_assertion.rb
212
+ - test/support/view_test.rb
213
+ - test/test_helper.rb