robe-server 1.0.2

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