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.
Files changed (96) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +0 -1
  3. data/Gemfile +0 -1
  4. data/README.md +2 -0
  5. data/client/lanes/data/Bootstrap.coffee +2 -2
  6. data/client/lanes/data/Collection.coffee +4 -0
  7. data/client/lanes/data/Config.coffee +0 -5
  8. data/client/lanes/data/Model.coffee +236 -150
  9. data/client/lanes/data/PubSub.coffee +6 -12
  10. data/client/lanes/data/Sync.coffee +1 -0
  11. data/client/lanes/extension/Extensions.coffee +4 -2
  12. data/client/lanes/lib/MakeBaseClass.coffee +1 -1
  13. data/client/lanes/minimal.js +11 -0
  14. data/client/lanes/minimal.scss.erb +12 -0
  15. data/client/lanes/screens/Base.coffee +1 -2
  16. data/client/lanes/screens/Instance.coffee +52 -0
  17. data/client/lanes/vendor/packaged.js +1 -2
  18. data/client/lanes/views/Base.coffee +12 -10
  19. data/client/lanes/workspace.scss.erb +3 -0
  20. data/client/lanes/workspace/index.js +2 -12
  21. data/docs/command.md +111 -0
  22. data/docs/model.md +188 -0
  23. data/docs/todo-example-part-1.md +71 -0
  24. data/docs/view.md +275 -0
  25. data/{spec/client/jasmine_examples/PlayerSpec.js → docs/welcome.md} +0 -0
  26. data/lanes.gemspec +3 -1
  27. data/lib/lanes/api/helper_methods.rb +8 -0
  28. data/lib/lanes/api/javascript_processor.rb +14 -10
  29. data/lib/lanes/api/pub_sub.rb +7 -7
  30. data/lib/lanes/api/request_wrapper.rb +1 -0
  31. data/lib/lanes/api/root.rb +2 -7
  32. data/lib/lanes/api/sprockets_compressor.rb +6 -2
  33. data/lib/lanes/api/sprockets_extension.rb +25 -9
  34. data/lib/lanes/api/test_specs.rb +13 -9
  35. data/lib/lanes/command.rb +16 -6
  36. data/lib/lanes/command/app.rb +11 -5
  37. data/lib/lanes/command/generate_model.rb +4 -3
  38. data/lib/lanes/command/generate_screen.rb +2 -1
  39. data/lib/lanes/command/generate_view.rb +1 -1
  40. data/lib/lanes/command/named_command.rb +5 -4
  41. data/lib/lanes/command/templates/Gemfile +1 -2
  42. data/lib/lanes/command/templates/client/data/Model.coffee +3 -3
  43. data/lib/lanes/command/templates/client/{namespace-extension.js → index.js} +0 -0
  44. data/lib/lanes/command/templates/client/screens/Screen.coffee +1 -3
  45. data/lib/lanes/command/templates/client/{styles/styles.scss → styles.scss} +0 -0
  46. data/lib/lanes/command/templates/client/views/View.coffee +1 -3
  47. data/lib/lanes/command/templates/config/lanes.rb +1 -1
  48. data/lib/lanes/command/templates/gitignore +1 -0
  49. data/lib/lanes/command/templates/lib/namespace/screen.rb +1 -1
  50. data/lib/lanes/command/templates/public/.gitkeep +0 -0
  51. data/lib/lanes/command/templates/spec/client/Screen.coffee +7 -0
  52. data/lib/lanes/command/templates/spec/client/views/ViewSpec.coffee +2 -2
  53. data/lib/lanes/concerns/all.rb +1 -1
  54. data/lib/lanes/concerns/sanitize_fields.rb +32 -0
  55. data/lib/lanes/concerns/set_attribute_data.rb +4 -4
  56. data/lib/lanes/db.rb +7 -8
  57. data/lib/lanes/extension.rb +37 -3
  58. data/lib/lanes/guard_tasks.rb +2 -2
  59. data/lib/lanes/model.rb +2 -2
  60. data/lib/lanes/screens.rb +1 -0
  61. data/lib/lanes/spec_helper.rb +17 -6
  62. data/{spec → lib/lanes}/testing_models.rb +1 -1
  63. data/lib/lanes/version.rb +1 -1
  64. data/npm-build/compile.coffee +1 -6
  65. data/public/javascripts/jasmine_examples/Player.js +22 -0
  66. data/public/javascripts/jasmine_examples/Song.js +7 -0
  67. data/spec/api/javascript_processor_spec.rb +6 -3
  68. data/spec/concerns/api_path_spec.rb +1 -1
  69. data/spec/concerns/association_extensions_spec.rb +7 -3
  70. data/spec/concerns/attr_accessor_with_default_spec.rb +1 -1
  71. data/spec/concerns/code_identifier_spec.rb +1 -1
  72. data/spec/concerns/export_associations_spec.rb +1 -1
  73. data/spec/concerns/export_methods_spec.rb +1 -14
  74. data/spec/concerns/export_scope_spec.rb +7 -9
  75. data/spec/concerns/exported_limits_spec.rb +1 -1
  76. data/spec/concerns/pub_sub_spec.rb +1 -1
  77. data/spec/concerns/set_attribute_data_spec.rb +16 -24
  78. data/spec/configuration_spec.rb +1 -1
  79. data/spec/helpers/lanes-helpers.coffee +61 -0
  80. data/spec/lanes/data/ModelSpec.coffee +152 -0
  81. data/spec/lanes/data/PubSubSpec.coffee +21 -0
  82. data/spec/{client/view → lanes/views}/BaseSpec.coffee +6 -26
  83. data/spec/numbers_spec.rb +1 -1
  84. data/spec/strings_spec.rb +1 -1
  85. data/views/index.erb +3 -10
  86. data/views/specs.erb +4 -1
  87. metadata +62 -16
  88. data/client/lanes/plugins/trigger.coffee +0 -15
  89. data/client/lanes/workspace/Instance.es6 +0 -64
  90. data/lib/lanes/concerns/sanitize_api_data.rb +0 -15
  91. data/spec/api/user_spec.rb +0 -52
  92. data/spec/fixtures/lanes/users.yml +0 -13
  93. data/spec/locked_fields_spec.rb +0 -27
  94. data/spec/role_collection_spec.rb +0 -19
  95. data/spec/user_role_spec.rb +0 -7
  96. data/spec/user_spec.rb +0 -53
