Skip to content

Commit 9d2e30c

Browse files
committed
wip
1 parent e469c39 commit 9d2e30c

11 files changed

+203
-5
lines changed

Dockerfile.development

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
ARG RUBY_VERSION=
22
FROM ruby:$RUBY_VERSION
33

4-
RUN apt-get update && apt-get install less -y
4+
RUN apt-get update && apt-get install apt-transport-https netcat less -y
55
RUN groupadd --gid 1000 ruby && useradd --uid 1000 --gid ruby --shell /bin/bash --create-home ruby
66
RUN mkdir /app /vendor && chown -R ruby:ruby /app /vendor
77

docker-compose.override.yml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,3 +14,6 @@ services:
1414
<<: *app
1515
ruby-2-2:
1616
<<: *app
17+
selenium-vscode:
18+
volumes:
19+
- ./docker-selenium-vscode/vscode_wrapper:/opt/vscode_wrapper

docker-compose.yml

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@ services:
1111
volumes:
1212
- vendor:/vendor
1313
- home:/home/ruby
14+
depends_on:
15+
- selenium-vscode
1416
ruby-2-5:
1517
<<: *app
1618
ruby-2-4:
@@ -31,6 +33,11 @@ services:
3133
<<: *app-build
3234
args:
3335
RUBY_VERSION: 2.2.9
36+
selenium-vscode:
37+
build:
38+
context: docker-selenium-vscode
39+
ports:
40+
- 5900
3441
volumes:
3542
home:
3643
vendor:

docker-selenium-vscode/Dockerfile

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
FROM selenium/standalone-chrome-debug:3.7.1
2+
3+
USER root
4+
RUN apt-get update && apt-get install apt-transport-https -y && \
5+
wget https://packages.microsoft.com/keys/microsoft.asc -q -O - | gpg --dearmor > microsoft.gpg && \
6+
mv microsoft.gpg /etc/apt/trusted.gpg.d/microsoft.gpg && \
7+
sh -c 'echo "deb [arch=amd64] https://packages.microsoft.com/repos/vscode stable main" > /etc/apt/sources.list.d/vscode.list' && \
8+
apt-get update && apt-get install code netcat -y
9+
10+
USER seluser
11+
12+
RUN wget https://mtsmfm.gallery.vsassets.io/_apis/public/gallery/publisher/mtsmfm/extension/ruby-lsc/0.1.1/assetbyname/Microsoft.VisualStudio.Services.VSIXPackage -O /tmp/ruby-lsc.vsix && \
13+
/usr/bin/code --install-extension /tmp/ruby-lsc.vsix && \
14+
rm /tmp/ruby-lsc.vsix
15+
16+
COPY vscode_wrapper /opt/vscode_wrapper
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
#! /usr/bin/env bash
2+
3+
set -e
4+
tmpdir="/tmp/vscode-test-$(date +'%s')"
5+
mkdir $tmpdir
6+
cd $tmpdir
7+
mkdir .vscode
8+
9+
args=()
10+
11+
for opt in "$@"
12+
do
13+
case $opt in
14+
--before-boot=* )
15+
before_boot=$(echo "$1" | sed -e "s/^--before-boot='//" -e "s/'$//")
16+
echo $before_boot
17+
;;
18+
'data:,' )
19+
# Ignore
20+
;;
21+
* )
22+
args+=( $1 )
23+
;;
24+
esac
25+
shift
26+
done
27+
28+
if [ "$before_boot" ]; then
29+
eval "$before_boot"
30+
fi
31+
32+
/usr/bin/code --skip-getting-started --disable-updates --disable-crash-reporter --wait ${args[*]} .
33+
rm -rf $tmpdir

