lanes 0.0.5 → 0.0.8
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +0 -1
- data/Gemfile +0 -1
- data/README.md +2 -0
- data/client/lanes/data/Bootstrap.coffee +2 -2
- data/client/lanes/data/Collection.coffee +4 -0
- data/client/lanes/data/Config.coffee +0 -5
- data/client/lanes/data/Model.coffee +236 -150
- data/client/lanes/data/PubSub.coffee +6 -12
- data/client/lanes/data/Sync.coffee +1 -0
- data/client/lanes/extension/Extensions.coffee +4 -2
- data/client/lanes/lib/MakeBaseClass.coffee +1 -1
- data/client/lanes/minimal.js +11 -0
- data/client/lanes/minimal.scss.erb +12 -0
- data/client/lanes/screens/Base.coffee +1 -2
- data/client/lanes/screens/Instance.coffee +52 -0
- data/client/lanes/vendor/packaged.js +1 -2
- data/client/lanes/views/Base.coffee +12 -10
- data/client/lanes/workspace.scss.erb +3 -0
- data/client/lanes/workspace/index.js +2 -12
- data/docs/command.md +111 -0
- data/docs/model.md +188 -0
- data/docs/todo-example-part-1.md +71 -0
- data/docs/view.md +275 -0
- data/{spec/client/jasmine_examples/PlayerSpec.js → docs/welcome.md} +0 -0
- data/lanes.gemspec +3 -1
- data/lib/lanes/api/helper_methods.rb +8 -0
- data/lib/lanes/api/javascript_processor.rb +14 -10
- data/lib/lanes/api/pub_sub.rb +7 -7
- data/lib/lanes/api/request_wrapper.rb +1 -0
- data/lib/lanes/api/root.rb +2 -7
- data/lib/lanes/api/sprockets_compressor.rb +6 -2
- data/lib/lanes/api/sprockets_extension.rb +25 -9
- data/lib/lanes/api/test_specs.rb +13 -9
- data/lib/lanes/command.rb +16 -6
- data/lib/lanes/command/app.rb +11 -5
- data/lib/lanes/command/generate_model.rb +4 -3
- data/lib/lanes/command/generate_screen.rb +2 -1
- data/lib/lanes/command/generate_view.rb +1 -1
- data/lib/lanes/command/named_command.rb +5 -4
- data/lib/lanes/command/templates/Gemfile +1 -2
- data/lib/lanes/command/templates/client/data/Model.coffee +3 -3
- data/lib/lanes/command/templates/client/{namespace-extension.js → index.js} +0 -0
- data/lib/lanes/command/templates/client/screens/Screen.coffee +1 -3
- data/lib/lanes/command/templates/client/{styles/styles.scss → styles.scss} +0 -0
- data/lib/lanes/command/templates/client/views/View.coffee +1 -3
- data/lib/lanes/command/templates/config/lanes.rb +1 -1
- data/lib/lanes/command/templates/gitignore +1 -0
- data/lib/lanes/command/templates/lib/namespace/screen.rb +1 -1
- data/lib/lanes/command/templates/public/.gitkeep +0 -0
- data/lib/lanes/command/templates/spec/client/Screen.coffee +7 -0
- data/lib/lanes/command/templates/spec/client/views/ViewSpec.coffee +2 -2
- data/lib/lanes/concerns/all.rb +1 -1
- data/lib/lanes/concerns/sanitize_fields.rb +32 -0
- data/lib/lanes/concerns/set_attribute_data.rb +4 -4
- data/lib/lanes/db.rb +7 -8
- data/lib/lanes/extension.rb +37 -3
- data/lib/lanes/guard_tasks.rb +2 -2
- data/lib/lanes/model.rb +2 -2
- data/lib/lanes/screens.rb +1 -0
- data/lib/lanes/spec_helper.rb +17 -6
- data/{spec → lib/lanes}/testing_models.rb +1 -1
- data/lib/lanes/version.rb +1 -1
- data/npm-build/compile.coffee +1 -6
- data/public/javascripts/jasmine_examples/Player.js +22 -0
- data/public/javascripts/jasmine_examples/Song.js +7 -0
- data/spec/api/javascript_processor_spec.rb +6 -3
- data/spec/concerns/api_path_spec.rb +1 -1
- data/spec/concerns/association_extensions_spec.rb +7 -3
- data/spec/concerns/attr_accessor_with_default_spec.rb +1 -1
- data/spec/concerns/code_identifier_spec.rb +1 -1
- data/spec/concerns/export_associations_spec.rb +1 -1
- data/spec/concerns/export_methods_spec.rb +1 -14
- data/spec/concerns/export_scope_spec.rb +7 -9
- data/spec/concerns/exported_limits_spec.rb +1 -1
- data/spec/concerns/pub_sub_spec.rb +1 -1
- data/spec/concerns/set_attribute_data_spec.rb +16 -24
- data/spec/configuration_spec.rb +1 -1
- data/spec/helpers/lanes-helpers.coffee +61 -0
- data/spec/lanes/data/ModelSpec.coffee +152 -0
- data/spec/lanes/data/PubSubSpec.coffee +21 -0
- data/spec/{client/view → lanes/views}/BaseSpec.coffee +6 -26
- data/spec/numbers_spec.rb +1 -1
- data/spec/strings_spec.rb +1 -1
- data/views/index.erb +3 -10
- data/views/specs.erb +4 -1
- metadata +62 -16
- data/client/lanes/plugins/trigger.coffee +0 -15
- data/client/lanes/workspace/Instance.es6 +0 -64
- data/lib/lanes/concerns/sanitize_api_data.rb +0 -15
- data/spec/api/user_spec.rb +0 -52
- data/spec/fixtures/lanes/users.yml +0 -13
- data/spec/locked_fields_spec.rb +0 -27
- data/spec/role_collection_spec.rb +0 -19
- data/spec/user_role_spec.rb +0 -7
- data/spec/user_spec.rb +0 -53
@@ -0,0 +1,32 @@
|
|
1
|
+
require 'sanitize'
|
2
|
+
|
3
|
+
module Lanes
|
4
|
+
module Concerns
|
5
|
+
|
6
|
+
# @see ClassMethods
|
7
|
+
module SanitizeFields
|
8
|
+
extend ActiveSupport::Concern
|
9
|
+
|
10
|
+
module ClassMethods
|
11
|
+
# Remove invalid HTML from fields before save
|
12
|
+
# by using the "sanitize" gem's Sanitize.fragment method.
|
13
|
+
#
|
14
|
+
# Defaults to removing all HTML, but a valid Sanitize::Config
|
15
|
+
# hash can be specified as well.
|
16
|
+
def sanitize_fields(*fields)
|
17
|
+
options = fields.extract_options!
|
18
|
+
using = options[:using] || {}
|
19
|
+
before_save do
|
20
|
+
fields.each do |field|
|
21
|
+
value = read_attribute(field)
|
22
|
+
unless value.blank?
|
23
|
+
write_attribute(field, Sanitize.fragment(sanitized,using))
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -104,15 +104,15 @@ module Lanes::Concerns
|
|
104
104
|
|
105
105
|
result[name] = if value.is_a?(Hash) && [:belongs_to,:has_one].include?(association.reflection.macro)
|
106
106
|
target = association.target || association.build
|
107
|
-
target.set_attribute_data(value)
|
107
|
+
target.set_attribute_data(value, user)
|
108
108
|
elsif value.is_a?(Array) && :has_many == association.reflection.macro
|
109
|
-
_set_attribute_data_from_collection(association, value)
|
109
|
+
_set_attribute_data_from_collection(association, value, user)
|
110
110
|
end
|
111
111
|
end
|
112
112
|
end
|
113
113
|
end
|
114
114
|
|
115
|
-
def _set_attribute_data_from_collection(association, value)
|
115
|
+
def _set_attribute_data_from_collection(association, value, user)
|
116
116
|
|
117
117
|
records = if association.loaded?
|
118
118
|
association.target
|
@@ -129,7 +129,7 @@ module Lanes::Concerns
|
|
129
129
|
else
|
130
130
|
records.detect{ |r| r.id.to_s == value['id'].to_s }
|
131
131
|
end
|
132
|
-
record.set_attribute_data(association_data) if record
|
132
|
+
record.set_attribute_data(association_data, user) if record
|
133
133
|
end
|
134
134
|
end
|
135
135
|
|
data/lib/lanes/db.rb
CHANGED
@@ -6,14 +6,13 @@ module Lanes
|
|
6
6
|
attr_accessor(:config_file)
|
7
7
|
|
8
8
|
def establish_connection( env = ENV['RAILS_ENV'] || 'development')
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
::ActiveRecord::Base.establish_connection( configuration )
|
9
|
+
if ENV['DATABASE_URL']
|
10
|
+
::ActiveRecord::Base.establish_connection( ENV['DATABASE_URL'] )
|
11
|
+
else
|
12
|
+
config = YAML::load( IO.read( config_file || "config/database.yml" ) )
|
13
|
+
::ActiveRecord::Base.configurations = config
|
14
|
+
::ActiveRecord::Base.establish_connection( ::ActiveRecord::Base.configurations[ env ] )
|
15
|
+
end
|
17
16
|
end
|
18
17
|
|
19
18
|
def load_seed
|
data/lib/lanes/extension.rb
CHANGED
@@ -14,6 +14,10 @@ module Lanes
|
|
14
14
|
# Array of Pathname's to add to sprockets
|
15
15
|
attr_accessor_with_default :root_path
|
16
16
|
|
17
|
+
# Does the extension use PubSub functionality
|
18
|
+
class_attribute :uses_pub_sub
|
19
|
+
class_attribute :uses_workspace
|
20
|
+
|
17
21
|
# Load extension before/after the named extensions
|
18
22
|
class_attribute :before
|
19
23
|
class_attribute :after
|
@@ -26,8 +30,12 @@ module Lanes
|
|
26
30
|
{}
|
27
31
|
end
|
28
32
|
|
33
|
+
def stylesheet_include
|
34
|
+
self.identifier + '/styles'
|
35
|
+
end
|
36
|
+
|
29
37
|
def javascript_include
|
30
|
-
self.identifier
|
38
|
+
self.identifier
|
31
39
|
end
|
32
40
|
|
33
41
|
def client_namespace
|
@@ -35,7 +43,13 @@ module Lanes
|
|
35
43
|
end
|
36
44
|
|
37
45
|
def client_paths
|
38
|
-
[
|
46
|
+
[ root_path.join('client') ]
|
47
|
+
end
|
48
|
+
|
49
|
+
def client_images
|
50
|
+
images = []
|
51
|
+
root_path.join('client','images').find{|path| images << path if path.file? }
|
52
|
+
images
|
39
53
|
end
|
40
54
|
|
41
55
|
def route(route_set)
|
@@ -60,6 +74,14 @@ module Lanes
|
|
60
74
|
Definition.descendants
|
61
75
|
end
|
62
76
|
|
77
|
+
def require_workspace?
|
78
|
+
all.detect{|ext| ext.uses_workspace }
|
79
|
+
end
|
80
|
+
|
81
|
+
def require_pub_sub?
|
82
|
+
all.detect{|ext| ext.uses_pub_sub }
|
83
|
+
end
|
84
|
+
|
63
85
|
def sorted
|
64
86
|
unmapped = all
|
65
87
|
mapped = []
|
@@ -97,13 +119,22 @@ module Lanes
|
|
97
119
|
end
|
98
120
|
|
99
121
|
def client_bootstrap_data(view)
|
100
|
-
data = {
|
122
|
+
data = {
|
123
|
+
csrf_token: Rack::Csrf.csrf_token(view.env),
|
124
|
+
root_view: Lanes.config.root_view,
|
125
|
+
api_path: Lanes.config.mounted_at,
|
126
|
+
pub_sub: require_pub_sub?
|
127
|
+
}
|
101
128
|
each do | ext |
|
102
129
|
data[ext.identifier] = ext.client_bootstrap_data(view)
|
103
130
|
end
|
104
131
|
return data
|
105
132
|
end
|
106
133
|
|
134
|
+
def client_images
|
135
|
+
each{|ext| }
|
136
|
+
end
|
137
|
+
|
107
138
|
def load_current_config
|
108
139
|
config_file = Pathname.getwd.join('config','lanes.rb')
|
109
140
|
if config_file.exist?
|
@@ -114,4 +145,7 @@ module Lanes
|
|
114
145
|
end
|
115
146
|
|
116
147
|
end
|
148
|
+
|
149
|
+
|
150
|
+
|
117
151
|
end
|
data/lib/lanes/guard_tasks.rb
CHANGED
@@ -27,8 +27,8 @@ module Lanes
|
|
27
27
|
})
|
28
28
|
|
29
29
|
dsl.guard :jasmine, jasmine_options do
|
30
|
-
dsl.watch(%r{^client/(.+?)\.(js|coffee)$}){ |m| "spec
|
31
|
-
dsl.watch(%r{^spec
|
30
|
+
dsl.watch(%r{^client/(.+?)\.(js|coffee)$}){ |m| "spec/#{m[1]}Spec.#{m[2]}" }
|
31
|
+
dsl.watch(%r{^spec/.*(?:_s|S)pec\.coffee$})
|
32
32
|
matchers.client_matches.call if matchers.client_matches
|
33
33
|
end
|
34
34
|
|
data/lib/lanes/model.rb
CHANGED
@@ -17,10 +17,10 @@ module Lanes
|
|
17
17
|
include Concerns::ExportScope
|
18
18
|
include Concerns::ExportAssociations
|
19
19
|
include Concerns::ExportJoinTables
|
20
|
-
include Concerns::SanitizeApiData
|
21
20
|
include Concerns::AssociationExtensions
|
22
21
|
include Concerns::ApiPath
|
23
|
-
|
22
|
+
include Concerns::SanitizeFields
|
23
|
+
|
24
24
|
end
|
25
25
|
|
26
26
|
end
|
data/lib/lanes/screens.rb
CHANGED
data/lib/lanes/spec_helper.rb
CHANGED
@@ -1,5 +1,4 @@
|
|
1
1
|
require 'minitest/autorun'
|
2
|
-
require 'mocha/mini_test'
|
3
2
|
require 'rack/test'
|
4
3
|
require 'lanes'
|
5
4
|
require 'lanes/api'
|
@@ -9,7 +8,7 @@ require 'active_record/fixtures'
|
|
9
8
|
require 'minitest/around/unit'
|
10
9
|
require 'minitest/spec'
|
11
10
|
require 'minitest/autorun'
|
12
|
-
require '
|
11
|
+
require 'mocha/mini_test'
|
13
12
|
|
14
13
|
require_relative 'testing_models'
|
15
14
|
|
@@ -22,16 +21,28 @@ ActiveSupport::Dependencies.mechanism = :require
|
|
22
21
|
|
23
22
|
module Lanes
|
24
23
|
|
24
|
+
class DummyUser
|
25
|
+
def can_read?(*args)
|
26
|
+
true
|
27
|
+
end
|
28
|
+
def can_write?(*args)
|
29
|
+
true
|
30
|
+
end
|
31
|
+
def can_delete?(*args)
|
32
|
+
true
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
25
36
|
class TestCase < ActiveSupport::TestCase
|
26
37
|
include Lanes
|
27
38
|
include ActiveRecordMocks::IncludeMe
|
28
39
|
|
29
40
|
include ActiveRecord::TestFixtures
|
30
41
|
self.fixture_path = Pathname.new(__FILE__).dirname.join('fixtures')
|
31
|
-
setup do
|
32
|
-
|
33
|
-
|
34
|
-
end
|
42
|
+
# setup do
|
43
|
+
# #Thread.current[:lanes_current_user] = lanes_users(:admin)
|
44
|
+
# #Lanes::Access.calculate_model_access!
|
45
|
+
# end
|
35
46
|
|
36
47
|
self.use_transactional_fixtures = true
|
37
48
|
fixtures :all
|
data/lib/lanes/version.rb
CHANGED
data/npm-build/compile.coffee
CHANGED
@@ -3,13 +3,8 @@
|
|
3
3
|
browserify = require 'browserify'
|
4
4
|
fs = require 'fs'
|
5
5
|
path = require 'path'
|
6
|
-
#exposify = require 'exposify'
|
7
6
|
|
8
|
-
|
9
|
-
#exposify.config = { jquery: 'jQuery', underscore: '_' }
|
10
|
-
|
11
|
-
browserify({ debug: true })
|
12
|
-
# .transform(exposify)
|
7
|
+
browserify({ debug: false })
|
13
8
|
.require(require.resolve('./template.js'), { entry: true })
|
14
9
|
.bundle()
|
15
10
|
.pipe(fs.createWriteStream(path.join(__dirname, '../client/lanes/vendor/packaged.js'), 'utf8'))
|
@@ -0,0 +1,22 @@
|
|
1
|
+
function Player() {
|
2
|
+
}
|
3
|
+
Player.prototype.play = function(song) {
|
4
|
+
this.currentlyPlayingSong = song;
|
5
|
+
this.isPlaying = true;
|
6
|
+
};
|
7
|
+
|
8
|
+
Player.prototype.pause = function() {
|
9
|
+
this.isPlaying = false;
|
10
|
+
};
|
11
|
+
|
12
|
+
Player.prototype.resume = function() {
|
13
|
+
if (this.isPlaying) {
|
14
|
+
throw new Error("song is already playing");
|
15
|
+
}
|
16
|
+
|
17
|
+
this.isPlaying = true;
|
18
|
+
};
|
19
|
+
|
20
|
+
Player.prototype.makeFavorite = function() {
|
21
|
+
this.currentlyPlayingSong.persistFavoriteStatus(true);
|
22
|
+
};
|
@@ -48,7 +48,7 @@ Bar.extend(Foo)
|
|
48
48
|
EOS
|
49
49
|
|
50
50
|
JS=<<-EOS
|
51
|
-
(function(Lanes, _, window, undefined)
|
51
|
+
(function(Lanes, Foo, _, window, FILE, undefined){
|
52
52
|
var Foo;
|
53
53
|
|
54
54
|
NS.Baz = (function() {
|
@@ -95,13 +95,16 @@ Foo = (function() {
|
|
95
95
|
|
96
96
|
Bar.extend(Foo);
|
97
97
|
|
98
|
-
})(window.Lanes, window._, window);
|
98
|
+
})(window.Lanes,(window.Lanes ? window.Lanes['Foo'] : null),window._, window,{namespace:(window.Lanes ? window.Lanes['Foo'] : null),extension:'Foo',file:'baz'});
|
99
99
|
EOS
|
100
100
|
|
101
|
+
Scope = Struct.new(:logical_path)
|
101
102
|
|
102
103
|
def test_coffeescript_generation
|
103
104
|
template = API::CoffeeScriptWrapper.new{ |t| SCRIPT }
|
104
105
|
assert_equal CLEANED, template.cleaned
|
105
|
-
|
106
|
+
|
107
|
+
|
108
|
+
assert_equal JS.chomp, template.render(Scope.new("foo/bar/baz"))
|
106
109
|
end
|
107
110
|
end
|
@@ -1,4 +1,4 @@
|
|
1
|
-
|
1
|
+
require "lanes/spec_helper"
|
2
2
|
|
3
3
|
|
4
4
|
class AssociationExtensionsTest < Lanes::TestCase
|
@@ -13,8 +13,12 @@ class AssociationExtensionsTest < Lanes::TestCase
|
|
13
13
|
end
|
14
14
|
|
15
15
|
def test_adds_listener
|
16
|
-
Tmhm.
|
17
|
-
TestModel.has_one(:tmhm,:listen=>{:save=>:
|
16
|
+
Tmhm.belongs_to(:tm)
|
17
|
+
TestModel.has_one(:tmhm,:listen=>{:save=>:on_tmhm_save}, :inverse_of=>:tm)
|
18
|
+
tm = TestModel.new
|
19
|
+
tm.expects(:on_tmhm_save)
|
20
|
+
tm.build_tmhm
|
21
|
+
assert tm.save
|
18
22
|
end
|
19
23
|
|
20
24
|
def test_exports_associations
|
@@ -1,25 +1,12 @@
|
|
1
|
-
|
1
|
+
require "lanes/spec_helper"
|
2
2
|
|
3
3
|
class ExportMethodsTest < Lanes::TestCase
|
4
4
|
include TestingModels
|
5
5
|
|
6
|
-
def around(&block)
|
7
|
-
with_testing_models(&block)
|
8
|
-
end
|
9
|
-
|
10
|
-
def setup
|
11
|
-
# @model = TestModel.new
|
12
|
-
# @model.bt = TestModelBelongsTo.new
|
13
|
-
end
|
14
|
-
|
15
|
-
def teardown
|
16
|
-
# TestModel.send( :remove_method, :bt_description ) if User.new.respond_to?( :bt_description )
|
17
|
-
end
|
18
6
|
|
19
7
|
|
20
8
|
def test_simple_delegation
|
21
9
|
|
22
|
-
|
23
10
|
refute TestModel.new.respond_to? :bt_description
|
24
11
|
|
25
12
|
TestModel.send :delegate_and_export, "bt_description"
|
@@ -1,15 +1,13 @@
|
|
1
|
-
|
1
|
+
require "lanes/spec_helper"
|
2
2
|
|
3
3
|
class ExportScopeTest < Lanes::TestCase
|
4
|
-
|
5
|
-
|
6
|
-
User.send( :remove_method, :big_query ) if User.respond_to?( :account_name )
|
7
|
-
end
|
8
|
-
|
4
|
+
include TestingModels
|
5
|
+
|
9
6
|
def test_scope_method_creation
|
10
|
-
refute
|
11
|
-
|
12
|
-
assert
|
7
|
+
refute TestModel.respond_to?(:big_query)
|
8
|
+
TestModel.send( :export_scope, :big_query, ->{} )
|
9
|
+
assert TestModel.respond_to?(:big_query)
|
10
|
+
assert TestModel.has_exported_scope?(:big_query,DummyUser.new)
|
13
11
|
end
|
14
12
|
|
15
13
|
end
|