lanes 0.8.2 → 0.8.3
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/.rubocop.yml +2 -0
- data/Gemfile +2 -3
- data/client/lanes/boot.jsx +1 -1
- data/client/lanes/index.js +0 -11
- data/client/lanes/jest/matchers.js +14 -0
- data/{lib/js/jest/mocks.js → client/lanes/jest/mocks/fetch.js} +1 -1
- data/client/lanes/models/base.js +0 -32
- data/client/lanes/screens/definition.js +7 -8
- data/client/lanes/screens/index.js +24 -240
- data/client/lanes/workspace/menu.jsx +3 -34
- data/client/lanes/workspace/screen.jsx +3 -3
- data/config/routes.rb +2 -0
- data/config/screens.rb +2 -2
- data/lanes.gemspec +10 -7
- data/lib/lanes/access/authentication_provider.rb +4 -4
- data/lib/lanes/api.rb +1 -0
- data/lib/lanes/api/default_routes.rb +1 -1
- data/lib/lanes/api/handlers/screens.rb +26 -0
- data/lib/lanes/api/helper_methods.rb +5 -4
- data/lib/lanes/cli.rb +7 -0
- data/lib/lanes/command/app.rb +4 -6
- data/lib/lanes/command/client_config.rb +59 -0
- data/lib/lanes/command/generate_model.rb +4 -4
- data/lib/lanes/command/jest.rb +14 -29
- data/lib/lanes/command/model_attribute.rb +6 -1
- data/lib/lanes/command/named_command.rb +1 -0
- data/lib/lanes/command/puma.rb +56 -0
- data/lib/lanes/command/server.rb +21 -18
- data/lib/lanes/command/webpack.rb +54 -0
- data/lib/lanes/extension.rb +0 -7
- data/lib/lanes/guard_tasks.rb +21 -20
- data/lib/lanes/rake_tasks.rb +13 -0
- data/lib/lanes/reloadable_sinatra.rb +24 -0
- data/lib/lanes/screen.rb +15 -6
- data/lib/lanes/spec_helper.rb +70 -136
- data/lib/lanes/version.rb +1 -1
- data/package.json +1 -1
- data/spec/server/api/controller_base_spec.rb +61 -53
- data/spec/server/spec_helper.rb +37 -45
- data/templates/client/models/model.js +17 -0
- data/templates/config/database.yml +2 -1
- data/templates/config/jest.config.json +14 -0
- data/templates/config/jest/babel-transform.js +47 -0
- data/templates/config/routes.rb +3 -2
- data/templates/config/webpack.config.js +1 -1
- data/templates/js/jest.config.json +2 -10
- data/templates/spec/client/models/model.spec.js +10 -0
- data/templates/spec/client/setup.js +9 -0
- data/templates/spec/server/spec_helper.rb +3 -11
- metadata +40 -41
- data/lib/js/jest.config.json +0 -14
- data/lib/js/jest/fileMock.js +0 -1
- data/lib/js/jest/setup.js +0 -26
- data/lib/js/jest/stubs/screen-definitions.js +0 -0
- data/lib/js/jest/styleMock.js +0 -1
- data/lib/js/webpack.config.js +0 -93
- data/lib/lanes/hot_reload_plugin.rb +0 -47
- data/lib/lanes/webpack.rb +0 -73
- data/spec/server/api/coffeescript_processor_spec.rb +0 -116
- data/templates/client/models/Model.coffee +0 -17
- data/templates/spec/client/models/ModelSpec.coffee +0 -5
@@ -3,8 +3,8 @@ import classnames from 'classnames';
|
|
3
3
|
import { observer } from 'mobx-react';
|
4
4
|
import { Grid } from 'react-flexbox-grid';
|
5
5
|
import Box from 'grommet/components/Box';
|
6
|
-
|
7
6
|
import Screens from '../screens';
|
7
|
+
import ScreenInstances from '../screens/instance';
|
8
8
|
|
9
9
|
const ScreenView = observer((props) => {
|
10
10
|
const { screen: Screen, ...rest } = props;
|
@@ -26,7 +26,7 @@ export default class Screen extends React.Component {
|
|
26
26
|
componentDidMount() {
|
27
27
|
const { screenId } = this.props.params;
|
28
28
|
if (screenId) {
|
29
|
-
const definition = Screens.
|
29
|
+
const definition = Screens.all.get(screenId);
|
30
30
|
if (definition) { definition.display(); }
|
31
31
|
}
|
32
32
|
}
|
@@ -40,7 +40,7 @@ export default class Screen extends React.Component {
|
|
40
40
|
align="stretch"
|
41
41
|
flex="grow"
|
42
42
|
>
|
43
|
-
{
|
43
|
+
{ScreenInstances.displaying.map(s =>
|
44
44
|
<ScreenView key={s.id} {...this.props.params} screen={s} />)}
|
45
45
|
</Box>
|
46
46
|
|
data/config/routes.rb
CHANGED
@@ -8,6 +8,8 @@ Lanes::API.routes.for_extension 'lanes' do
|
|
8
8
|
end
|
9
9
|
end
|
10
10
|
|
11
|
+
get 'screens.json', &Lanes::API::Handlers::Screens.get
|
12
|
+
|
11
13
|
post "user-sessions.json", &Lanes::API::Handlers::UserSession.create
|
12
14
|
get "user-sessions/test.json", &Lanes::API::Handlers::UserSession.check
|
13
15
|
|
data/config/screens.rb
CHANGED
@@ -20,7 +20,7 @@ Lanes::Screen.for_extension 'lanes' do | screens |
|
|
20
20
|
screen.description = "Add/Remove/Modify User Accounts"
|
21
21
|
screen.icon = "group"
|
22
22
|
screen.group_id = "system-settings"
|
23
|
-
screen.model_class = "
|
23
|
+
screen.model_class = "SystemSettings"
|
24
24
|
screen.view_class = "UserManagement"
|
25
25
|
screen.asset = 'lanes/access/screens/user-management'
|
26
26
|
end
|
@@ -30,7 +30,7 @@ Lanes::Screen.for_extension 'lanes' do | screens |
|
|
30
30
|
screen.description = "Update System Settings"
|
31
31
|
screen.icon = "cogs"
|
32
32
|
screen.group_id = "system-settings"
|
33
|
-
screen.model_class = "
|
33
|
+
screen.model_class = "SystemSettings"
|
34
34
|
screen.asset = 'lanes/screens/system-settings'
|
35
35
|
end
|
36
36
|
|
data/lanes.gemspec
CHANGED
@@ -24,14 +24,14 @@ Gem::Specification.new do |spec|
|
|
24
24
|
|
25
25
|
spec.required_ruby_version = ">= 2.0"
|
26
26
|
|
27
|
-
spec.add_dependency "activejob", "~> 5.0"
|
28
|
-
spec.add_dependency "activerecord", "~> 5.0"
|
29
|
-
spec.add_dependency "actioncable", "~> 5.0"
|
27
|
+
spec.add_dependency "activejob", "~> 5.0.2"
|
28
|
+
spec.add_dependency "activerecord", "~> 5.0.2"
|
29
|
+
spec.add_dependency "actioncable", "~> 5.0.2"
|
30
30
|
spec.add_dependency "mail", "~> 2.6"
|
31
31
|
|
32
|
-
spec.add_dependency "sinatra", "~> 2.0.0.
|
32
|
+
spec.add_dependency "sinatra", "~> 2.0.0.rc1"
|
33
33
|
spec.add_dependency "rack", "~> 2.0"
|
34
|
-
spec.add_dependency "rack-protection", "~> 2.0.0.
|
34
|
+
spec.add_dependency "rack-protection", "~> 2.0.0.rc1"
|
35
35
|
|
36
36
|
spec.add_dependency "rack-cors", "~> 0.4"
|
37
37
|
spec.add_dependency "rack-test", "~> 0.6"
|
@@ -43,14 +43,17 @@ Gem::Specification.new do |spec|
|
|
43
43
|
spec.add_dependency "execjs", "~> 2.6"
|
44
44
|
spec.add_dependency "fastimage", "~> 2.0"
|
45
45
|
spec.add_dependency "guard", "~> 2.13"
|
46
|
+
|
47
|
+
spec.add_dependency "rspec-rails", "~> 3.5"
|
48
|
+
|
46
49
|
spec.add_dependency "guard-jest", "~> 0.1"
|
47
|
-
spec.add_dependency "guard-
|
50
|
+
spec.add_dependency "guard-rspec", "~> 4.7"
|
48
51
|
spec.add_dependency "hashie", "~> 3.3"
|
49
52
|
|
50
53
|
spec.add_dependency "jobba", "~> 1.4"
|
51
54
|
spec.add_dependency "jwt", "~> 1.5"
|
52
55
|
spec.add_dependency "mini_magick", "~> 4.3.6"
|
53
|
-
|
56
|
+
|
54
57
|
spec.add_dependency "oj", "~> 2.1"
|
55
58
|
spec.add_dependency "pg", "~> 0.8"
|
56
59
|
spec.add_dependency "rake", "~> 12.0"
|
@@ -39,11 +39,11 @@ module Lanes
|
|
39
39
|
return false if current_user.nil?
|
40
40
|
case request.request_method
|
41
41
|
when 'GET'
|
42
|
-
klass.can_read_attributes?(request.params,current_user)
|
43
|
-
when 'POST','PATCH','PUT'
|
44
|
-
klass.can_write_attributes?(request.params,current_user)
|
42
|
+
klass.can_read_attributes?(request.params, current_user)
|
43
|
+
when 'POST', 'PATCH', 'PUT'
|
44
|
+
klass.can_write_attributes?(request.params, current_user)
|
45
45
|
when 'DELETE'
|
46
|
-
klass.can_delete_attributes?(request.params,current_user)
|
46
|
+
klass.can_delete_attributes?(request.params, current_user)
|
47
47
|
else
|
48
48
|
false
|
49
49
|
end
|
data/lib/lanes/api.rb
CHANGED
@@ -0,0 +1,26 @@
|
|
1
|
+
require_relative '../../access/user'
|
2
|
+
|
3
|
+
require 'irb'
|
4
|
+
|
5
|
+
module Lanes::API::Handlers
|
6
|
+
|
7
|
+
module Screens
|
8
|
+
def self.get
|
9
|
+
lambda do
|
10
|
+
authentication = Lanes::API::AuthenticationProvider.new(request)
|
11
|
+
if authentication.current_user.nil?
|
12
|
+
return json_reply std_api_reply :get, {}, success: true
|
13
|
+
end
|
14
|
+
screens = Lanes::Screen.select do | screen |
|
15
|
+
authentication.current_user.can_read?(screen.model)
|
16
|
+
end
|
17
|
+
# Lanes::Screen.each_group
|
18
|
+
json_reply std_api_reply :get, {
|
19
|
+
screens: screens.map{|s| s.identifier }
|
20
|
+
}, success: true
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
25
|
+
|
26
|
+
end
|
@@ -6,10 +6,11 @@ module Lanes
|
|
6
6
|
end
|
7
7
|
|
8
8
|
def lanes_javascript_tags
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
9
|
+
[]
|
10
|
+
# assets = API.webpack.assets.map do | k |
|
11
|
+
# "<script src=\"http://localhost:#{API.webpack.port}/#{k}\"></script>"
|
12
|
+
# end
|
13
|
+
# assets.join("\n")
|
13
14
|
|
14
15
|
# "<script src=\"http://localhost:#{API.webpack.port}/lanes.js\"></script>"
|
15
16
|
# javascript_tag('lanes/vendor') + "\n" + javascript_tag('lanes')
|
data/lib/lanes/cli.rb
CHANGED
@@ -31,6 +31,13 @@ module Lanes
|
|
31
31
|
long_desc "start the Jest test server"
|
32
32
|
register Command::Jest, 'jest', 'jest', 'Start the Jest test server for client code'
|
33
33
|
|
34
|
+
long_desc "start the webpack dev server"
|
35
|
+
register Command::Webpack, 'webpack', 'webpack', 'Start the Webpack Dev Server'
|
36
|
+
|
37
|
+
long_desc "start the Puma server"
|
38
|
+
register Command::Puma, 'puma', 'puma', 'Start the Puma(Sinata) Server'
|
39
|
+
|
40
|
+
long_desc "start the guard test runner"
|
34
41
|
register Command::Guard, 'guard', 'guard', 'Start the Guard server'
|
35
42
|
|
36
43
|
long_desc Command.usage_from_file("db")
|
data/lib/lanes/command/app.rb
CHANGED
@@ -36,8 +36,12 @@ module Lanes
|
|
36
36
|
template "config/screens.rb"
|
37
37
|
template "config/routes.rb"
|
38
38
|
template "config/webpack.config.js"
|
39
|
+
template "config/jest.config.json"
|
40
|
+
template "config/jest/babel-transform.js"
|
39
41
|
template "config/lanes.rb"
|
40
42
|
template "gitignore",".gitignore"
|
43
|
+
template "spec/client/setup.js"
|
44
|
+
template "spec/server/spec_helper.rb"
|
41
45
|
|
42
46
|
create_file "log/.gitkeep",""
|
43
47
|
create_file "tmp/.gitkeep",""
|
@@ -56,12 +60,6 @@ module Lanes
|
|
56
60
|
template "client/styles.scss", "#{client_dir}/styles.scss"
|
57
61
|
end
|
58
62
|
|
59
|
-
def create_spec_helpers
|
60
|
-
template "spec/client/setup.js",
|
61
|
-
"spec/client/setup.js"
|
62
|
-
template "spec/server/spec_helper.rb",
|
63
|
-
"spec/server/spec_helper.rb"
|
64
|
-
end
|
65
63
|
|
66
64
|
def knitterize
|
67
65
|
say 'Installing node modules', :green
|
@@ -0,0 +1,59 @@
|
|
1
|
+
module Lanes
|
2
|
+
module Command
|
3
|
+
|
4
|
+
class ClientConfig < Thor::Group
|
5
|
+
include Thor::Actions
|
6
|
+
|
7
|
+
attr_reader :directory
|
8
|
+
|
9
|
+
attr_reader :controlling_extension
|
10
|
+
attr_reader :lanes_root_path
|
11
|
+
attr_reader :extension_path
|
12
|
+
|
13
|
+
attr_reader :module_paths
|
14
|
+
|
15
|
+
ROOT = Pathname.new(__FILE__).dirname.join("..", "..", "..")
|
16
|
+
def self.source_root
|
17
|
+
ROOT.join("templates", "js")
|
18
|
+
end
|
19
|
+
|
20
|
+
def apply_lanes_config
|
21
|
+
Lanes::Configuration.apply
|
22
|
+
Lanes::Extensions.load_controlling_config
|
23
|
+
end
|
24
|
+
|
25
|
+
def set_vars
|
26
|
+
@lanes_root_path = ROOT
|
27
|
+
@controlling_extension = Command.load_current_extension(raise_on_fail: true)
|
28
|
+
@extension_path = controlling_extension.root_path
|
29
|
+
end
|
30
|
+
|
31
|
+
def make_temp_dir
|
32
|
+
@directory = Pathname.new(Dir.mktmpdir)
|
33
|
+
end
|
34
|
+
|
35
|
+
def set_module_paths
|
36
|
+
@module_paths = Extensions.map { |e| e.root_path.join('client').to_s }.reverse + [
|
37
|
+
controlling_extension.root_path.join('node_modules').to_s,
|
38
|
+
directory.to_s
|
39
|
+
]
|
40
|
+
end
|
41
|
+
|
42
|
+
def write_asset_files
|
43
|
+
say "Generating config in #{directory}", :green
|
44
|
+
|
45
|
+
template('jest.config.json',
|
46
|
+
directory.join('jest.config.json'), verbose: false)
|
47
|
+
|
48
|
+
template('root-view.html',
|
49
|
+
directory.join('root-view.tmpl.html'), verbose: false)
|
50
|
+
|
51
|
+
template('screens.js',
|
52
|
+
directory.join('lanes/screen-definitions.js'), verbose: false)
|
53
|
+
|
54
|
+
# set the mtime to the past, otherwise Webpack will build repeatedly for a second
|
55
|
+
FileUtils.touch directory.join('index.html').to_s, mtime: Time.now - 1.minute
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
@@ -38,10 +38,10 @@ module Lanes
|
|
38
38
|
|
39
39
|
def create_client
|
40
40
|
self.fields.unshift ModelAttribute.parse("id:integer")
|
41
|
-
template "client/models/
|
42
|
-
"#{client_dir}/models/#{
|
43
|
-
template "spec/client/models/
|
44
|
-
"#{spec_dir}/models/#{
|
41
|
+
template "client/models/model.js",
|
42
|
+
"#{client_dir}/models/#{file_name}.js"
|
43
|
+
template "spec/client/models/model.spec.js",
|
44
|
+
"#{spec_dir}/models/#{file_name}.spec.js"
|
45
45
|
end
|
46
46
|
|
47
47
|
def add_route
|
data/lib/lanes/command/jest.rb
CHANGED
@@ -1,49 +1,34 @@
|
|
1
|
-
|
2
|
-
require 'webpack_driver'
|
3
|
-
require 'puma/cli'
|
4
|
-
require 'guard/jest'
|
5
|
-
|
1
|
+
require_relative './client_config'
|
6
2
|
require_relative '../extension'
|
7
3
|
require_relative '../command'
|
8
|
-
|
4
|
+
|
9
5
|
module Lanes
|
10
6
|
module Command
|
11
7
|
|
12
8
|
class Jest < Thor::Group
|
13
9
|
include Thor::Actions
|
14
|
-
ROOT = Pathname.new(__FILE__).dirname.join("..", "..", "..")
|
15
|
-
def self.source_root
|
16
|
-
ROOT.join("templates")
|
17
|
-
end
|
18
10
|
|
19
|
-
|
20
|
-
attr_accessor :lanes_root_path
|
21
|
-
attr_accessor :extension_path
|
22
|
-
attr_accessor :config_file
|
23
|
-
attr_accessor :module_paths
|
11
|
+
attr_reader :config
|
24
12
|
|
25
|
-
|
26
|
-
|
27
|
-
Lanes::Extensions.load_controlling_config
|
28
|
-
end
|
13
|
+
class_option :watch, :type => :boolean, default: false,
|
14
|
+
desc: "Whether to keep running and watch for file changes"
|
29
15
|
|
30
16
|
def configure
|
31
|
-
|
32
|
-
|
33
|
-
self.extension_path = ext.root_path
|
34
|
-
self.lanes_root_path = ROOT
|
35
|
-
config_dir = Pathname.new(Dir.mktmpdir)
|
36
|
-
self.config_file = config_dir.join("jest.config.json")
|
37
|
-
self.module_paths = Extensions.asset_paths(ext, config_dir.to_s)
|
38
|
-
template('js/jest.config.json', config_file, verbose: false, force: true)
|
17
|
+
@config = ClientConfig.new
|
18
|
+
@config.invoke_all
|
39
19
|
self
|
40
20
|
end
|
41
21
|
|
22
|
+
def config_file
|
23
|
+
config.directory.join('jest.config.json')
|
24
|
+
end
|
25
|
+
|
42
26
|
def start
|
43
27
|
say 'Starting Jest', :green
|
44
28
|
say Dir.pwd, :yellow
|
45
|
-
|
46
|
-
|
29
|
+
cmd = "$(npm bin)/jest --config #{config_file}"
|
30
|
+
cmd << " --watch" if options[:watch]
|
31
|
+
exec(cmd)
|
47
32
|
end
|
48
33
|
end
|
49
34
|
end
|
@@ -13,7 +13,8 @@ module Lanes
|
|
13
13
|
attr_writer :index_name
|
14
14
|
|
15
15
|
class << self
|
16
|
-
|
16
|
+
def parse(column_definition)
|
17
|
+
|
17
18
|
name, type, has_index = column_definition.split(':')
|
18
19
|
|
19
20
|
# if user provided "name:index" instead of "name:string:index"
|
@@ -65,6 +66,10 @@ module Lanes
|
|
65
66
|
@attr_options = attr_options
|
66
67
|
end
|
67
68
|
|
69
|
+
def decorator
|
70
|
+
name == 'id' ? 'identifier' : 'field'
|
71
|
+
end
|
72
|
+
|
68
73
|
def field_type
|
69
74
|
@field_type ||= case type
|
70
75
|
when :integer then :number_field
|
@@ -0,0 +1,56 @@
|
|
1
|
+
require_relative '../extension'
|
2
|
+
require_relative '../command'
|
3
|
+
|
4
|
+
require 'irb'
|
5
|
+
|
6
|
+
module Lanes
|
7
|
+
module Command
|
8
|
+
|
9
|
+
class Puma < Thor::Group
|
10
|
+
include Thor::Actions
|
11
|
+
|
12
|
+
class_option :wait, :type => :boolean, default: true,
|
13
|
+
desc: "Whether to keep running and wait for exit"
|
14
|
+
|
15
|
+
def start
|
16
|
+
say "Starting Puma", :green
|
17
|
+
@proc = ::ChildProcess.build('puma')
|
18
|
+
@output, w = IO.pipe
|
19
|
+
@proc.io.stdout = @proc.io.stderr = w
|
20
|
+
@proc.start
|
21
|
+
w.close
|
22
|
+
@listener = listen_for_status_updates
|
23
|
+
sleep 1
|
24
|
+
unless @proc.alive?
|
25
|
+
raise "NOT LIVING"
|
26
|
+
puts @output.read
|
27
|
+
end
|
28
|
+
self
|
29
|
+
end
|
30
|
+
|
31
|
+
def maybe_wait
|
32
|
+
@proc.wait if options[:wait]
|
33
|
+
end
|
34
|
+
|
35
|
+
def stop
|
36
|
+
say "Stopping Puma", :green
|
37
|
+
@listener.kill
|
38
|
+
@proc.stop
|
39
|
+
@prop = nil
|
40
|
+
end
|
41
|
+
|
42
|
+
private
|
43
|
+
|
44
|
+
|
45
|
+
def listen_for_status_updates
|
46
|
+
Thread.new do
|
47
|
+
@output.each_line do | l |
|
48
|
+
Lanes.logger.info(l.chomp)
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
data/lib/lanes/command/server.rb
CHANGED
@@ -1,6 +1,5 @@
|
|
1
1
|
require 'guard/cli'
|
2
|
-
require_relative '../
|
3
|
-
|
2
|
+
require_relative '../guard_tasks'
|
4
3
|
module Lanes
|
5
4
|
module Command
|
6
5
|
|
@@ -11,27 +10,31 @@ module Lanes
|
|
11
10
|
say "Launching testing server at http://localhost:8888/", :green
|
12
11
|
require 'lanes/api'
|
13
12
|
Lanes::Configuration.apply
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
API.
|
13
|
+
|
14
|
+
config = ClientConfig.new
|
15
|
+
config.invoke_all
|
16
|
+
|
17
|
+
API.webpack = Lanes::Command::Webpack.new([], wait: false)
|
18
|
+
API.webpack.config = config
|
19
|
+
|
20
|
+
API.webpack.invoke_all# startup
|
21
|
+
|
22
|
+
::Lanes::GuardTasks.client_config = config
|
23
|
+
|
24
|
+
# threads = []
|
25
|
+
# Thread.abort_on_exception = true
|
26
|
+
# threads << Thread.new { API::Root.run! }
|
27
|
+
# threads << Thread.new do
|
28
|
+
# sleep 1 until API::Root.running?
|
29
|
+
# Lanes.logger.info "ok, ctrl-c trap registered"
|
30
|
+
# end
|
28
31
|
sleep(1) # give webpack a bit of time to fail if it's going to
|
29
|
-
unless API.webpack.alive?
|
32
|
+
unless API.webpack.process.alive?
|
30
33
|
puts API.webpack.messages
|
31
34
|
exit 1
|
32
35
|
end
|
33
36
|
Guard.start # will block until complete
|
34
|
-
API.webpack.stop # stop webpack after guard completes
|
37
|
+
API.webpack.process.stop # stop webpack after guard completes
|
35
38
|
end
|
36
39
|
end
|
37
40
|
end
|