xing-root 0.0.4 → 0.0.5

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 0c64efb83d9d7271086747e451a58babb63ce3a7
4
- data.tar.gz: dc71959f796fef4829ec9c177e5ded7092371880
3
+ metadata.gz: ec46b808ae2a32a6d8349f4eced8e10202f6f64b
4
+ data.tar.gz: 30e0847a924137bbd017b09226b4456b49354b87
5
5
  SHA512:
6
- metadata.gz: 9b1d29f31ef9f6e614b37776dc134128320d64cfe3f5bab9aa8a95773949ea857d5c98f15bb009c33842a4c750025e4f2251ee93da62596374321fe910afd542
7
- data.tar.gz: 830ff5f7c27700c94e62046c64308e1ffd16a395be1aed03068b045f0ebbd7c562034dbc781a5115b6b49ac03f8e74d111c721deb6e916d1e576069cdda15671
6
+ metadata.gz: 656cc7df65075d545847d99b134a66384122f3e000c1843a80a90a45d5acecb30eb70eb5939755a0863beef62b6eafc0b200446f73414a500692942e3bf57c20
7
+ data.tar.gz: 361b16409ea0c7ad4b7aaa40a8d65f7ae79fec931cdae2c939b444fcea5f8d4e7ecef78864610b972a2b9b30a607ea6a72eaae39e1a61c054b4da7d04e25df96
@@ -63,7 +63,7 @@ module Xing::Edicts
63
63
  raise "Can't find any executable to launch a browser with."
64
64
  end
65
65
 
66
- run_command( cmd(browser_command, "http://localhost:#{static_server_port}/") ).must_succeed!
66
+ run_command(cmd(browser_command, "http://localhost:#{static_server_port}/")).must_succeed!
67
67
  end
68
68
 
69
69
  def subprocess_action
@@ -1,6 +1,7 @@
1
1
  require 'xing-root'
2
2
  require 'find'
3
3
  require 'edict'
4
+ require 'xing/utils/import_checker'
4
5
 
5
6
  module Xing::Edicts
6
7
  class StructureChecker < Edict::Rule
@@ -74,25 +75,9 @@ module Xing::Edicts
74
75
  end
75
76
 
76
77
  def check_imports(path, context)
