lanes 0.0.5 → 0.0.8
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.
- 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
|