lanes 0.0.5 → 0.0.8

Sign up to get free protection for your applications and to get access to all the features.
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"