@@ -53,6 +53,7 @@ module Lanes
53
53
  if false == response[:success]
54
54
  status(406)
55
55
  end
56
+ content_type 'application/json'
56
57
  Oj.dump(response, mode: :compat)
57
58
  end
58
59
 
@@ -1,8 +1,7 @@
1
1
  require 'sinatra'
2
2
  require 'oj'
3
3
  require 'rack/csrf'
4
- require 'sprockets-helpers'
5
- require 'message_bus'
4
+
6
5
  require_relative 'sprockets_extension'
7
6
  require_relative 'helper_methods'
8
7
  require_relative 'pub_sub'
@@ -20,13 +19,9 @@ module Lanes
20
19
  not_found do
21
20
  Oj.dump({ message: "endpoint not found", success: false })
22
21
  end
23
- before do
24
- content_type 'application/json'
25
- end
26
22
 
27
23
  use Rack::Session::Cookie, :key => 'lanes.session', :secret => Lanes.config.session_secret_key_base
28
24
  use ActiveRecord::ConnectionAdapters::ConnectionManagement
29
- use MessageBus::Rack::Middleware
30
25
  error do
31
26
  Lanes.logger.warn request.env['sinatra.error']#.backtrace
32
27
  Oj.dump({
@@ -40,7 +35,7 @@ module Lanes
40
35
  set :views, Pathname.new(__FILE__).dirname.join("../../../views")
41
36
  set :show_exceptions, false
42
37
  DB.establish_connection
43
- PubSub.initialize
38
+ PubSub.initialize(self)
44
39
  Extensions.load_current_config
45
40
  # late load in case an extension has provided an alternative implementation
46
41
  require "lanes/api/null_authentication_provider" unless API.const_defined?(:AuthenticationProvider)
@@ -1,4 +1,5 @@
1
1
  require "yui/compressor"
2
+ require "closure-compiler"
2
3
 
3
4
  module Lanes
4
5
  module API
@@ -9,13 +10,16 @@ module Lanes
9
10
 
10
11
  def initialize_engine
11
12
  require_template_library 'yui/compressor'
13
+ require_template_library 'closure-compiler'
12
14
  end
13
15
 
14
16
  def prepare
15
17
  end
16
18
 
17
19
  def js
18
- @js||=YUI::JavaScriptCompressor.new(:munge => true, :java_opts=>'-client')
20
+ # n.b. setting 'ADVANCED_OPTIMIZATIONS' doesn't work at this time, it
21
+ # introduces JS errors :( Haven't debugged further
22
+ @js||=Closure::Compiler.new
19
23
  end
20
24
  def css
21
25
  @css ||= YUI::CssCompressor.new( :java_opts=>'-client' )
@@ -23,7 +27,7 @@ module Lanes
23
27
  def evaluate(context, locals, &block)
24
28
  case context.content_type
25
29
  when 'application/javascript'
26
- js.compress(data)
30
+ js.compile(data)
27
31
  when 'text/css'
28
32
  css.compress(data)
29
33
  else
@@ -2,8 +2,8 @@ require 'sprockets'
2
2
  require 'sass'
3
3
  require 'sinatra/sprockets-helpers'
4
4
  require_relative 'javascript_processor'
5
- require_relative 'sprockets_compressor'
6
5
  require 'compass/import-once/activate'
6
+ require 'sprockets-helpers'
7
7
 
8
8
  module Lanes
9
9
  module API
@@ -13,9 +13,16 @@ module Lanes
13
13
  def compile!
14
14
  env = ::Sprockets::Environment.new
15
15
  Lanes::API::SprocketsExtension.configure(env, compress:true)
16
- comp = Sprockets::Manifest.new( env.index, "public/assets" )
17
- comp.compile( 'lanes/workspace.js', 'lanes/workspace.css' )
18
- env
16
+ manifest = Sprockets::Manifest.new( env.index, "public/assets/manifest.json" )
17
+ manifest.compile('lanes/workspace.js', 'lanes/workspace.css',
18
+ 'lanes/minimal.js', 'lanes/minimal.css' )
19
+ Extensions.each{|ext|
20
+ manifest.compile(ext.client_images.map(&:to_s))
21
+ }
22
+ Screens::Definition.each(env) do | screen |
23
+ manifest.compile( screen.files )
24
+ end
25
+
19
26
  end
20
27
 
21
28
  def configure(env, compress:false)
@@ -29,6 +36,7 @@ module Lanes
29
36
  ext.client_paths.each{ |path| env.append_path(path) }
30
37
  end
31
38
  if compress
39
+ require_relative 'sprockets_compressor'
32
40
  env.js_compressor = AssetCompressor
33
41
  env.css_compressor = AssetCompressor
34
42
  end
@@ -41,16 +49,16 @@ module Lanes
41
49
  app.set :sprockets, ::Sprockets::Environment.new
42
50
  configure(app.sprockets)
43
51
 
44
- # The url for client
45
- app.set :digest_assets, false
46
-
47
52
  app.configure do
48
53
  ::Sprockets::Helpers.configure do |config|
49
54
  config.environment = app.sprockets
50
55
  config.prefix = Lanes.config.assets_path_prefix
51
- config.digest = app.digest_assets
52
56
  config.public_path = app.public_folder
53
- config.debug = true
57
+ config.debug = !app.production?
58
+ if app.production?
59
+ config.manifest = Sprockets::Manifest.new(app.sprockets,
60
+ "public/assets/manifest.json")
61
+ end
54
62
  end
55
63
  end
56
64
 
@@ -61,6 +69,14 @@ module Lanes
61
69
  settings.sprockets.call env_sprockets
62
70
  end
63
71
  end
72
+ app.configure :production do
73
+ app.get "#{Lanes.config.assets_path_prefix}/*" do |path|
74
+ if manifest_path = ::Sprockets::Helpers.manifest.assets[path]
75
+ path = manifest_path
76
+ end
77
+ send_file "public/assets/" + path
78
+ end
79
+ end
64
80
  end
65
81
 
66
82
  end
@@ -1,13 +1,17 @@
1
1
  require 'jasmine-core'
2
+ require 'lanes/command'
2
3
 
3
4
  module Lanes
4
5
  module API
5
6
 
7
+ LanesDummyExt = Struct.new(:identifier, :root_path)
6
8
  class TestSpecs
9
+
7
10
  cattr_accessor :current
8
11
 
9
- def initialize(root)
10
- @root = root
12
+ attr_accessor :extension
13
+ def initialize(ext)
14
+ @extension = ext
11
15
  end
12
16
 
13
17
  def css_files
@@ -18,13 +22,13 @@ module Lanes
18
22
  urlpath(Jasmine::Core.js_files) +
19
23
  urlpath(Jasmine::Core.boot_files) +
20
24
  urlpath(spec_files("helpers")) +
21
- urlpath(spec_files("client"))
25
+ urlpath(spec_files(extension.identifier))
22
26
  end
23
27
 
24
28
  private
25
29
 
26
30
  def spec_files(path)
27
- dir = @root.join("spec")
31
+ dir = extension.root_path.join("spec")
28
32
  regex = /^#{dir}\//
29
33
  Dir.glob( dir.join(path,"**/*.{coffee,js}") ).map do |file|
30
34
  file.sub(regex,'').sub(/coffee$/,'js')
@@ -37,11 +41,11 @@ module Lanes
37
41
  end
38
42
 
39
43
 
40
- Lanes.config.get(:specs_root) do | root |
41
- TestSpecs.current = TestSpecs.new(root)
42
- Root.sprockets.append_path(root.join("spec"))
43
- end
44
-
44
+ ext = Lanes::Command.load_current_extension ||
45
+ LanesDummyExt.new('lanes', Pathname.new(__FILE__).dirname.join("../../../"))
46
+ TestSpecs.current = TestSpecs.new(ext)
47
+ Root.sprockets.append_path(ext.root_path.join("spec"))
48
+
45
49
 
46
50
  Root.sprockets.append_path(Jasmine::Core.path)
47
51
 
data/lib/lanes/command.rb CHANGED
@@ -1,3 +1,5 @@
1
+ require 'thor/error'
2
+
1
3
  module Lanes
2
4
  module Command
3
5
  class << self
@@ -16,22 +18,30 @@ module Lanes
16
18
  # Will silently swallow any exceptions that are raised when the file is required and return nil
17
19
  #
18
20
  # @return [Extension] extension that was loaded, nil if none was found
19
- def load_current_extension
21
+ def load_current_extension(raise_on_fail:false)
22
+
20
23
  previous = Extensions.all
21
- ext = Dir.glob("./lib/**/extension.rb").first
24
+ ext = Dir.glob("./lib/*/extension.rb").first
22
25
  if ext
23
26
  begin
24
27
  require(ext)
25
28
  rescue
26
- return nil
29
+ return _maybe_fail(raise_on_fail)
30
+ end
31
+ all = Extensions.all
32
+ if all.any?
33
+ diff = all - previous
34
+ return diff.any? ? diff.first.new : Extensions.all.first.new
27
35
  end
28
- diff = Extensions.all - previous
29
- return diff.any? ? diff.first.new : nil
30
36
  else
31
- return nil
37
+ return _maybe_fail(raise_on_fail)
32
38
  end
33
39
  end
34
40
 
41
+ def _maybe_fail(should_raise)
42
+ raise Thor::Error.new("Unable to locate Lanes environment") if should_raise
43
+ return nil
44
+ end
35
45
  end
36
46
  end
37
47
  end
@@ -33,15 +33,21 @@ module Lanes
33
33
 
34
34
  def create_client_files
35
35
  self.class.source_root.join('client').children.each do | path |
36
- empty_directory "#{client_dir}/#{path.basename}" if path.directory?
36
+ next unless path.directory?
37
+ empty_directory "#{client_dir}/#{path.basename}"
38
+ create_file "#{client_dir}/#{path.basename}/.gitkeep"
37
39
  end
38
- template "client/namespace-extension.js", "#{client_dir}/index.js"
39
- template "client/Extension.coffee", "#{client_dir}/Extension.coffee"
40
- template "client/styles/styles.scss", "client/#{name}-styles.scss"
40
+ template "client/index.js", "#{client_dir}/index.js"
41
+ template "client/Extension.coffee", "#{client_dir}/Extension.coffee"
42
+ template "client/styles.scss", "#{client_dir}/styles.scss"
41
43
  end
42
44
 
45
+ def create_spec
46
+
47
+ end
48
+
43
49
  def create_first_screen
44
- invoke GenerateScreen, [name], title: name.titleize, namespace: name
50
+ invoke GenerateScreen, ["base"], title: name.titleize, namespace: name
45
51
  end
46
52
  end
47
53
 
@@ -36,15 +36,16 @@ module Lanes
36
36
 
37
37
  def create_model
38
38
  template "lib/namespace/model.rb", "lib/#{namespace}/#{file_name}.rb"
39
- template "spec/namespace/model_spec.rb", "spec/#{namespace}/#{file_name}.rb"
39
+ template "spec/namespace/model_spec.rb", "#{spec_dir}/#{file_name}.rb"
40
40
  template "spec/fixtures/namespace/model.yml", "spec/fixtures/#{namespace}/#{file_name}.yml"
41
41
  end
42
42
 
43
43
  def create_client
44
+ self.fields.unshift ModelAttribute.parse("id:integer")
44
45
  template "client/data/Model.coffee", \
45
- "#{client_dir}/data/#{class_name}.coffee"
46
+ "#{client_dir}/data/#{class_name}.coffee"
46
47
  template "spec/client/data/ModelSpec.coffee", \
47
- "spec/client/data/#{class_name}Spec.coffee"
48
+ "#{spec_dir}/data/#{class_name}Spec.coffee"
48
49
  end
49
50
 
50
51
  def add_route
@@ -22,8 +22,9 @@ module Lanes
22
22
  template "lib/namespace/screen.rb", "lib/#{namespace}/#{name}_screen.rb"
23
23
  template "client/screens/index.js", "#{client_dir}/screens/#{name}/index.js"
24
24
  template "client/screens/styles.scss", "#{client_dir}/screens/#{name}/index.scss"
25
- template "client/screens/Screen.coffee", "#{client_dir}/screens/#{name}/#{name.classify}.coffee"
25
+ template "client/screens/Screen.coffee", "#{client_dir}/screens/#{name}/#{class_name}.coffee"
26
26
  template "client/screens/layout.html", "#{client_dir}/screens/#{name}/layout.html"
27
+ template "spec/client/Screen.coffee", "#{spec_dir}/screens/#{class_name}.coffee"
27
28
  end
28
29
 
29
30
  end
@@ -13,7 +13,7 @@ module Lanes
13
13
  template "client/views/View.coffee", "#{client_dir}/views/#{name.classify}.coffee"
14
14
  template "client/views/template.html", "#{client_dir}/views/#{name.dasherize}.html"
15
15
  template "spec/client/views/ViewSpec.coffee", \
16
- "spec/client/views/#{class_name}Spec.coffee"
16
+ "#{spec_dir}/views/#{class_name}Spec.coffee"
17
17
  end
18
18
 
19
19
  end
@@ -6,19 +6,20 @@ module Lanes
6
6
 
7
7
  argument :name
8
8
 
9
- attr_reader :namespace, :class_name, :client_dir
9
+ attr_reader :namespace, :class_name, :client_dir, :spec_dir
10
10
 
11
11
  def self.source_root
12
12
  Pathname.new(__FILE__).dirname.join("templates")
13
13
  end
14
14
 
15
15
  def load_namespace
16
- @namespace = options[:namespace] || Command.load_current_extension.identifier
17
- raise Thor::Error("Unable to locate Lanes environment") unless @namespace
18
- end
16
+ @namespace = options[:namespace] ||
17
+ Command.load_current_extension(raise_on_fail:true).identifier
18
+ end
19
19
 
20
20
  def set_variables
21
21
  @class_name = name.classify
22
+ @spec_dir = "spec/#{namespace}"
22
23
  @client_dir = "client/#{namespace}"
23
24
  end
24
25
 
@@ -1,7 +1,6 @@
1
1
  source 'https://rubygems.org'
2
2
 
3
- gem "guard-jasmine", github: "guard/guard-jasmine", branch: 'master'
4
- gem "lanes", github: "argosity/lanes", branch: 'master'
3
+ gem "lanes", github: "argosity/lanes", branch: 'master'
5
4
 
6
5
  # Uncomment to enable access control and user administration
7
6
  # gem "lanes-access", github: "argosity/lanes-access", branch: 'master'
@@ -1,7 +1,7 @@
1
1
  class <%= namespace.camelize %>.Data.<%= class_name %> extends <%= client_parent %>
2
2
 
3
3
  api_path: '<%= name.downcase.pluralize.underscore.dasherize %>'
4
- namespace: NAMESPACE
4
+ source: FILE
5
5
 
6
6
  props:
7
7
  <% fields.each do |field| -%>
@@ -19,6 +19,6 @@ class <%= namespace.camelize %>.Data.<%= class_name %> extends <%= client_parent
19
19
  <% end -%>
20
20
  <% end -%>
21
21
 
22
- class Lanes.<%= namespace.camelize %>.Data.<%= class_name %>Collection extends <%= options[:client_collection_parent] %>
22
+ class <%= namespace.camelize %>.Data.<%= class_name %>Collection extends <%= options[:client_collection_parent] %>
23
23
 
24
- model: Lanes.<%= namespace.camelize %>.Data.<%= class_name %>
24
+ model: <%= namespace.camelize %>.Data.<%= class_name %>
@@ -1,9 +1,7 @@
1
1
  class <%= namespace.camelize %>.Screens.<%= class_name %> extends Lanes.Screens.Base
2
2
 
3
- namespace: NAMESPACE
3
+ source: FILE
4
4
 
5
- # List subviews <TODO: add link to docs>
6
5
  subviews: {}
7
6
 
8
- # List events <TODO: add link to docs>
9
7
  events: {}
@@ -1,9 +1,7 @@
1
1
  class <%= namespace.classify %>.Views.<%= class_name %> extends Lanes.Views.Base
2
2
 
3
- namespace: NAMESPACE
3
+ source: FILE
4
4
 
5
- # List subviews <TODO: add link to docs>
6
5
  subviews: {}
7
6
 
8
- # List events <TODO: add link to docs>
9
7
  events: {}
@@ -3,5 +3,5 @@
3
3
  #
4
4
  # It will not be evaluated if another extension is loading this one
5
5
  Lanes.configure do | config |
6
- config.root_view = "<%= class_name %>.Screens.<%= class_name %>"
6
+ config.root_view = "<%= class_name %>.Screens.Base"
7
7
  end
@@ -1 +1,2 @@
1
+ public/assets
1
2
  tmp/cache
@@ -11,7 +11,7 @@ module <%= namespace.camelize %>
11
11
  group_id "<%= options[:group] %>"
12
12
  model_class "<%= options[:model_class] %>"
13
13
  view_class "<%= namespace.camelize %>.Screens.<%= class_name %>"
14
- files ['screens/<%= name.dasherize %>.js','screens/<%= name.dasherize %>.css']
14
+ files ['<%= namespace %>/screens/<%= name.dasherize %>.js','<%= namespace %>/screens/<%= name.dasherize %>.css']
15
15
  end
16
16
 
17
17
  end
File without changes
@@ -0,0 +1,7 @@
1
+ #= require <%= namespace %>/screens/<%= name %>
2
+
3
+ describe "<%= class_name %> Screen Suite", ->
4
+
5
+ it "can be instantiated", ->
6
+ view = new <%= namespace.camelize %>.Screens.<%= class_name %>()
7
+ expect(view).toEqual(jasmine.any(<%= namespace.camelize %>.Screens.<%= class_name %>));
@@ -1,5 +1,5 @@
1
1
  describe "<%= class_name %> View Suite", ->
2
2
 
3
3
  it "can be instantiated", ->
4
- view = new Lanes.<%= namespace.camelize %>.Views.<%= class_name %>()
5
- expect(view).toEqual(jasmine.any(Lanes.<%= namespace.camelize %>.Views.<%= class_name %>));
4
+ view = new <%= namespace.camelize %>.Views.<%= class_name %>()
5
+ expect(view).toEqual(jasmine.any(<%= namespace.camelize %>.Views.<%= class_name %>));
@@ -12,5 +12,5 @@ require_relative "locked_fields"
12
12
  require_relative "pub_sub"
13
13
  require_relative "queries"
14
14
  require_relative "random_hash_code"
15
- require_relative "sanitize_api_data"
16
15
  require_relative "visible_id_identifier"
16
+ require_relative "sanitize_fields"