robe-server 1.0.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +1 -0
- data/.rspec +3 -0
- data/.travis.yml +19 -0
- data/Gemfile +10 -0
- data/Gemfile.lock +85 -0
- data/LICENSE +674 -0
- data/README.md +21 -0
- data/Rakefile +10 -0
- data/lib/robe-server.rb +39 -0
- data/lib/robe/core_ext.rb +37 -0
- data/lib/robe/jvisor.rb +14 -0
- data/lib/robe/sash.rb +215 -0
- data/lib/robe/sash/doc_for.rb +57 -0
- data/lib/robe/sash/includes_tracker.rb +75 -0
- data/lib/robe/scanners.rb +49 -0
- data/lib/robe/server.rb +87 -0
- data/lib/robe/type_space.rb +57 -0
- data/lib/robe/visor.rb +56 -0
- data/robe-server.gemspec +19 -0
- data/spec/robe/jvisor_spec.rb +30 -0
- data/spec/robe/method_scanner_spec.rb +50 -0
- data/spec/robe/module_scanner_spec.rb +76 -0
- data/spec/robe/sash/doc_for_spec.rb +165 -0
- data/spec/robe/sash/includes_tracker_spec.rb +35 -0
- data/spec/robe/sash_spec.rb +420 -0
- data/spec/robe/server_spec.rb +64 -0
- data/spec/robe/type_space_spec.rb +126 -0
- data/spec/robe/visor_spec.rb +91 -0
- data/spec/robe_spec.rb +51 -0
- data/spec/spec_helper.rb +39 -0
- data/spec/support/mocks.rb +31 -0
- metadata +116 -0
@@ -0,0 +1,64 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'robe/server'
|
3
|
+
require 'net/http'
|
4
|
+
|
5
|
+
describe Robe::Server do
|
6
|
+
it "starts up and serves an empty response" do
|
7
|
+
resp = start_and_send(proc {}, Net::HTTP::Get.new("/"))
|
8
|
+
expect(resp.body).to eq("")
|
9
|
+
end
|
10
|
+
|
11
|
+
it "passes path and body to the handler" do
|
12
|
+
rpath = nil
|
13
|
+
rbody = nil
|
14
|
+
|
15
|
+
handler = proc do |path, body|
|
16
|
+
rpath = path
|
17
|
+
rbody = body
|
18
|
+
""
|
19
|
+
end
|
20
|
+
|
21
|
+
req = Net::HTTP::Post.new("/foo")
|
22
|
+
req.body = "bar\ntee"
|
23
|
+
|
24
|
+
start_and_send(handler, req)
|
25
|
+
expect(rpath).to eq("/foo")
|
26
|
+
expect(rbody).to eq("bar\ntee")
|
27
|
+
end
|
28
|
+
|
29
|
+
it "responds with whatever the handler returns" do
|
30
|
+
handler = proc { "foobles" }
|
31
|
+
|
32
|
+
resp = start_and_send(handler, Net::HTTP::Get.new("/"))
|
33
|
+
expect(resp.body).to eq("foobles")
|
34
|
+
end
|
35
|
+
|
36
|
+
it "prints out exceptions raised in the handler" do
|
37
|
+
handler = proc { raise Exception.new("down with the king!") }
|
38
|
+
|
39
|
+
begin
|
40
|
+
$stderr = StringIO.new
|
41
|
+
start_and_send(handler, Net::HTTP::Get.new("/"))
|
42
|
+
$stderr.seek(0)
|
43
|
+
expect($stderr.read).to match("down with the king!\n")
|
44
|
+
ensure
|
45
|
+
$stderr = STDERR
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
def start_and_send(handler, request)
|
50
|
+
server = described_class.new(handler, 0)
|
51
|
+
|
52
|
+
Thread.new do
|
53
|
+
Thread.current.abort_on_exception = true
|
54
|
+
server.start
|
55
|
+
end
|
56
|
+
|
57
|
+
server.wait_for_it
|
58
|
+
|
59
|
+
http = Net::HTTP.new("127.0.0.1", server.port)
|
60
|
+
http.request(request)
|
61
|
+
ensure
|
62
|
+
server.shutdown
|
63
|
+
end
|
64
|
+
end
|
@@ -0,0 +1,126 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
require 'spec_helper'
|
3
|
+
require 'support/mocks'
|
4
|
+
require 'robe/type_space'
|
5
|
+
|
6
|
+
describe Robe::TypeSpace do
|
7
|
+
context "#initialize" do
|
8
|
+
it "resolves simple class" do
|
9
|
+
space = described_class.new(Robe::Visor.new, "String", nil, true, nil)
|
10
|
+
expect(space.target_type).to eq String
|
11
|
+
expect(space.instance).to be_true
|
12
|
+
end
|
13
|
+
|
14
|
+
it "resolves nested class" do
|
15
|
+
space = described_class.new(Robe::Visor.new, "Stat", "File", nil, nil)
|
16
|
+
expect(space.target_type).to eq File::Stat
|
17
|
+
expect(space.instance).to be_nil
|
18
|
+
end
|
19
|
+
|
20
|
+
it "resolves constant to its type" do
|
21
|
+
space = described_class.new(Robe::Visor.new, "E", "Math", nil, nil)
|
22
|
+
expect(space.target_type).to eq Float
|
23
|
+
expect(space.instance).to be_true
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
context "#scan_with" do
|
28
|
+
let(:scanner) { double("scanner") }
|
29
|
+
let(:m) { Module.new }
|
30
|
+
|
31
|
+
context "instance search" do
|
32
|
+
let(:c) { mod = m; Class.new { include mod } }
|
33
|
+
let(:kids) { [Class.new(c), Class.new(c)] }
|
34
|
+
let(:visor) { ScopedVisor.new(*kids, {"C" => c}) }
|
35
|
+
let(:space) { described_class.new(visor, "C", nil, true, nil) }
|
36
|
+
|
37
|
+
it "passes class and its ancestors" do
|
38
|
+
expect(scanner).to receive(:scan)
|
39
|
+
.with(include(c, Object, BasicObject, Kernel), true, false)
|
40
|
+
expect(scanner).not_to receive(:scan).with(include(Class), any_args())
|
41
|
+
space.scan_with(scanner)
|
42
|
+
end
|
43
|
+
|
44
|
+
it "passes included module" do
|
45
|
+
expect(scanner).to receive(:scan).with(include(m), true, false)
|
46
|
+
space.scan_with(scanner)
|
47
|
+
end
|
48
|
+
|
49
|
+
it "passes the descendants" do
|
50
|
+
expect(scanner).to receive(:scan).with(include(*kids), true, false)
|
51
|
+
space.scan_with(scanner)
|
52
|
+
end
|
53
|
+
|
54
|
+
it "passes Kernel even when scanning a module" do
|
55
|
+
visor = ScopedVisor.new(m, {"M" => m})
|
56
|
+
space = described_class.new(visor, "M", nil, true, nil)
|
57
|
+
expect(scanner).to receive(:scan).with(include(Kernel), true, false)
|
58
|
+
space.scan_with(scanner)
|
59
|
+
end
|
60
|
+
|
61
|
+
context "super search" do
|
62
|
+
let(:visor) { ScopedVisor.new(*kids, {"C" => c}) }
|
63
|
+
let(:space) { described_class.new(visor, "C", nil, true, true) }
|
64
|
+
|
65
|
+
it "does not pass the descendants" do
|
66
|
+
expect(scanner).not_to receive(:scan).with(include(*kids), true, false)
|
67
|
+
space.scan_with(scanner)
|
68
|
+
end
|
69
|
+
|
70
|
+
it "does not pass the class itself" do
|
71
|
+
expect(scanner).not_to receive(:scan).with(include(c), true, false)
|
72
|
+
space.scan_with(scanner)
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
context "module search" do
|
78
|
+
let(:n) { Module.new }
|
79
|
+
let(:c) do
|
80
|
+
mod = m;
|
81
|
+
Class.new { include mod }.tap do |c|
|
82
|
+
mod = n
|
83
|
+
c.singleton_class.class_eval { include mod }
|
84
|
+
end
|
85
|
+
end
|
86
|
+
let(:kids) { [Class.new(c), Class.new(c)] }
|
87
|
+
let(:visor) { ScopedVisor.new(*kids, {"C" => c}) }
|
88
|
+
let(:space) { described_class.new(visor, "C", nil, nil, nil) }
|
89
|
+
|
90
|
+
it "passes class and its ancestors, then metaclass ancestors" do
|
91
|
+
expect(scanner).to receive(:scan).with(include(c, Object), be_false, true)
|
92
|
+
expect(scanner).to receive(:scan)
|
93
|
+
.with(include(Class, Module, Kernel, n), true, be_false)
|
94
|
+
space.scan_with(scanner)
|
95
|
+
end
|
96
|
+
|
97
|
+
it "passes the descendants" do
|
98
|
+
expect(scanner).to receive(:scan).with(include(*kids), be_false, true)
|
99
|
+
expect(scanner).to receive(:scan).with(anything, true, be_false)
|
100
|
+
space.scan_with(scanner)
|
101
|
+
end
|
102
|
+
|
103
|
+
it "doesn't pass the included modules" do
|
104
|
+
expect(scanner).not_to receive(:scan).with(include(m), be_false, true)
|
105
|
+
expect(scanner).to receive(:scan).with(anything, be_false, true)
|
106
|
+
expect(scanner).to receive(:scan).with(anything, true, be_false)
|
107
|
+
space.scan_with(scanner)
|
108
|
+
end
|
109
|
+
end
|
110
|
+
|
111
|
+
context "search ActiveSupport::Concern deps" do
|
112
|
+
let(:asc) { Module.new }
|
113
|
+
let(:m) { mod = asc; Module.new { extend mod } }
|
114
|
+
let(:deps) { [Module.new, Module.new] }
|
115
|
+
let(:visor) { ScopedVisor.new("M" => m) }
|
116
|
+
let(:space) { described_class.new(visor, "M", nil, true, false) }
|
117
|
+
|
118
|
+
it "passes the dependencies" do
|
119
|
+
stub_const("ActiveSupport::Concern", asc)
|
120
|
+
m.instance_variable_set("@_dependencies", deps)
|
121
|
+
expect(scanner).to receive(:scan).with(include(*deps), true, false)
|
122
|
+
space.scan_with(scanner)
|
123
|
+
end
|
124
|
+
end
|
125
|
+
end
|
126
|
+
end
|
@@ -0,0 +1,91 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'robe/visor'
|
3
|
+
|
4
|
+
describe Robe::Visor do
|
5
|
+
let(:v) { described_class.new }
|
6
|
+
|
7
|
+
context ".resolve_const" do
|
8
|
+
it "resolves ARGF.class" do
|
9
|
+
expect(v.resolve_const("ARGF.class")).to be(ARGF.class)
|
10
|
+
end
|
11
|
+
|
12
|
+
if RUBY_ENGINE == "ruby" && RUBY_VERSION < "2.1"
|
13
|
+
it "resolves IO::readable and IO::writable" do
|
14
|
+
readable = v.resolve_const("IO::readable")
|
15
|
+
writable = v.resolve_const("IO::writable")
|
16
|
+
expect(readable.method_defined?(:readline)).to be_true
|
17
|
+
expect(writable.method_defined?(:puts)).to be_true
|
18
|
+
expect(writable.method_defined?(:readline)).to be_false
|
19
|
+
expect(readable.method_defined?(:puts)).to be_false
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
it "silently fails on nil" do
|
24
|
+
expect(v.resolve_const(nil)).to be_nil
|
25
|
+
end
|
26
|
+
|
27
|
+
it "resolves simple constant" do
|
28
|
+
expect(v.resolve_const("Object")).to be(Object)
|
29
|
+
end
|
30
|
+
|
31
|
+
it "resolves explicit global scope" do
|
32
|
+
expect(v.resolve_const("::String")).to be(String)
|
33
|
+
end
|
34
|
+
|
35
|
+
it "resolves nested class" do
|
36
|
+
expect(v.resolve_const("File::Stat")).to be(File::Stat)
|
37
|
+
end
|
38
|
+
|
39
|
+
it "swallows NameError" do
|
40
|
+
expect(v.resolve_const("Foo::Bar")).to be_nil
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
context ".resolve_context" do
|
45
|
+
it "defaults to the module if no name" do
|
46
|
+
expect(v.resolve_context(nil, "File")).to be(File)
|
47
|
+
end
|
48
|
+
|
49
|
+
it "accepts explicit scope qualifier" do
|
50
|
+
expect(v.resolve_context("::String", "File")).to be(String)
|
51
|
+
end
|
52
|
+
|
53
|
+
it "sees nested constants" do
|
54
|
+
expect(v.resolve_context("Stat", "File")).to be(File::Stat)
|
55
|
+
end
|
56
|
+
|
57
|
+
it "sees constants in containing scopes" do
|
58
|
+
expect(v.resolve_context("Stat", "File::Constants")).to be(File::Stat)
|
59
|
+
end
|
60
|
+
|
61
|
+
it "returns nil when not found" do
|
62
|
+
expect(v.resolve_context("Boo", "File::Constants")).to be_nil
|
63
|
+
end
|
64
|
+
|
65
|
+
it "prioritizes deeper nesting" do
|
66
|
+
m = Module.new do
|
67
|
+
module self::A; end
|
68
|
+
module self::N
|
69
|
+
module self::A
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
73
|
+
stub_const("M", m)
|
74
|
+
expect(v.resolve_context("A", "M::N")).to be(m::N::A)
|
75
|
+
end
|
76
|
+
|
77
|
+
it "swallows NameError" do
|
78
|
+
expect(v.resolve_context("String", "Foo::Bar")).to be(String)
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
context ".resolve_path_elems" do
|
83
|
+
it "returns an array" do
|
84
|
+
expect(v.resolve_path_elems(["File", "Stat"])).to eq([File, File::Stat])
|
85
|
+
end
|
86
|
+
|
87
|
+
it "swallows NameError" do
|
88
|
+
expect(v.resolve_path_elems(["Foo", "Bar"])).to eq([])
|
89
|
+
end
|
90
|
+
end
|
91
|
+
end
|
data/spec/robe_spec.rb
ADDED
@@ -0,0 +1,51 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'robe-server'
|
3
|
+
require 'net/http'
|
4
|
+
|
5
|
+
describe Robe do
|
6
|
+
before do
|
7
|
+
$stderr = File.new(IO::NULL, "w")
|
8
|
+
Robe.start
|
9
|
+
end
|
10
|
+
|
11
|
+
after do
|
12
|
+
Robe.stop if Robe.server
|
13
|
+
$stderr = STDERR
|
14
|
+
end
|
15
|
+
|
16
|
+
it "has a server attribute" do
|
17
|
+
expect(Robe.server).to be_a(Robe::Server)
|
18
|
+
end
|
19
|
+
|
20
|
+
it "has the server running" do
|
21
|
+
expect(Robe.server.running).to be_true
|
22
|
+
end
|
23
|
+
|
24
|
+
it "has a stop method" do
|
25
|
+
expect { Robe.stop }.to stop_it
|
26
|
+
end
|
27
|
+
|
28
|
+
it "proxies 'ping' to Sash" do
|
29
|
+
resp = Net::HTTP.get("127.0.0.1", "/ping", Robe.server.port)
|
30
|
+
expect(resp).to eq("\"pong\"")
|
31
|
+
end
|
32
|
+
|
33
|
+
it "returns 'robe on' when already running" do
|
34
|
+
expect(Robe.start).to start_with("robe on")
|
35
|
+
end
|
36
|
+
|
37
|
+
%w(INT TERM).each do |signal|
|
38
|
+
it "shuts down on #{signal}" do
|
39
|
+
expect { Process.kill(signal, Process.pid) }.to stop_it
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
RSpec::Matchers.define :stop_it do
|
44
|
+
match do |proc|
|
45
|
+
server = Robe.server
|
46
|
+
proc.call
|
47
|
+
sleep 0.001
|
48
|
+
server.running == false
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,39 @@
|
|
1
|
+
require 'simplecov'
|
2
|
+
require 'coveralls'
|
3
|
+
require 'pry'
|
4
|
+
|
5
|
+
SimpleCov.formatter = SimpleCov::Formatter::MultiFormatter[
|
6
|
+
SimpleCov::Formatter::HTMLFormatter,
|
7
|
+
Coveralls::SimpleCov::Formatter
|
8
|
+
]
|
9
|
+
|
10
|
+
SimpleCov.start
|
11
|
+
|
12
|
+
RSpec.configure do |config|
|
13
|
+
config.expect_with :rspec do |c|
|
14
|
+
c.syntax = :expect
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
module ScannerHelper
|
19
|
+
def new_module(imethod, method, private_imethod, private_method)
|
20
|
+
Module.new do
|
21
|
+
eval <<-EOS
|
22
|
+
def #{imethod}; end
|
23
|
+
private
|
24
|
+
def #{private_imethod}; end
|
25
|
+
class << self
|
26
|
+
def #{method}; end
|
27
|
+
private
|
28
|
+
def #{private_method}; end
|
29
|
+
end
|
30
|
+
EOS
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
def named_module(name, *args)
|
35
|
+
new_module(*args).tap do |m|
|
36
|
+
m.instance_eval "def __name__; \"#{name}\" end"
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
require 'robe/visor'
|
2
|
+
|
3
|
+
class ScopedVisor < Robe::Visor
|
4
|
+
def initialize(*modules)
|
5
|
+
if modules.last.is_a? Hash
|
6
|
+
@namespace = modules.pop
|
7
|
+
else
|
8
|
+
@namespace = {}
|
9
|
+
end
|
10
|
+
@modules = modules + @namespace.values
|
11
|
+
end
|
12
|
+
|
13
|
+
def fits?(type, m)
|
14
|
+
m.kind_of? type
|
15
|
+
end
|
16
|
+
|
17
|
+
def each_object(type)
|
18
|
+
@modules.select { |m| fits?(type, m) }.each { |m| yield m if block_given? }
|
19
|
+
end
|
20
|
+
|
21
|
+
def resolve_path_elems(nesting)
|
22
|
+
base = @namespace[nesting.shift]
|
23
|
+
[base] + super(nesting, base)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
class BlindVisor < ScopedVisor
|
28
|
+
def fits?(type, m)
|
29
|
+
true
|
30
|
+
end
|
31
|
+
end
|
metadata
ADDED
@@ -0,0 +1,116 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: robe-server
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.0.2
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Phil Hagelberg, Dmitry Gutov, Alexsey Ermolaev
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2017-09-24 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: rake
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '10.3'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '10.3'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rspec
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '2.14'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '2.14'
|
41
|
+
description: Server for robe
|
42
|
+
email: afay.zangetsu@gmail.com
|
43
|
+
executables: []
|
44
|
+
extensions: []
|
45
|
+
extra_rdoc_files:
|
46
|
+
- LICENSE
|
47
|
+
- README.md
|
48
|
+
files:
|
49
|
+
- ".gitignore"
|
50
|
+
- ".rspec"
|
51
|
+
- ".travis.yml"
|
52
|
+
- Gemfile
|
53
|
+
- Gemfile.lock
|
54
|
+
- LICENSE
|
55
|
+
- README.md
|
56
|
+
- Rakefile
|
57
|
+
- lib/robe-server.rb
|
58
|
+
- lib/robe/core_ext.rb
|
59
|
+
- lib/robe/jvisor.rb
|
60
|
+
- lib/robe/sash.rb
|
61
|
+
- lib/robe/sash/doc_for.rb
|
62
|
+
- lib/robe/sash/includes_tracker.rb
|
63
|
+
- lib/robe/scanners.rb
|
64
|
+
- lib/robe/server.rb
|
65
|
+
- lib/robe/type_space.rb
|
66
|
+
- lib/robe/visor.rb
|
67
|
+
- robe-server.gemspec
|
68
|
+
- spec/robe/jvisor_spec.rb
|
69
|
+
- spec/robe/method_scanner_spec.rb
|
70
|
+
- spec/robe/module_scanner_spec.rb
|
71
|
+
- spec/robe/sash/doc_for_spec.rb
|
72
|
+
- spec/robe/sash/includes_tracker_spec.rb
|
73
|
+
- spec/robe/sash_spec.rb
|
74
|
+
- spec/robe/server_spec.rb
|
75
|
+
- spec/robe/type_space_spec.rb
|
76
|
+
- spec/robe/visor_spec.rb
|
77
|
+
- spec/robe_spec.rb
|
78
|
+
- spec/spec_helper.rb
|
79
|
+
- spec/support/mocks.rb
|
80
|
+
homepage: https://github.com/AfsmNGhr/robe-server
|
81
|
+
licenses:
|
82
|
+
- GPL-3.0
|
83
|
+
metadata: {}
|
84
|
+
post_install_message:
|
85
|
+
rdoc_options: []
|
86
|
+
require_paths:
|
87
|
+
- lib
|
88
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
89
|
+
requirements:
|
90
|
+
- - ">="
|
91
|
+
- !ruby/object:Gem::Version
|
92
|
+
version: '0'
|
93
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
94
|
+
requirements:
|
95
|
+
- - ">="
|
96
|
+
- !ruby/object:Gem::Version
|
97
|
+
version: '0'
|
98
|
+
requirements: []
|
99
|
+
rubyforge_project:
|
100
|
+
rubygems_version: 2.5.1
|
101
|
+
signing_key:
|
102
|
+
specification_version: 4
|
103
|
+
summary: Code navigation, documentation lookup and completion for Ruby
|
104
|
+
test_files:
|
105
|
+
- spec/robe/jvisor_spec.rb
|
106
|
+
- spec/robe/method_scanner_spec.rb
|
107
|
+
- spec/robe/module_scanner_spec.rb
|
108
|
+
- spec/robe/sash/doc_for_spec.rb
|
109
|
+
- spec/robe/sash/includes_tracker_spec.rb
|
110
|
+
- spec/robe/sash_spec.rb
|
111
|
+
- spec/robe/server_spec.rb
|
112
|
+
- spec/robe/type_space_spec.rb
|
113
|
+
- spec/robe/visor_spec.rb
|
114
|
+
- spec/robe_spec.rb
|
115
|
+
- spec/spec_helper.rb
|
116
|
+
- spec/support/mocks.rb
|