language_server.gemspec

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ Gem::Specification.new do |spec|
3030
spec.add_development_dependency "awesome_print"
3131
spec.add_development_dependency "benchmark-ips"
3232
spec.add_development_dependency "bundler", "~> 1.14"
33+
spec.add_development_dependency "capybara"
3334
spec.add_development_dependency "guard"
3435
spec.add_development_dependency "guard-minitest"
3536
spec.add_development_dependency "m"
@@ -38,4 +39,5 @@ Gem::Specification.new do |spec|
3839
spec.add_development_dependency "minitest-power_assert"
3940
spec.add_development_dependency "pry-byebug"
4041
spec.add_development_dependency "rake", "~> 12.2"
42+
spec.add_development_dependency "selenium-webdriver"
4143
end

lib/language_server.rb

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -88,10 +88,14 @@ def on(method, &callback)
8888
text_document_sync: Protocol::Interface::TextDocumentSyncOptions.new(
8989
change: Protocol::Constant::TextDocumentSyncKind::FULL,
9090
),
91-
completion_provider: Protocol::Interface::CompletionOptions.new(
92-
resolve_provider: true,
93-
trigger_characters: %w[.],
94-
),
91+
completion_provider: if LanguageServer.adhoc_enabled?
92+
Protocol::Interface::CompletionOptions.new(
93+
resolve_provider: true,
94+
trigger_characters: %w[.],
95+
)
96+
else
97+
false
98+
end,
9599
definition_provider: LanguageServer.adhoc_enabled?,
96100
),
97101
)

test/language_server_test.rb

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
require "test_helper"
2+
require "open3"
3+
4+
class LanguageServerTest < IntegrationTest
5+
def test_syntax_check
6+
create_and_open_new_file "a.rb"
7+
8+
input_contents "def hi"
9+
assert_error_message_on "hi", message: "unexpected end-of-input, expecting ';' or '\\n'"
10+
11+
input_contents :enter
12+
input_contents "end"
13+
14+
assert_no_error_message
15+
end
16+
end

test/support/capybara.rb

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
require "capybara/minitest"
2+
3+
Capybara.register_driver(:vscode) do |app|
4+
options = { browser: :remote, url: "http://selenium-vscode:4444/wd/hub" }
5+
6+
options[:desired_capabilities] = Selenium::WebDriver::Remote::Capabilities.chrome(
7+
chrome_options: {
8+
binary: "/opt/vscode_wrapper",
9+
args: ["before-boot='echo \"{ \\\"ruby-lsc.commandWithArgs\\\": [ \\\"nc\\\", \\\"#{Socket.gethostname}\\\", \\\"12345\\\" ] }\" > .vscode/settings.json'"],
10+
},
11+
)
12+
13+
Capybara::Selenium::Driver.new(app, options)
14+
end
15+
16+
Capybara.run_server = false
17+
Capybara.default_driver = :vscode
18+
Capybara.default_max_wait_time = 5

test/support/test_server.rb

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
class TestServer
2+
attr_reader :stdin, :stdout, :stderr, :thread, :port
3+
4+
def initialize(port = 12345)
5+
@stdin, @stdout, @stderr = Open3.popen3("bin/language_server-ruby")
6+
@port = port
7+
@thread = start_thread
8+
@thread.abort_on_exception = true
9+
end
10+
11+
private
12+
13+
def start_thread
14+
Thread.new do
15+
socket = TCPServer.open(port).accept
16+
17+
socket_buffer = ""
18+
stdout_buffer = ""
19+
20+
loop do
21+
readable_ios, writable_ios = IO.select([socket, stdout], [socket, stdin])
22+
23+
readable_ios.each do |io|
24+
c = io.readchar
25+
26+
case io
27+
when socket
28+
socket_buffer += c
29+
when stdout
30+
stdout_buffer += c
31+
end
32+
end
33+
34+
next if readable_ios.any?
35+
36+
writable_ios.each do |io|
37+
case io
38+
when stdin
39+
io.write(socket_buffer)
40+
socket_buffer.clear
41+
when socket
42+
io.write(stdout_buffer)
43+
stdout_buffer.clear
44+
end
45+
end
46+
end
47+
end
48+
end
49+
end

0 commit comments

Comments
 (0)