walrus-rb 0.10.1.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.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: ad98e5ed9edf4b7179704ef6eb50bf2774372c5f
4
+ data.tar.gz: 563007daa6fe9274d355dba8c170dfabd296a99c
5
+ SHA512:
6
+ metadata.gz: bf7baf99e2572a229b5f8ba94b8bdfe169cddfddf36ca1e2a2b46309b5bd32496ef8b04a93193e33698a562cfcaf79d85a006e36ef24ae37f9f2dcaa5bf3fe3f
7
+ data.tar.gz: 2f58c35f10cd182c193f2bf8136cc0d0469d22b80207e57eba3ea97a6926da5e49272abf52ca46a26f96c4d6a5696fadb9abcb27631e5362af61026baf119eef
@@ -0,0 +1,18 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ .ruby-version
7
+ Gemfile.lock
8
+ InstalledFiles
9
+ _yardoc
10
+ coverage
11
+ doc/
12
+ lib/bundler/man
13
+ pkg
14
+ rdoc
15
+ spec/reports
16
+ test/tmp
17
+ test/version_tmp
18
+ tmp
data/.rspec ADDED
@@ -0,0 +1 @@
1
+ --color
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in walrus.gemspec
4
+ gemspec
@@ -0,0 +1,15 @@
1
+ # A sample Guardfile
2
+ # More info at https://github.com/guard/guard#readme
3
+
4
+ guard 'spork', :rspec_env => { 'RAILS_ENV' => 'test' } do
5
+ watch('Gemfile')
6
+ watch('Guardfile')
7
+ watch('Gemfile.lock')
8
+ watch('spec/spec_helper.rb') { :rspec }
9
+ watch(%r{^spec/support/.+\.rb$})
10
+ watch(%r{^lib/digital_opera/(.+)\.rb$}) { :rspec }
11
+ end
12
+
13
+ guard :rspec, :all_after_pass => false, :all_on_start => false, :cli => '--drb' do
14
+ watch(%r{^spec/.+_spec\.rb$})
15
+ end
@@ -0,0 +1,20 @@
1
+ Copyright 2014 DIGITALOPERA, LLC
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,45 @@
1
+ # walrus-rb
2
+
3
+ Uses the actual JavaScript implementation of [walrus.js](https://github.com/jeremyruppel/walrus), but supports using Ruby objects as template contexts and Ruby procs as view functions and domain objects
4
+
5
+ ## Installation
6
+
7
+ Add this line to your application's Gemfile:
8
+
9
+ gem 'walrus-rb'
10
+
11
+ And then execute:
12
+
13
+ $ bundle
14
+
15
+ Or install it yourself as:
16
+
17
+ $ gem install walrus-rb
18
+
19
+ ## Current Walrus.js Version
20
+
21
+ walrus 0.10.1
22
+
23
+ ## Config
24
+
25
+ By default, only the core Walrus library is loaded. To load additional helpers:
26
+
27
+ Walrus.configure do |config|
28
+ config.helper_files = ['collections','currencies','dates','inflections','math','strings']
29
+ end
30
+
31
+ You can also load domain objects
32
+
33
+ Walrus.configure do |config|
34
+ config.domain_objects_file = File.expand_path("../walrus_domain_objects.js", __FILE__)
35
+ end
36
+
37
+ An example domain_objects.js file can be found [here](https://github.com/digitalopera/walrus-rb/blob/master/spec/support/javascripts/walrus_domain_objects.js)
38
+
39
+ ## Contributing
40
+
41
+ 1. Fork it ( http://github.com/digitalopera/walrus-rb/fork )
42
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
43
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
44
+ 4. Push to the branch (`git push origin my-new-feature`)
45
+ 5. Create new Pull Request
@@ -0,0 +1,17 @@
1
+ require "bundler/gem_tasks"
2
+
3
+ begin
4
+ require 'bundler/setup'
5
+ rescue LoadError
6
+ puts 'You must `gem install bundler` and `bundle install` to run rake tasks'
7
+ end
8
+
9
+ require 'rspec/core'
10
+ require 'rspec/core/rake_task'
11
+
12
+ Dir[File.join(File.dirname(__FILE__), 'tasks/**/*.rake')].each {|f| load f }
13
+
14
+ desc "Run all specs in spec directory (excluding plugin specs)"
15
+ RSpec::Core::RakeTask.new
16
+ task :default => :spec
17
+
@@ -0,0 +1,7 @@
1
+ require "walrus/version"
2
+ require 'walrus/config'
3
+ require 'walrus/context'
4
+
5
+ module Walrus
6
+ extend Config
7
+ end
@@ -0,0 +1,29 @@
1
+ module Walrus
2
+ # Change config options in an initializer:
3
+ #
4
+ # Walrus.domain_objects_file = 'domain_objects.js'
5
+ #
6
+ # Or in a block:
7
+ #
8
+ # Walrus.configure do |config|
9
+ # config.domain_objects_file = 'domain_objects.js'
10
+ # end
11
+
12
+ module Config
13
+ extend self
14
+
15
+ attr_writer :domain_objects_file, :helper_files
16
+
17
+ def configure
18
+ yield self
19
+ end
20
+
21
+ def domain_objects_file
22
+ @domain_objects_file ||= ''
23
+ end
24
+
25
+ def helper_files
26
+ @helper_files ||= []
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,42 @@
1
+ require 'v8'
2
+
3
+ module Walrus
4
+ class Context
5
+ def initialize
6
+ @js = V8::Context.new
7
+
8
+ # load core file
9
+ self.load_js File.expand_path("../../../vendor/walrus.js", __FILE__)
10
+
11
+ # load additional files
12
+ Walrus.helper_files.each do |name|
13
+ self.load_js File.expand_path("../../../vendor/walrus.#{name}.js", __FILE__)
14
+ end
15
+
16
+ # load domain_objects_file is supplied
17
+ unless Walrus.domain_objects_file.empty?
18
+ self.load_js Walrus.domain_objects_file
19
+ end
20
+
21
+ return self
22
+ end
23
+
24
+ def parse(*args)
25
+ @template = walrus.Parser.parse(*args)
26
+
27
+ return self
28
+ end
29
+
30
+ def compile(object={})
31
+ @template.compile(object)
32
+ end
33
+
34
+ def walrus
35
+ @js.eval('Walrus')
36
+ end
37
+
38
+ def load_js(file_path)
39
+ @js.load(file_path)
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,3 @@
1
+ module Walrus
2
+ VERSION = "0.10.1.0"
3
+ end
@@ -0,0 +1,13 @@
1
+ require 'spec_helper'
2
+
3
+ describe 'Blocks/Helpers' do
4
+ let(:template){ Walrus::Context.new.parse(str) }
5
+ let(:compile){ template.compile({isTrue: true}) }
6
+ let(:str){ '{{:if @isTrue do}}in if{{end}}' }
7
+
8
+ describe ':if' do
9
+ it 'should render' do
10
+ compile.should eq 'in if'
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,15 @@
1
+ require 'spec_helper'
2
+
3
+ describe 'collections' do
4
+ let(:template){ Walrus::Context.new.parse(str) }
5
+ let(:compile){ template.compile(numbers) }
6
+ let(:numbers){ {numbers: [{name:'Bob'},{name: 'Jim'}]} }
7
+
8
+ describe ':last' do
9
+ let(:str){ '{{ :each numbers | :last do }}{{name}}{{end}}' }
10
+
11
+ it 'should render' do
12
+ compile.should eq 'Jim'
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,13 @@
1
+ require 'spec_helper'
2
+
3
+ describe 'Context' do
4
+ let(:template){ Walrus::Context.new.parse(str) }
5
+ let(:compile){ template.compile }
6
+ let(:str){ '{{@name}}' }
7
+
8
+ context 'when compile was not passed data' do
9
+ it 'should not raise error' do
10
+ expect{ compile }.to_not raise_error
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,13 @@
1
+ require 'spec_helper'
2
+
3
+ describe 'Currencies' do
4
+ let(:template){ Walrus::Context.new.parse(str) }
5
+ let(:compile){ template.compile({isTrue: true}) }
6
+ let(:str){ '{{ 36000 | :currency }}' }
7
+
8
+ describe ':currency' do
9
+ it 'should render' do
10
+ compile.should eq '$36,000.00'
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,13 @@
1
+ require 'spec_helper'
2
+
3
+ describe 'Dates' do
4
+ let(:template){ Walrus::Context.new.parse(str) }
5
+ let(:compile){ template.compile({created_at: '12/12/2001' }) }
6
+ let(:str){ "{{created_at | :strftime( '%F' )}}" }
7
+
8
+ describe ':strftime' do
9
+ it 'should render' do
10
+ compile.should eq '2001-12-12'
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,20 @@
1
+ require 'spec_helper'
2
+
3
+ describe 'Domain' do
4
+ let(:context){ Walrus::Context.new }
5
+ let(:template){ context.parse(str) }
6
+ let(:compile) do
7
+ template.compile({
8
+ employees: [
9
+ {firstName: 'Jim', lastName: 'Johnson'}
10
+ ]
11
+ })
12
+ end
13
+ let(:str){ '{{:each employees | :as( "person" ) do}}{{fullName()}}{{end}}' }
14
+
15
+ it 'should render' do
16
+ # context.load_js(File.expand_path("../support/javascripts/walrus_domain_objects.js", __FILE__))
17
+
18
+ compile.should eq 'Jim Johnson'
19
+ end
20
+ end
@@ -0,0 +1,13 @@
1
+ require 'spec_helper'
2
+
3
+ describe 'Filters' do
4
+ let(:template){ Walrus::Context.new.parse(str) }
5
+ let(:compile){ template.compile({isTrue: true}) }
6
+ let(:str){ '{{:if @isTrue | :equals(true) do}}in if{{end}}' }
7
+
8
+ describe ':equals' do
9
+ it 'should render' do
10
+ compile.should eq 'in if'
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,13 @@
1
+ require 'spec_helper'
2
+
3
+ describe 'inflections' do
4
+ let(:template){ Walrus::Context.new.parse(str) }
5
+ let(:compile){ template.compile }
6
+ let(:str){ "{{ 'book' | :pluralize }}" }
7
+
8
+ describe ':strftime' do
9
+ it 'should render' do
10
+ compile.should eq 'books'
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,14 @@
1
+ require 'spec_helper'
2
+
3
+ describe 'math' do
4
+ let(:template){ Walrus::Context.new.parse(str) }
5
+ let(:compile){ template.compile }
6
+
7
+ describe ':last' do
8
+ let(:str){ '{{ 15 | :plus( 6 ) }}' }
9
+
10
+ it 'should render' do
11
+ compile.should eq '21'
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,34 @@
1
+ ENV["RAILS_ENV"] ||= 'test'
2
+
3
+ require 'rubygems'
4
+ require 'spork'
5
+ require 'walrus'
6
+
7
+ Spork.prefork do
8
+ require 'rspec/autorun'
9
+ require 'mocha/api'
10
+
11
+ # Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each {|f| require f}
12
+
13
+ # Configure RSpec ---------------------------------------
14
+ RSpec.configure do |config|
15
+ config.mock_framework = :mocha
16
+
17
+ # Run specs in random order to surface order dependencies. If you find an
18
+ # order dependency and want to debug it, you can fix the order by providing
19
+ # the seed, which is printed after each run.
20
+ # --seed 1234
21
+ config.order = "random"
22
+ # config.order = 63206
23
+ end
24
+
25
+
26
+ Walrus.configure do |config|
27
+ config.domain_objects_file = File.expand_path("../support/javascripts/walrus_domain_objects.js", __FILE__)
28
+ config.helper_files = ['collections','currencies','dates','inflections','math','strings']
29
+ end
30
+ end
31
+
32
+ Spork.each_run do
33
+
34
+ end
@@ -0,0 +1,11 @@
1
+ require 'spec_helper'
2
+
3
+ describe 'Strings' do
4
+ let(:template){ Walrus::Context.new.parse(str) }
5
+ let(:compile){ template.compile }
6
+ let(:str){ '{{ "hello" | :reverse }}' }
7
+
8
+ it 'should render' do
9
+ compile.should eq 'olleh'
10
+ end
11
+ end
@@ -0,0 +1,22 @@
1
+ // Walrus.Domain.person = {
2
+ // fullName: function(){
3
+ // return this.firstName + ' ' + this.lastName;
4
+ // }
5
+ // }
6
+
7
+ (function(){
8
+ objects = {
9
+ person: {
10
+ fullName: function(){
11
+ return this.firstName + ' ' + this.lastName;
12
+ }
13
+ }
14
+ };
15
+
16
+ for (key in objects){
17
+ if (objects.hasOwnProperty(key)) {
18
+ Walrus.Domain[key] = objects[key];
19
+ }
20
+ }
21
+
22
+ })();
@@ -0,0 +1,234 @@
1
+ (function() {
2
+ var Walrus;
3
+
4
+ Walrus = (typeof exports !== "undefined" && exports !== null ? require('./walrus') : this).Walrus;
5
+
6
+ /**
7
+ * *:first*
8
+ * Selects the first _count_ items of the array. Defaults to only the first item.
9
+ *
10
+ * Parameters:
11
+ * count - Optional: how many items to include
12
+ *
13
+ * Usage:
14
+ *
15
+ * {{ :each numbers | :first do}}
16
+ * // 1
17
+ * {{ end }}
18
+ *
19
+ * {{ :each numbers | :first( 5 ) do }}
20
+ * // 1 2 3 4 5
21
+ * {{ end }}
22
+ */
23
+
24
+ Walrus.addFilter('first', function(array, count) {
25
+ if (count != null) {
26
+ return array.slice(0, count);
27
+ } else {
28
+ return array[0];
29
+ }
30
+ });
31
+
32
+ /**
33
+ * *:last*
34
+ * Selects the last _count_ items of the array. Defaults to only the last item.
35
+ *
36
+ * Parameters:
37
+ * count - Optional: how many items to include
38
+ *
39
+ * Usage:
40
+ *
41
+ * {{ :each numbers | :last do}}
42
+ * // 10
43
+ * {{ end }}
44
+ *
45
+ * {{ :each numbers | :last( 5 ) do }}
46
+ * // 6 7 8 9 10
47
+ * {{ end }}
48
+ */
49
+
50
+ Walrus.addFilter('last', function(array, count) {
51
+ if (count != null) {
52
+ return array.slice(-count);
53
+ } else {
54
+ return array[array.length - 1];
55
+ }
56
+ });
57
+
58
+ /**
59
+ * *:after*
60
+ * Selects all of the items in the array except for the first _count_.
61
+ *
62
+ * Parameters:
63
+ * count - how many items to omit from the beginning
64
+ *
65
+ * Usage:
66
+ *
67
+ * {{ :each numbers | :after( 3 ) do }}
68
+ * // 4 5 6 7 8 9 10
69
+ * {{ end }}
70
+ */
71
+
72
+ Walrus.addFilter('after', function(array, count) {
73
+ return array.slice(count);
74
+ });
75
+
76
+ /**
77
+ * *:before*
78
+ * Selects all of the items in the array except for the last _count_.
79
+ *
80
+ * Parameters:
81
+ * count - how many items to omit from the end
82
+ *
83
+ * Usage:
84
+ *
85
+ * {{ :each numbers | :before( 3 ) do }}
86
+ * // 1 2 3 4 5 6 7
87
+ * {{ end }}
88
+ */
89
+
90
+ Walrus.addFilter('before', function(array, count) {
91
+ return array.slice(0, -count);
92
+ });
93
+
94
+ /**
95
+ * *:count*
96
+ * Returns the length of the given array.
97
+ *
98
+ * Parameters: none
99
+ *
100
+ * Usage:
101
+ *
102
+ * var numbers = [ 1, 2, 3, 4, 5 ];
103
+ *
104
+ * {{ numbers | :count }} // => 5
105
+ */
106
+
107
+ Walrus.addFilter('count', function(array) {
108
+ return array.length;
109
+ });
110
+
111
+ /**
112
+ * *:any*
113
+ * Returns true if the array is not empty. Opposite of `:empty`.
114
+ *
115
+ * Parameters: none
116
+ *
117
+ * Usage:
118
+ *
119
+ * var numbers = [ 1, 2, 3, 4, 5 ];
120
+ *
121
+ * {{ numbers | :any }} // => true
122
+ */
123
+
124
+ Walrus.addFilter('any', function(array) {
125
+ return array.length > 0;
126
+ });
127
+
128
+ /**
129
+ * *:empty*
130
+ * Returns true of the array is empty. Opposite of `:any`.
131
+ *
132
+ * Parameters: none
133
+ *
134
+ * Usage:
135
+ *
136
+ * var numbers = [ 1, 2, 3, 4, 5 ];
137
+ *
138
+ * {{ numbers | :empty }} // => false
139
+ */
140
+
141
+ Walrus.addFilter('empty', function(array) {
142
+ return array.length === 0;
143
+ });
144
+
145
+ /**
146
+ * *:join*
147
+ * Joins an array into a string, optionally with a separator
148
+ *
149
+ * Parameters:
150
+ * separator - (Optional) string to join on
151
+ *
152
+ * Usage:
153
+ *
154
+ * var numbers [ 1, 2, 3 ];
155
+ *
156
+ * {{ numbers | :join }} // => "123"
157
+ * {{ numbers | :join( ', ' ) }} // => "1, 2, 3"
158
+ */
159
+
160
+ Walrus.addFilter('join', function(array, separator) {
161
+ if (separator == null) separator = '';
162
+ return array.join(separator);
163
+ });
164
+
165
+ /**
166
+ * *:sort*
167
+ * Sorts the members of an array, optionally by a specific field
168
+ *
169
+ * Parameters:
170
+ * field - (Optional) field to compare by
171
+ *
172
+ * Usage:
173
+ *
174
+ * var names = [ 'Billy', 'Alex', 'Don' ]
175
+ *
176
+ * {{ names | :sort }} // => [ 'Alex', 'Billy', 'Don' ]
177
+ * {{ names | :sort( 'length' ) }} // [ 'Don', 'Billy', 'Alex' ]
178
+ */
179
+
180
+ Walrus.addFilter('sort', function(array, field) {
181
+ if (field != null) {
182
+ return array.sort(function(one, two) {
183
+ return one[field] > two[field];
184
+ });
185
+ } else {
186
+ return array.sort();
187
+ }
188
+ });
189
+
190
+ /**
191
+ * *:in_groups_of*
192
+ * Splits the given array into sub-arrays with at most `count` items apiece
193
+ *
194
+ * Parameters:
195
+ * count - the number of items to be placed in each group
196
+ *
197
+ * Usage:
198
+ *
199
+ * var numbers = [ 1, 2, 3, 4, 5 ];
200
+ *
201
+ * {{ :each numbers | :in_groups_of( 3 ) }} // => [ [ 1, 2, 3 ], [ 4, 5 ] ]
202
+ */
203
+
204
+ Walrus.addFilter('in_groups_of', function(array, count) {
205
+ return Walrus.Utils.reduce(array, [[]], function(memo, item) {
206
+ var group;
207
+ group = memo[memo.length - 1];
208
+ if (group.length < count) {
209
+ group.push(item);
210
+ } else {
211
+ memo.push([item]);
212
+ }
213
+ return memo;
214
+ });
215
+ });
216
+
217
+ /**
218
+ * *enumerable* domain methods
219
+ * TODO document these
220
+ */
221
+
222
+ Walrus.Domain.enumerable = {
223
+ first: function() {
224
+ return this['$index'] === 0;
225
+ },
226
+ last: function() {
227
+ return this['$index'] === this['$length'] - 1;
228
+ },
229
+ middle: function() {
230
+ return !(this.first() || this.last());
231
+ }
232
+ };
233
+
234
+ }).call(this);