77
- File.read(path).lines.grep(/\s*import/).each_with_index do |import_line, lineno|
78
- md = /.*from (?<quote>['"])(?<from>.*)\k<quote>/.match(import_line)
79
- if md.nil?
80
- problem "doesn't seem to have a 'from' clause...", import_line, lineno, path
81
- end
82
-
83
- if /\.\./ =~ md[:from]
84
- if /\A\.\./ !~ md[:from]
85
- problem "from includes .. not at pos 0", import_line, lineno, path
86
- end
87
- if /\w.*\.\./ =~ md[:from]
88
- problem "from includes .. after words", import_line, lineno, path
89
- end
90
- if !(violation = %r{(?<dir>\w+)/\w}.match md[:from]).nil?
91
- unless %r{\.\./(#{context.escape_clause_list.join("|")})} =~ md[:from]
92
- problem "Imports Rule: 'from' includes ../ and then #{violation[:dir].inspect} not in #{context.escape_clause_list.inspect}", import_line, lineno, path
93
- end
94
- end
95
- end
78
+ checker = Xing::Utils::ImportChecker.new(path, context)
79
+ checker.check do |message, line, lineno|
80
+ problem message, line, lineno, path
96
81
  end
97
82
  end
98
83
  end
@@ -41,17 +41,6 @@ class ChildManager
41
41
  return false
42
42
  end
43
43
 
44
- def wait_until_dead(pilimit)
45
- start = Time.now
46
- while Time.now - start < limit
47
- Process.waitpid(-1, Process::WNOHANG | Process::WUNTRACED)
48
- sleep(0.1)
49
- end
50
- return false
51
- rescue SystemCallError # = no children
52
- return true
53
- end
54
-
55
44
  def wait_all
56
45
  Process.waitall
57
46
  end
@@ -62,7 +62,7 @@ module Xing
62
62
 
63
63
  def wait_all
64
64
  path = File.expand_path(@extra_config_path)
65
- if File.exists?(path)
65
+ if File.exist?(path)
66
66
  puts "Loading #{path}"
67
67
  tmux "source-file #{path}"
68
68
  else
@@ -145,7 +145,7 @@ module Xing
145
145
  end
146
146
  end
147
147
 
148
- def open_additional_window(name, task)
148
+ def open_additional_window(_name, task)
149
149
  tmux "select-layout -t '#@window_name' #{layout}"
150
150
  @window_count = @window_count + 1
151
151
  @window_name = "Dev Servers #{@window_count}"
@@ -19,33 +19,36 @@ module Xing
19
19
  setting :manager
20
20
  setting :config_dir, "../frontend"
21
21
 
22
- def default_configuration
23
- @port_offset ||=
24
- begin
25
- if !ENV['PORT_OFFSET'].nil?
26
- ENV['PORT_OFFSET'].to_i.tap do |offset|
27
- puts "Shifting server ports by #{offset}"
28
- end
29
- else
30
- 0
31
- end
22
+ def get_port_offset
23
+ if !ENV['PORT_OFFSET'].nil?
24
+ ENV['PORT_OFFSET'].to_i.tap do |offset|
25
+ puts "Shifting server ports by #{offset}"
32
26
  end
27
+ else
28
+ 0
29
+ end
30
+ end
33
31
 
34
- @manager ||=
35
- begin
36
- require 'xing/managers/child'
37
- require 'xing/managers/tmux'
38
- if Managers::Tmux.available?
39
- Managers::TmuxPane.new
40
- else
41
- ChildManager.new.tap do |mngr|
42
- at_exit{ mngr.kill_all }
43
- end
32
+ def choose_output_manager
33
+ begin
34
+ require 'xing/managers/child'
35
+ require 'xing/managers/tmux'
36
+ if Managers::Tmux.available?
37
+ Managers::TmuxPane.new
38
+ else
39
+ ChildManager.new.tap do |mngr|
40
+ at_exit{ mngr.kill_all }
44
41
  end
45
- end.tap do |mgr|
46
- puts "Using #{mgr.class.name}"
47
42
  end
48
- super
43
+ end.tap do |mgr|
44
+ puts "Using #{mgr.class.name}"
45
+ end
46
+ end
47
+
48
+ def default_configuration
49
+ @port_offset ||= get_port_offset
50
+ @manager ||= choose_output_manager
51
+ super
49
52
  end
50
53
 
51
54
  def resolve_configuration
@@ -34,7 +34,7 @@ module Xing
34
34
  eddie.dir = "backend"
35
35
  eddie.shell_cmd = %w{bundle exec rspec}
36
36
  end
37
- task :full, [:spec_files] => [:check_dependencies, 'frontend:code_structure', :grunt_ci_test, 'backend:setup', :prepare_db] do |t, args|
37
+ task :full, [:spec_files] => [:check_dependencies, 'frontend:code_structure', :grunt_ci_test, 'backend:setup', :prepare_db] do |_task, args|
38
38
  if args[:spec_files]
39
39
  full_spec_edict.shell_cmd.push(args[:spec_files])
40
40
  end
@@ -46,7 +46,7 @@ module Xing
46
46
  copy_settings_to(eddie)
47
47
  eddie.dir = "backend"
48
48
  end
49
- task :responsivity, [:spec_files] => ['backend:setup', :prepare_db] do |t, args|
49
+ task :responsivity, [:spec_files] => ['backend:setup', :prepare_db] do |_task, args|
50
50
  %w{mobile small medium desktop}.each do |size|
51
51
  responsivity_edict.shell_cmd = ["bundle", "exec", "rspec", "-o", "tmp/rspec_#{size}.txt"]
52
52
  responsivity_edict.env_hash = {'BROWSER_SIZE' => size}
@@ -64,7 +64,7 @@ module Xing
64
64
  eddie.dir = "backend"
65
65
  eddie.shell_cmd = %w{bundle exec rspec}
66
66
  end
67
- task :fast, [:spec_files] => ['backend:setup', :prepare_db] do |t, args|
67
+ task :fast, [:spec_files] => ['backend:setup', :prepare_db] do |_task, args|
68
68
  if args[:spec_files]
69
69
  fast_edict.shell_cmd.push(args[:spec_files])
70
70
  else
@@ -3,7 +3,7 @@ require 'mattock'
3
3
  module Xing
4
4
  module Tasks
5
5
  class Tasklib < Mattock::Tasklib
6
- def edict_task(name, klass, &block)
6
+ def edict_task(name, klass, &_block)
7
7
  edict = klass.new do |eddie|
8
8
  copy_settings_to(eddie)
9
9
  yield eddie if block_given?
data/lib/xing/tasks.rb CHANGED
@@ -1,6 +1,3 @@
1
- #require 'pp'
2
- #pp $:
3
-
4
1
  require 'xing/tasks/backend'
5
2
  require 'xing/tasks/build'
6
3
  require 'xing/tasks/develop'
@@ -0,0 +1,76 @@
1
+ module Xing::Utils
2
+ class ImportChecker
3
+
4
+ def initialize(path, context)
5
+ @path = path
6
+ @context = context
7
+ end
8
+
9
+ attr_reader :path, :context
10
+
11
+ def read_next
12
+ @import_line = @lines[@lineno]
13
+ end
14
+
15
+ def is_import_line
16
+ /\s*import/.match(@import_line)
17
+ end
18
+
19
+ def skip_to_end_of_import
20
+ # for a multi-line import, we need to skip past multiple lines of import
21
+ begin_check = /.*(?<begin>\{).*/.match(@import_line)
22
+ end_check = /.*(?<end>\}).*/.match(@import_line)
23
+ if begin_check and !end_check
24
+ until end_check
25
+ @lineno += 1
26
+ read_next
27
+ end_check = /.*(?<end>\}).*/.match(@import_line)
28
+ end
29
+ end
30
+ end
31
+
32
+ def match_line
33
+ @md = /.*from (?<quote>['"])(?<from>.*)\k<quote>/.match(@import_line)
34
+ end
35
+
36
+ def check_empty_match
37
+ problem "doesn't seem to have a 'from' clause..." if @md.nil?
38
+ end
39
+
40
+ def check_structure
41
+ if /\.\./ =~ @md[:from]
42
+ problem "from includes .. not at pos 0" if /\A\.\./ !~ @md[:from]
43
+ problem "from includes .. after words" if /\w.*\.\./ =~ @md[:from]
44
+ unless (violation = %r{(?<dir>\w+)/\w}.match @md[:from]).nil?
45
+ unless %r{\.\./(#{context.escape_clause_list.join("|")})} =~ @md[:from]
46
+ problem "Imports Rule: 'from' includes ../ and then #{violation[:dir].inspect} not in #{context.escape_clause_list.inspect}"
47
+ end
48
+ end
49
+ end
50
+ end
51
+
52
+ def problem(message)
53
+ @error_block.call(message, @import_line, @lineno)
54
+ end
55
+
56
+ def initialize_check(error_block)
57
+ @error_block = error_block
58
+ @lines = File.read(path).lines
59
+ @lineno = 0
60
+ end
61
+
62
+ def check(&error_block)
63
+ initialize_check(error_block)
64
+ while @lineno < @lines.length
65
+ read_next
66
+ if is_import_line
67
+ skip_to_end_of_import
68
+ match_line
69
+ check_empty_match
70
+ check_structure
71
+ end
72
+ @lineno += 1
73
+ end
74
+ end
75
+ end
76
+ end
@@ -0,0 +1,120 @@
1
+ require 'xing/utils/import_checker'
2
+ require 'support/file-sandbox'
3
+ require 'stringio'
4
+
5
+ describe Xing::Utils::ImportChecker do
6
+ include FileSandbox
7
+
8
+ let :stdout do
9
+ StringIO.new
10
+ end
11
+
12
+ let :errors do
13
+ []
14
+ end
15
+
16
+ let :context do
17
+ double("context", :escape_clause_list => ['common', 'framework'])
18
+ end
19
+
20
+ subject :checker do
21
+ Xing::Utils::ImportChecker.new("test-dir/problem.js", context)
22
+ end
23
+
24
+ describe "with a problem file" do
25
+
26
+ before :each do
27
+ @sandbox.new :file => "test-dir/problem.js", :with_content => "import Thing from '../../../somewhere/bad.js';"
28
+ checker.check do |message, import_line, lineno|
29
+ errors << [message, import_line, lineno]
30
+ end
31
+ end
32
+
33
+ it "should report errors" do
34
+ expect(errors).to_not be_empty
35
+ expect(errors[0][0]).to match(%r{'from' includes ../})
36
+ end
37
+ end
38
+
39
+ describe "with a good file" do
40
+ before :each do
41
+ @sandbox.new :file => "test-dir/problem.js", :with_content => "import Thing from 'somewhere/okay.js';"
42
+ checker.check do |message, import_line, lineno|
43
+ errors << [message, import_line, lineno]
44
+ end
45
+ end
46
+
47
+ it "should not report errors" do
48
+ expect(errors).to be_empty
49
+ end
50
+ end
51
+
52
+ describe "single line with brackets" do
53
+ describe "with a problem file" do
54
+
55
+ before :each do
56
+ @sandbox.new :file => "test-dir/problem.js", :with_content => "import { Thing } from '../../../somewhere/bad.js';"
57
+ checker.check do |message, import_line, lineno|
58
+ errors << [message, import_line, lineno]
59
+ end
60
+ end
61
+
62
+ it "should report errors" do
63
+ expect(errors).to_not be_empty
64
+ expect(errors[0][0]).to match(%r{'from' includes ../})
65
+ end
66
+ end
67
+
68
+ describe "with a good file" do
69
+ before :each do
70
+ @sandbox.new :file => "test-dir/problem.js", :with_content => "import { Thing } from 'somewhere/okay.js';"
71
+ checker.check do |message, import_line, lineno|
72
+ errors << [message, import_line, lineno]
73
+ end
74
+ end
75
+
76
+ it "should not report errors" do
77
+ expect(errors).to be_empty
78
+ end
79
+ end
80
+ end
81
+
82
+ describe "multi-line import" do
83
+ describe "with a problem file" do
84
+ before :each do
85
+ @sandbox.new :file => "test-dir/problem.js", :with_content => <<-eos
86
+ import {
87
+ Thing,
88
+ OtherThing
89
+ } from '../../../somewhere/bad.js';"
90
+ eos
91
+ checker.check do |message, import_line, lineno|
92
+ errors << [message, import_line, lineno]
93
+ end
94
+ end
95
+
96
+ it "should report errors" do
97
+ expect(errors).to_not be_empty
98
+ expect(errors[0][0]).to match(%r{'from' includes ../})
99
+ end
100
+ end
101
+
102
+ describe "with a good file" do
103
+ before :each do
104
+ @sandbox.new :file => "test-dir/problem.js", :with_content => <<-eos
105
+ import {
106
+ Thing,
107
+ OtherThing
108
+ } from 'somewhere/okay.js';"
109
+ eos
110
+ checker.check do |message, import_line, lineno|
111
+ errors << [message, import_line, lineno]
112
+ end
113
+ end
114
+
115
+ it "should not report errors" do
116
+ expect(errors).to be_empty
117
+ end
118
+ end
119
+ end
120
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: xing-root
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.4
4
+ version: 0.0.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Judson Lester
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2015-11-13 00:00:00.000000000 Z
12
+ date: 2015-12-16 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: edict
@@ -78,15 +78,17 @@ files:
78
78
  - lib/xing/tasks/frontend.rb
79
79
  - lib/xing/tasks/spec.rb
80
80
  - lib/xing/tasks/tasklib.rb
81
+ - lib/xing/utils/import_checker.rb
81
82
  - spec/edicts/clean_rake_spec.rb
82
83
  - spec/edicts/clean_run_spec.rb
83
84
  - spec/edicts/launch-browser_spec.rb
84
85
  - spec/edicts/start-child_spec.rb
86
+ - spec/edicts/structure_checker_spec.rb
85
87
  - spec/managers/tmux_spec.rb
86
88
  - spec/support/file-sandbox.rb
87
89
  - spec/tasks/develop_spec.rb
88
90
  - spec/tasks/frontend_spec.rb
89
- - spec/tasks/structure_checker_spec.rb
91
+ - spec/utils/import_checker_spec.rb
90
92
  homepage: ''
91
93
  licenses:
92
94
  - MIT
@@ -97,7 +99,7 @@ rdoc_options:
97
99
  - "--main"
98
100
  - doc/README
99
101
  - "--title"
100
- - xing-root-0.0.4 Documentation
102
+ - xing-root-0.0.5 Documentation
101
103
  require_paths:
102
104
  - lib/
103
105
  required_ruby_version: !ruby/object:Gem::Requirement
File without changes