rsense 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: a946a54354e0bc2c91c3893b0641fed936d20ab4
4
+ data.tar.gz: b77fa6452ec1b13e8883177aff38e9ff439df96a
5
+ SHA512:
6
+ metadata.gz: bcd973ec1d5d75f7e9aa449dd66f6d8f0ec9e7ee06e93384325b7b25ae3062dea5d8378ebdd1f6baaed4b7d4961abf547202caf849aab8c0ceec83e8da433e76
7
+ data.tar.gz: 0ae020d232d88b47ce5973612b1ea119f1439c304aaf29fd0048b9a8b5a902a1405a2e22cc89cc97e7bfd26ad10a7b6c55a8585b4edcacb96405e36bfc50be42
data/.gitignore ADDED
@@ -0,0 +1,22 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
18
+ *.bundle
19
+ *.so
20
+ *.o
21
+ *.a
22
+ mkmf.log
data/Gemfile ADDED
@@ -0,0 +1,14 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in rsense.gemspec
4
+ gemspec
5
+
6
+ gem 'rsense-server', :github => 'rsense/rsense-server', :branch => 'master'
7
+
8
+ group :linux do
9
+ gem 'libnotify'
10
+ end
11
+
12
+ group :darwin do
13
+ gem 'terminal-notifier-guard'
14
+ end
data/Guardfile ADDED
@@ -0,0 +1,5 @@
1
+ guard :minitest do
2
+ watch(%r{^spec/(.*)_spec\.rb})
3
+ watch(%r{^lib/(.+)\.rb}) { |m| "spec/#{m[1]}_spec.rb" }
4
+ watch(%r{^spec/spec_helper\.rb}) { 'spec' }
5
+ end
data/LICENSE.txt ADDED
@@ -0,0 +1 @@
1
+ RSense is distributed under the term of GPLv3+(http://gplv3.fsf.org/).
data/README.md ADDED
@@ -0,0 +1,100 @@
1
+ ![rsense](https://cloud.githubusercontent.com/assets/1395968/2978144/51565ee2-dbb5-11e3-9b94-e97a37739d03.png)
2
+
3
+ # Rsense Can See All
4
+
5
+ [![Gitter chat](https://badges.gitter.im/rsense/rsense.png)](https://gitter.im/rsense/rsense)
6
+
7
+ RSense is a tool for doing static analysis of Ruby source code. Rsense is used in conjunction with an editor plugin.
8
+
9
+ RSense is currently under heavy development and ready for testing. Currently we need to improve the homepage and develop plugins for code_completion. In the near future we'll also be ready to implement some of the other basic features like `find-definition`. After that, there's plenty to do in the long term. See the waffle link below to find out where you can pitch in. It would be awesome if you helped get things done.
10
+
11
+ [![Stories in Ready](https://badge.waffle.io/rsense/rsense.png?label=ready&title=Ready)](https://waffle.io/rsense/rsense)
12
+
13
+
14
+ ## Installation
15
+
16
+ Add this line to your application's Gemfile:
17
+
18
+ gem 'rsense'
19
+
20
+ And then execute:
21
+
22
+ $ bundle
23
+
24
+ Or install it yourself as:
25
+
26
+ $ gem install rsense
27
+
28
+ ## Usage
29
+
30
+ Install one of these plugins:
31
+
32
+ ## Plugin Authors
33
+
34
+ Rsense plugins are easy to implement. First your plugin will need to ensure the Rsense server has been started. It can do this by shelling out to the command line with `rsense start`. The server can optionally take a port number like this: `rsense server --port 12345`. The default port is `47367`. It also takes a project path, in case the user has a `.rsense` config file there. For now, this config file is not very useful, but it may become so in the future.
35
+
36
+ The rsense server will be running at `http://localhost:47367` (or an alternate port if you specify one). It communicates via json. You need to send it json like the following example:
37
+
38
+ ```json
39
+ {
40
+ "command": "code_completion",
41
+ "project": "/Users/home/test_gem",
42
+ "file": "/Users/home/test_gem/lib/sample.rb",
43
+ "code": "require \"sample/version\"\n\nmodule Sample\n attr_accessor :simple\n\n def initialize\n @simple = \"simple\"\n end\n\n def another\n \"another\"\n end\nend\n\nsample = Sample.new\nsample\n",
44
+ "location": {
45
+ "row": 16,
46
+ "column": 7
47
+ }
48
+ }
49
+ ```
50
+
51
+ For now, `code_completion` is the only command available, but this will change in the future. Project is the root dir of the user's project. This is needed for finding information about project dependencies. Code is the text from the file where a completion is being triggered. Location should be obvious.
52
+
53
+ Rsense will return json that looks like the below:
54
+
55
+ ```json
56
+ {"completions":
57
+ [
58
+ {
59
+ "taint":
60
+ {
61
+ "qualified_name":"Object#taint",
62
+ "base_name":"Object",
63
+ "kind":"METHOD"
64
+ }
65
+ },
66
+ {
67
+ "methods":
68
+ {
69
+ "qualified_name":"Object#methods",
70
+ "base_name":"Object",
71
+ "kind":"METHOD"
72
+ }
73
+ }
74
+ ]
75
+ }
76
+
77
+ ```
78
+
79
+ ## Contributing
80
+
81
+ Contributions can only be accepted if they include tests.
82
+
83
+ 1. Fork it ( https://github.com/[my-github-username]/rsense/fork )
84
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
85
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
86
+ 4. Push to the branch (`git push origin my-new-feature`)
87
+ 5. Create a new Pull Request
88
+
89
+ ## License
90
+
91
+ RSense is distributed under the term of
92
+ [GPLv3+](http://gplv3.fsf.org/).
93
+
94
+ ## Credits
95
+
96
+ Rsense was originally designed and implemented by [Matsuyama Tomohiro(@m2ym)](https://github.com/m2ym/), and his hard work is still at the core of rsense today. All of the algorithms for type-detection were implemented by him, with inspiration from multiple places. You can read about his original version at [Rsense: A Ruby Development tools for Emacs, Vim and Others](http://cx4a.org/software/rsense/)
97
+
98
+ In 2013, a major undertaking by @edubkendo to bring it current and improve its usefullness to rubyists was sponsored by the @jruby organization as a Google Summer of Code project.
99
+
100
+ Special thanks belongs to [Tom Enebo (@enebo)](https://github.com/enebo) who provided excellent mentorship, code, architectural suggestions and more throughout the course of the update.
data/Rakefile ADDED
@@ -0,0 +1,9 @@
1
+ require "bundler/gem_tasks"
2
+ require 'rake/testtask'
3
+
4
+ Rake::TestTask.new do |t|
5
+ t.libs.push "lib"
6
+ t.test_files = FileList['spec/**/*_spec.rb']
7
+ t.verbose = true
8
+ end
9
+
data/bin/rsense ADDED
@@ -0,0 +1,21 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'rsense/client/daemon'
4
+ require "jruby-jars"
5
+ require "pathname"
6
+
7
+ daemon = Rsense::Client::Daemon.new(ARGV[1..-1])
8
+
9
+ if ARGV[0] == 'start'
10
+ daemon.start
11
+ exit!
12
+ elsif ARGV[0] == 'stop'
13
+ daemon.stop
14
+ elsif ARGV[0] == 'restart'
15
+ daemon.stop
16
+ daemon.start
17
+ exit!
18
+ else
19
+ STDERR.puts "Usage: rsense <start|stop|restart>"
20
+ exit!
21
+ end
@@ -0,0 +1,67 @@
1
+ require "forwardable"
2
+ require "jruby-jars"
3
+ require "filetree"
4
+ require "rsense/server/path_info"
5
+ require_relative "./runner"
6
+
7
+ module Rsense
8
+ module Client
9
+ class Daemon
10
+ extend Forwardable
11
+ attr_accessor :classpath, :external_args, :argslist, :rsense_home, :rsense_lib, :rsense_bin, :runner
12
+
13
+ def_delegators :@runner, :start, :stop, :restart
14
+
15
+ def initialize(args=[])
16
+ @external_args = args
17
+ @rsense_home = rsense_home
18
+ @rsense_lib = rsense_lib
19
+ @rsense_bin = rsense_bin
20
+ @argslist = build_argslist()
21
+ @runner = Rsense::Client::Runner.new(@argslist)
22
+ set_gem_path_env(gem_path)
23
+ end
24
+
25
+ def build_argslist
26
+ java_args + jruby_args(@external_args)
27
+ end
28
+
29
+ def classpath
30
+ @classpath ||= [
31
+ JRubyJars.core_jar_path,
32
+ JRubyJars.stdlib_jar_path
33
+ ].join(File::PATH_SEPARATOR)
34
+ end
35
+
36
+ def rsense_home
37
+ Rsense::Server::PathInfo::RSENSE_SERVER_HOME
38
+ end
39
+
40
+ def rsense_lib
41
+ @rsense_home.join("lib").to_s
42
+ end
43
+
44
+ def rsense_bin
45
+ Rsense::Server::PathInfo.bin_path.to_s
46
+ end
47
+
48
+ def gem_path
49
+ Gem.path.join(File::PATH_SEPARATOR)
50
+ end
51
+
52
+ def set_gem_path_env(gp)
53
+ ENV["GEM_PATH"] = gp
54
+ end
55
+
56
+ def java_args
57
+ ["env", "java", "-cp", classpath, "org.jruby.Main"]
58
+ end
59
+
60
+ def jruby_args(cli_args=[])
61
+ cli_args ||= [""]
62
+ ["-I#{@rsense_lib}", @rsense_bin] + cli_args
63
+ end
64
+
65
+ end
66
+ end
67
+ end
@@ -0,0 +1,114 @@
1
+ require 'rubygems'
2
+ require 'spoon'
3
+
4
+ module Rsense
5
+ module Client
6
+ class Runner
7
+ attr_accessor :args
8
+
9
+ APPNAME = 'rsense'
10
+ WORK_PATH = Dir.pwd
11
+ PID_PATH = '/tmp/exec.pid'
12
+ OUT_PATH = '/tmp/rsense.log'
13
+ EXEC = "/usr/bin/env"
14
+
15
+ def initialize(args)
16
+ @args = args
17
+ end
18
+
19
+ def create_pid(pid)
20
+ begin
21
+ open(PID_PATH, 'w') do |f|
22
+ f.puts pid
23
+ end
24
+ rescue => e
25
+ STDERR.puts "Error: Unable to open #{PID_PATH} for writing:\n\t" +
26
+ "(#{e.class}) #{e.message}"
27
+ exit!
28
+ end
29
+ end
30
+
31
+ def get_pid
32
+ pid = false
33
+ begin
34
+ open(PID_PATH, 'r') do |f|
35
+ pid = f.readline
36
+ pid = pid.to_s.gsub(/[^0-9]/,'')
37
+ end
38
+ rescue => e
39
+ STDERR.puts "Error: Unable to open #{PID_PATH} for reading:\n\t" +
40
+ "(#{e.class}) #{e.message}"
41
+ exit
42
+ end
43
+
44
+ pid.to_i
45
+ end
46
+
47
+ def remove_pidfile
48
+ begin
49
+ File.unlink(PID_PATH)
50
+ rescue => e
51
+ STDERR.puts "ERROR: Unable to unlink #{path}:\n\t" +
52
+ "(#{e.class}) #{e.message}"
53
+ exit
54
+ end
55
+ end
56
+
57
+ def process_exists?
58
+ begin
59
+ pid = get_pid
60
+ return false unless pid
61
+ Process.kill(0, pid)
62
+ true
63
+ rescue Errno::ESRCH, TypeError
64
+ STDERR.puts "PID #{pid} is NOT running or is zombied!";
65
+ false
66
+ rescue Errno::EPERM
67
+ STDERR.puts "No permission to query #{pid}!";
68
+ rescue => e
69
+ STDERR.puts "(#{e.class}) #{e.message}:\n\t" +
70
+ "Unable to determine status for #{pid}."
71
+ false
72
+ end
73
+ end
74
+
75
+ def stop
76
+ begin
77
+ pid = get_pid
78
+ STDERR.puts "pid : #{pid}"
79
+ while true do
80
+ Process.kill("TERM", pid)
81
+ Process.wait(pid)
82
+ sleep(0.1)
83
+ end
84
+ puts "here"
85
+ rescue Errno::ESRCH, Errno::ECHILD # no more process to kill
86
+ remove_pidfile
87
+ STDOUT.puts 'Stopped the process'
88
+ rescue => e
89
+ STDERR.puts "unable to terminate process: (#{e.class}) #{e.message}"
90
+ end
91
+ end
92
+
93
+ def restart
94
+ if process_exists?
95
+ STDERR.puts "The process #{EXEC} already running. Restarting the process"
96
+ stop
97
+ end
98
+ start
99
+ end
100
+
101
+ def start
102
+ Dir::chdir(WORK_PATH)
103
+ file_actions = Spoon::FileActions.new
104
+ file_actions.close(1)
105
+ file_actions.open(1, OUT_PATH, File::WRONLY | File::TRUNC | File::CREAT, 0600)
106
+ file_actions.close(2)
107
+ file_actions.open(2, OUT_PATH, File::WRONLY | File::TRUNC | File::CREAT, 0600)
108
+ spawn_attr = Spoon::SpawnAttributes.new
109
+ pid = Spoon.posix_spawn EXEC, file_actions, spawn_attr, @args
110
+ create_pid(pid)
111
+ end
112
+ end
113
+ end
114
+ end
@@ -0,0 +1,31 @@
1
+ require_relative "client/daemon"
2
+
3
+ module Rsense
4
+ module Client
5
+ class Client
6
+ attr_accessor :config
7
+
8
+ Config = Struct.new(
9
+ :gem_home,
10
+ :gem_path,
11
+ :load_path
12
+ )
13
+
14
+ def gather_info
15
+ @config = Config.new(gem_home, gem_path, $:.join(File::PATH_SEPARATOR))
16
+ end
17
+
18
+ def gem_home
19
+ ENV["GEM_HOME"]
20
+ end
21
+
22
+ def gem_path
23
+ gem_pth = []
24
+ gem_pth << ENV["GEM_PATH"]
25
+ gem_pth << Gem.path
26
+ gem_pth.join(File::PATH_SEPARATOR)
27
+ end
28
+
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,3 @@
1
+ module Rsense
2
+ VERSION = "0.5.0"
3
+ end
data/lib/rsense.rb ADDED
@@ -0,0 +1,5 @@
1
+ require "rsense/version"
2
+
3
+ module Rsense
4
+ # Your code goes here...
5
+ end
data/rsense.gemspec ADDED
@@ -0,0 +1,36 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'rsense/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "rsense"
8
+ spec.version = Rsense::VERSION
9
+ spec.authors = ["Eric West", "Tomohiro Matsuyama"]
10
+ spec.email = ["esw9999@gmail.com", "tomo@cx4a.org"]
11
+ spec.summary = %q{RSense knows your code.}
12
+ spec.description = %q{RSense is a tool for doing static analysis of Ruby source code. Rsense is used in conjunction with an editor plugin.}
13
+ spec.homepage = ""
14
+ spec.license = "GPL"
15
+
16
+ spec.files = `git ls-files -z`.split("\x0")
17
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
+ spec.require_paths = ["lib"]
20
+
21
+ spec.add_dependency "rsense-core", "~> 0.5.1"
22
+ spec.add_dependency "rsense-server", "~> 0.5.0"
23
+ spec.add_dependency "spoon", "~> 0.0.4"
24
+ spec.add_dependency "jruby-jars", "~> 1.7.4"
25
+ spec.add_dependency "jruby-parser", "~> 0.5.4"
26
+ spec.add_dependency "thor", "~> 0.18.1"
27
+ spec.add_dependency "filetree", "~> 1.0.0"
28
+ spec.add_dependency "bundler", "~> 1.6"
29
+
30
+ spec.add_development_dependency 'guard'
31
+ spec.add_development_dependency 'guard-minitest'
32
+ spec.add_development_dependency 'minitest-reporters'
33
+ spec.add_development_dependency 'minitest'
34
+ spec.add_development_dependency 'pry'
35
+ spec.add_development_dependency "rake"
36
+ end
@@ -0,0 +1,10 @@
1
+ {
2
+ "command": "find_definition",
3
+ "project": "~/code/rsense/rsense",
4
+ "file": "~/code/rsense/rsense/lib/rsense.rb",
5
+ "code": "module TestStuff\n class TestThings\n def junk\n 'junk'\n end\n end\nend\n\nTestStuff::TestThings",
6
+ "location": {
7
+ "row": 9,
8
+ "column": 22
9
+ }
10
+ }
@@ -0,0 +1,10 @@
1
+ {
2
+ "command": "code_completion",
3
+ "project": "~/code/rsense/rsense",
4
+ "file": "~/code/rsense/rsense/lib/rsense.rb",
5
+ "code": "def check(testarg)\n testarg\nend\ncheck('hello')",
6
+ "location": {
7
+ "row": 2,
8
+ "column": 10
9
+ }
10
+ }
@@ -0,0 +1,99 @@
1
+ require_relative "../../spec_helper"
2
+
3
+ describe Rsense::Client::Daemon do
4
+
5
+ before do
6
+ @daemon = Rsense::Client::Daemon.new
7
+ end
8
+
9
+ it "returns the paths to the JRuby Jars" do
10
+ cp = @daemon.classpath
11
+ cp.must_match(/jruby-core-complete/)
12
+ cp.must_match(/jruby-stdlib-complete/)
13
+ end
14
+
15
+ it "knows where home is" do
16
+ mhome = @daemon.rsense_home
17
+ mhome.to_s.must_match(/rsense-server$/)
18
+ end
19
+
20
+ it "knows where the lib dir is" do
21
+ @daemon.rsense_lib.to_s.must_match(/rsense.*\/lib/)
22
+ end
23
+
24
+ it "passes args to the JVM" do
25
+ @daemon.java_args.last.must_match(/Main/)
26
+ end
27
+
28
+ it "passes args to JRuby" do
29
+ @daemon.jruby_args(["foo", "bar"]).last.must_match(/bar/)
30
+ end
31
+
32
+ it "knows where the GEM_PATH is" do
33
+ @daemon.gem_path.must_match(/gem/)
34
+ end
35
+
36
+ describe "with args passed on init" do
37
+ before do
38
+ @daemon = Rsense::Client::Daemon.new(["foo", "bar"])
39
+ end
40
+
41
+ it "combines args for the JVM and JRuby" do
42
+ @daemon.build_argslist.must_include("java")
43
+ end
44
+ end
45
+
46
+ it "sets the GEM_PATH env" do
47
+ gp = @daemon.gem_path
48
+ @daemon.set_gem_path_env(gp)
49
+ ENV["GEM_PATH"].must_equal gp
50
+ end
51
+
52
+ describe "Runner" do
53
+ class RunnerStub
54
+ attr_accessor :exec_cmd, :false
55
+
56
+ def initialize(exec_cmd)
57
+ @exec_cmd = exec_cmd
58
+ @called = false
59
+ end
60
+
61
+ def start
62
+ @called = true
63
+ end
64
+
65
+ def stop
66
+ @called = true
67
+ end
68
+
69
+ def restart
70
+ @called = true
71
+ end
72
+ end
73
+
74
+ it "should initialize a runner" do
75
+ daemon = Rsense::Client::Daemon.new(["foo", "bar"])
76
+ daemon.runner.class::PID_PATH.must_match(/tmp\/exec\.pid/)
77
+ end
78
+
79
+ it "should delegate start method to runner" do
80
+ daemon = Rsense::Client::Daemon.new(["foo", "bar"])
81
+ daemon.runner = RunnerStub.new(daemon.argslist)
82
+ daemon.start.must_equal(true)
83
+ end
84
+
85
+ it "should delegate stop method to runner" do
86
+ daemon = Rsense::Client::Daemon.new(["foo", "bar"])
87
+ daemon.runner = RunnerStub.new(daemon.argslist)
88
+ daemon.stop.must_equal(true)
89
+ end
90
+
91
+ it "should delegate restart method to runner" do
92
+ daemon = Rsense::Client::Daemon.new(["foo", "bar"])
93
+ daemon.runner = RunnerStub.new(daemon.argslist)
94
+ daemon.restart.must_equal(true)
95
+ end
96
+
97
+ end
98
+
99
+ end
@@ -0,0 +1,5 @@
1
+ require "minitest/autorun"
2
+ require "minitest/reporters"
3
+ Minitest::Reporters.use!
4
+
5
+ require_relative "../lib/rsense/client/daemon.rb"
metadata ADDED
@@ -0,0 +1,265 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: rsense
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.5.0
5
+ platform: ruby
6
+ authors:
7
+ - Eric West
8
+ - Tomohiro Matsuyama
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2014-06-09 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: rsense-core
16
+ requirement: !ruby/object:Gem::Requirement
17
+ requirements:
18
+ - - "~>"
19
+ - !ruby/object:Gem::Version
20
+ version: 0.5.1
21
+ type: :runtime
22
+ prerelease: false
23
+ version_requirements: !ruby/object:Gem::Requirement
24
+ requirements:
25
+ - - "~>"
26
+ - !ruby/object:Gem::Version
27
+ version: 0.5.1
28
+ - !ruby/object:Gem::Dependency
29
+ name: rsense-server
30
+ requirement: !ruby/object:Gem::Requirement
31
+ requirements:
32
+ - - "~>"
33
+ - !ruby/object:Gem::Version
34
+ version: 0.5.0
35
+ type: :runtime
36
+ prerelease: false
37
+ version_requirements: !ruby/object:Gem::Requirement
38
+ requirements:
39
+ - - "~>"
40
+ - !ruby/object:Gem::Version
41
+ version: 0.5.0
42
+ - !ruby/object:Gem::Dependency
43
+ name: spoon
44
+ requirement: !ruby/object:Gem::Requirement
45
+ requirements:
46
+ - - "~>"
47
+ - !ruby/object:Gem::Version
48
+ version: 0.0.4
49
+ type: :runtime
50
+ prerelease: false
51
+ version_requirements: !ruby/object:Gem::Requirement
52
+ requirements:
53
+ - - "~>"
54
+ - !ruby/object:Gem::Version
55
+ version: 0.0.4
56
+ - !ruby/object:Gem::Dependency
57
+ name: jruby-jars
58
+ requirement: !ruby/object:Gem::Requirement
59
+ requirements:
60
+ - - "~>"
61
+ - !ruby/object:Gem::Version
62
+ version: 1.7.4
63
+ type: :runtime
64
+ prerelease: false
65
+ version_requirements: !ruby/object:Gem::Requirement
66
+ requirements:
67
+ - - "~>"
68
+ - !ruby/object:Gem::Version
69
+ version: 1.7.4
70
+ - !ruby/object:Gem::Dependency
71
+ name: jruby-parser
72
+ requirement: !ruby/object:Gem::Requirement
73
+ requirements:
74
+ - - "~>"
75
+ - !ruby/object:Gem::Version
76
+ version: 0.5.4
77
+ type: :runtime
78
+ prerelease: false
79
+ version_requirements: !ruby/object:Gem::Requirement
80
+ requirements:
81
+ - - "~>"
82
+ - !ruby/object:Gem::Version
83
+ version: 0.5.4
84
+ - !ruby/object:Gem::Dependency
85
+ name: thor
86
+ requirement: !ruby/object:Gem::Requirement
87
+ requirements:
88
+ - - "~>"
89
+ - !ruby/object:Gem::Version
90
+ version: 0.18.1
91
+ type: :runtime
92
+ prerelease: false
93
+ version_requirements: !ruby/object:Gem::Requirement
94
+ requirements:
95
+ - - "~>"
96
+ - !ruby/object:Gem::Version
97
+ version: 0.18.1
98
+ - !ruby/object:Gem::Dependency
99
+ name: filetree
100
+ requirement: !ruby/object:Gem::Requirement
101
+ requirements:
102
+ - - "~>"
103
+ - !ruby/object:Gem::Version
104
+ version: 1.0.0
105
+ type: :runtime
106
+ prerelease: false
107
+ version_requirements: !ruby/object:Gem::Requirement
108
+ requirements:
109
+ - - "~>"
110
+ - !ruby/object:Gem::Version
111
+ version: 1.0.0
112
+ - !ruby/object:Gem::Dependency
113
+ name: bundler
114
+ requirement: !ruby/object:Gem::Requirement
115
+ requirements:
116
+ - - "~>"
117
+ - !ruby/object:Gem::Version
118
+ version: '1.6'
119
+ type: :runtime
120
+ prerelease: false
121
+ version_requirements: !ruby/object:Gem::Requirement
122
+ requirements:
123
+ - - "~>"
124
+ - !ruby/object:Gem::Version
125
+ version: '1.6'
126
+ - !ruby/object:Gem::Dependency
127
+ name: guard
128
+ requirement: !ruby/object:Gem::Requirement
129
+ requirements:
130
+ - - ">="
131
+ - !ruby/object:Gem::Version
132
+ version: '0'
133
+ type: :development
134
+ prerelease: false
135
+ version_requirements: !ruby/object:Gem::Requirement
136
+ requirements:
137
+ - - ">="
138
+ - !ruby/object:Gem::Version
139
+ version: '0'
140
+ - !ruby/object:Gem::Dependency
141
+ name: guard-minitest
142
+ requirement: !ruby/object:Gem::Requirement
143
+ requirements:
144
+ - - ">="
145
+ - !ruby/object:Gem::Version
146
+ version: '0'
147
+ type: :development
148
+ prerelease: false
149
+ version_requirements: !ruby/object:Gem::Requirement
150
+ requirements:
151
+ - - ">="
152
+ - !ruby/object:Gem::Version
153
+ version: '0'
154
+ - !ruby/object:Gem::Dependency
155
+ name: minitest-reporters
156
+ requirement: !ruby/object:Gem::Requirement
157
+ requirements:
158
+ - - ">="
159
+ - !ruby/object:Gem::Version
160
+ version: '0'
161
+ type: :development
162
+ prerelease: false
163
+ version_requirements: !ruby/object:Gem::Requirement
164
+ requirements:
165
+ - - ">="
166
+ - !ruby/object:Gem::Version
167
+ version: '0'
168
+ - !ruby/object:Gem::Dependency
169
+ name: minitest
170
+ requirement: !ruby/object:Gem::Requirement
171
+ requirements:
172
+ - - ">="
173
+ - !ruby/object:Gem::Version
174
+ version: '0'
175
+ type: :development
176
+ prerelease: false
177
+ version_requirements: !ruby/object:Gem::Requirement
178
+ requirements:
179
+ - - ">="
180
+ - !ruby/object:Gem::Version
181
+ version: '0'
182
+ - !ruby/object:Gem::Dependency
183
+ name: pry
184
+ requirement: !ruby/object:Gem::Requirement
185
+ requirements:
186
+ - - ">="
187
+ - !ruby/object:Gem::Version
188
+ version: '0'
189
+ type: :development
190
+ prerelease: false
191
+ version_requirements: !ruby/object:Gem::Requirement
192
+ requirements:
193
+ - - ">="
194
+ - !ruby/object:Gem::Version
195
+ version: '0'
196
+ - !ruby/object:Gem::Dependency
197
+ name: rake
198
+ requirement: !ruby/object:Gem::Requirement
199
+ requirements:
200
+ - - ">="
201
+ - !ruby/object:Gem::Version
202
+ version: '0'
203
+ type: :development
204
+ prerelease: false
205
+ version_requirements: !ruby/object:Gem::Requirement
206
+ requirements:
207
+ - - ">="
208
+ - !ruby/object:Gem::Version
209
+ version: '0'
210
+ description: RSense is a tool for doing static analysis of Ruby source code. Rsense
211
+ is used in conjunction with an editor plugin.
212
+ email:
213
+ - esw9999@gmail.com
214
+ - tomo@cx4a.org
215
+ executables:
216
+ - rsense
217
+ extensions: []
218
+ extra_rdoc_files: []
219
+ files:
220
+ - ".gitignore"
221
+ - Gemfile
222
+ - Guardfile
223
+ - LICENSE.txt
224
+ - README.md
225
+ - Rakefile
226
+ - bin/rsense
227
+ - lib/rsense.rb
228
+ - lib/rsense/client.rb
229
+ - lib/rsense/client/daemon.rb
230
+ - lib/rsense/client/runner.rb
231
+ - lib/rsense/version.rb
232
+ - rsense.gemspec
233
+ - spec/fixtures/find_def_sample.json
234
+ - spec/fixtures/sample.json
235
+ - spec/rsense/client/daemon_spec.rb
236
+ - spec/spec_helper.rb
237
+ homepage: ''
238
+ licenses:
239
+ - GPL
240
+ metadata: {}
241
+ post_install_message:
242
+ rdoc_options: []
243
+ require_paths:
244
+ - lib
245
+ required_ruby_version: !ruby/object:Gem::Requirement
246
+ requirements:
247
+ - - ">="
248
+ - !ruby/object:Gem::Version
249
+ version: '0'
250
+ required_rubygems_version: !ruby/object:Gem::Requirement
251
+ requirements:
252
+ - - ">="
253
+ - !ruby/object:Gem::Version
254
+ version: '0'
255
+ requirements: []
256
+ rubyforge_project:
257
+ rubygems_version: 2.2.2
258
+ signing_key:
259
+ specification_version: 4
260
+ summary: RSense knows your code.
261
+ test_files:
262
+ - spec/fixtures/find_def_sample.json
263
+ - spec/fixtures/sample.json
264
+ - spec/rsense/client/daemon_spec.rb
265
+ - spec/spec_helper.rb