redcar-dev 0.12.12dev-java → 0.12.13dev-java
Sign up to get free protection for your applications and to get access to all the features.
- data/Rakefile +1 -1
- data/lib/redcar.rb +1 -1
- data/lib/tasks/app-bundle.rake +63 -0
- data/plugins/application/lib/application.rb +3 -0
- data/plugins/project_search/lib/project_search/commands.rb +5 -4
- data/plugins/project_search/lib/project_search/images/spinner.gif +0 -0
- data/plugins/project_search/lib/project_search/lucene_index.rb +1 -1
- data/plugins/project_search/lib/project_search/stylesheets/style.css +105 -37
- data/plugins/project_search/lib/project_search/views/_file.html.erb +4 -3
- data/plugins/project_search/lib/project_search/views/index.html.erb +42 -16
- data/plugins/project_search/lib/project_search/word_search.rb +23 -14
- data/plugins/project_search/lib/project_search/word_search_controller.rb +40 -29
- metadata +3 -22
- data/plugins/javascript/features/fixtures/test.js +0 -0
- data/plugins/javascript/features/fixtures/test2.js +0 -5
- data/plugins/javascript/features/step_definitions/javascript_steps.rb +0 -16
- data/plugins/javascript/features/support/env.rb +0 -18
- data/plugins/javascript/features/syntax_check_javascript.feature +0 -70
- data/plugins/javascript/lib/syntax_check/javascript.rb +0 -58
- data/plugins/javascript/plugin.rb +0 -7
- data/plugins/javascript/vendor/jslint.js +0 -539
- data/plugins/mirah/README +0 -7
- data/plugins/mirah/features/fixtures/test.mirah +0 -2
- data/plugins/mirah/features/syntax_check_mirah.feature +0 -46
- data/plugins/mirah/lib/mirah.rb +0 -43
- data/plugins/mirah/lib/mirah/my_error_handler.rb +0 -22
- data/plugins/mirah/lib/mirah/repl_mirror.rb +0 -50
- data/plugins/mirah/lib/mirah/syntax_checker.rb +0 -38
- data/plugins/mirah/plugin.rb +0 -8
- data/plugins/mirah/spec/mirah/repl_mirror_spec.rb +0 -188
- data/plugins/mirah/spec/spec_helper.rb +0 -5
- data/plugins/mirah/vendor/mirah-parser.jar +0 -0
- data/plugins/project_search/TODO.md +0 -11
@@ -1,8 +1,12 @@
|
|
1
1
|
|
2
2
|
class ProjectSearch
|
3
3
|
class WordSearch
|
4
|
+
java_import org.apache.lucene.util.Version
|
5
|
+
java_import org.apache.lucene.analysis.standard.StandardAnalyzer
|
6
|
+
java_import org.apache.lucene.queryParser.QueryParser
|
7
|
+
|
4
8
|
attr_reader :query_string, :context_size, :project
|
5
|
-
|
9
|
+
|
6
10
|
def initialize(project, query_string, match_case, context_size)
|
7
11
|
@project = project
|
8
12
|
@query_string = query_string
|
@@ -25,6 +29,13 @@ class ProjectSearch
|
|
25
29
|
def regex
|
26
30
|
@regex ||= begin
|
27
31
|
regexp_text = Regexp.escape(@query_string)
|
32
|
+
# Replace Lucene wildcards with non-greedy Ruby regex equivalents
|
33
|
+
# TODO: determine best (expected?) way of handling phrases
|
34
|
+
p [regexp_text]
|
35
|
+
regexp_text = regexp_text.gsub(/\\\s+or\\\s+/i,"|").gsub('\\*','.*?').gsub('\\?','.').gsub(/\\\s+/,".*?")
|
36
|
+
p regexp_text
|
37
|
+
# Match to the next word boundary if the last char is '*'
|
38
|
+
regexp_text += "\\b" if regexp_text =~ /\.\*\?$/
|
28
39
|
match_case? ? /#{regexp_text}/ : /#{regexp_text}/i
|
29
40
|
end
|
30
41
|
end
|
@@ -79,24 +90,22 @@ class ProjectSearch
|
|
79
90
|
def results
|
80
91
|
@results ||= generate_results
|
81
92
|
end
|
82
|
-
|
83
|
-
def
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
93
|
+
|
94
|
+
def formatted_query
|
95
|
+
parser = QueryParser.new(
|
96
|
+
Version::LUCENE_29,
|
97
|
+
"contents",
|
98
|
+
StandardAnalyzer.new(Version::LUCENE_29)
|
99
|
+
)
|
100
|
+
parser.parse(query_string).to_s
|
90
101
|
end
|
91
|
-
|
102
|
+
|
92
103
|
def doc_ids
|
93
104
|
@doc_ids ||= begin
|
94
105
|
index = ProjectSearch.indexes[project.path].lucene_index
|
95
106
|
doc_ids = nil
|
96
|
-
|
97
|
-
|
98
|
-
doc_ids = doc_ids ? (doc_ids & new_doc_ids) : new_doc_ids
|
99
|
-
end
|
107
|
+
p [:formatted_query, formatted_query]
|
108
|
+
doc_ids = index.find(formatted_query).map {|doc| doc.id}
|
100
109
|
doc_ids.reject {|doc_id| Redcar::Project::FileList.hide_file_path?(doc_id) }
|
101
110
|
end
|
102
111
|
end
|
@@ -8,11 +8,11 @@ class ProjectSearch
|
|
8
8
|
def title
|
9
9
|
TITLE
|
10
10
|
end
|
11
|
-
|
11
|
+
|
12
12
|
def search_copy
|
13
13
|
"Search for complete words only"
|
14
14
|
end
|
15
|
-
|
15
|
+
|
16
16
|
def show_literal_match_option?
|
17
17
|
false
|
18
18
|
end
|
@@ -20,31 +20,31 @@ class ProjectSearch
|
|
20
20
|
def num_context_lines
|
21
21
|
settings['context_lines']
|
22
22
|
end
|
23
|
-
|
23
|
+
|
24
24
|
def plugin_root
|
25
25
|
File.expand_path(File.join(File.dirname(__FILE__), '..', '..'))
|
26
26
|
end
|
27
|
-
|
27
|
+
|
28
28
|
def settings
|
29
29
|
ProjectSearch.storage
|
30
30
|
end
|
31
|
-
|
31
|
+
|
32
32
|
def match_case?
|
33
33
|
ProjectSearch.storage['match_case']
|
34
34
|
end
|
35
|
-
|
35
|
+
|
36
36
|
def context?
|
37
37
|
ProjectSearch.storage['with_context']
|
38
38
|
end
|
39
|
-
|
39
|
+
|
40
40
|
def context_size
|
41
41
|
context? ? num_context_lines : 0
|
42
42
|
end
|
43
|
-
|
43
|
+
|
44
44
|
def default_query
|
45
45
|
doc.selected_text if doc && doc.selection?
|
46
46
|
end
|
47
|
-
|
47
|
+
|
48
48
|
def index
|
49
49
|
render('index')
|
50
50
|
end
|
@@ -79,20 +79,20 @@ class ProjectSearch
|
|
79
79
|
@thread = nil
|
80
80
|
super
|
81
81
|
end
|
82
|
-
|
82
|
+
|
83
83
|
def render(view, bg=nil)
|
84
84
|
erb(view).result(bg || binding)
|
85
85
|
end
|
86
|
-
|
86
|
+
|
87
87
|
def render_file(bg)
|
88
88
|
@erb ||= erb("_file")
|
89
89
|
@erb.result(bg)
|
90
90
|
end
|
91
|
-
|
91
|
+
|
92
92
|
def erb(view)
|
93
93
|
ERB.new(File.read(File.join(File.dirname(__FILE__), "views", "#{view.to_s}.html.erb")))
|
94
94
|
end
|
95
|
-
|
95
|
+
|
96
96
|
def doc
|
97
97
|
Redcar.app.focussed_window.focussed_notebook_tab.edit_view.document rescue false
|
98
98
|
end
|
@@ -107,11 +107,11 @@ class ProjectSearch
|
|
107
107
|
ProjectSearch.storage['recent_queries'] = add_or_move_to_top(query, ProjectSearch.storage['recent_queries'])
|
108
108
|
ProjectSearch.storage['match_case'] = (match_case == 'true')
|
109
109
|
ProjectSearch.storage['with_context'] = (with_context == 'true')
|
110
|
-
|
110
|
+
|
111
111
|
project = Redcar::Project::Manager.focussed_project
|
112
|
-
|
112
|
+
|
113
113
|
@word_search = WordSearch.new(project, query, match_case?, context_size)
|
114
|
-
|
114
|
+
|
115
115
|
# kill any existing running search to prevent memory bloat
|
116
116
|
Thread.kill(@thread) if @thread
|
117
117
|
@thread = nil
|
@@ -122,7 +122,7 @@ class ProjectSearch
|
|
122
122
|
line_num = 0
|
123
123
|
have_prepared_table = false
|
124
124
|
have_results = false
|
125
|
-
|
125
|
+
|
126
126
|
@word_search.on_file_results do |hits|
|
127
127
|
next unless hits.any?
|
128
128
|
have_results = true
|
@@ -130,26 +130,29 @@ class ProjectSearch
|
|
130
130
|
line_num += hits.length
|
131
131
|
set_file_count(file_num)
|
132
132
|
set_line_count(line_num)
|
133
|
-
|
134
|
-
|
133
|
+
|
135
134
|
unless have_prepared_table
|
136
135
|
prepare_results_table
|
137
136
|
have_prepared_table = true
|
138
137
|
end
|
139
138
|
|
139
|
+
file = hits.first.file
|
140
|
+
add_nav_link(file,hits.length)
|
141
|
+
|
142
|
+
|
140
143
|
file_html = render_file(binding)
|
141
144
|
escaped_file_html = escape_javascript(file_html)
|
142
145
|
execute("$('#results table tr:last').after(\"#{escaped_file_html}\");")
|
143
146
|
end
|
144
|
-
|
147
|
+
|
145
148
|
@word_search.generate_results
|
146
|
-
|
149
|
+
|
147
150
|
if have_results
|
148
151
|
remove_initial_blank_tr
|
149
152
|
else
|
150
153
|
render_no_results
|
151
154
|
end
|
152
|
-
|
155
|
+
|
153
156
|
hide_spinner
|
154
157
|
Thread.kill(@thread) if @thread
|
155
158
|
@thread = nil
|
@@ -160,29 +163,37 @@ class ProjectSearch
|
|
160
163
|
end
|
161
164
|
nil
|
162
165
|
end
|
163
|
-
|
166
|
+
|
164
167
|
def initialize_search_output
|
168
|
+
image_path = File.expand_path(File.join(plugin_root, %w(lib project_search images)))
|
165
169
|
execute("$('#cached_query').val(\"#{escape_javascript(@word_search.query_string)}\");")
|
166
|
-
execute("$('#results').html(\"<div id='no_results'>Searching
|
170
|
+
execute("$('#results').html(\"<div id='no_results'>Searching...<br/><img id='spinner' src='#{image_path}/spinner.gif' style='display:none;'/></div>\");")
|
167
171
|
execute("$('#spinner').show();")
|
168
172
|
execute("$('#results_summary').hide();")
|
169
173
|
execute("$('#file_results_count').html(0);")
|
170
174
|
execute("$('#line_results_count').html(0);")
|
171
175
|
end
|
172
|
-
|
176
|
+
|
173
177
|
def prepare_results_table
|
174
178
|
execute("if ($('#results table').size() == 0) { $('#results').html(\"<table><tr></tr></table>\"); }")
|
175
179
|
execute("if ($('#results_summary').first().is(':hidden')) { $('#results_summary').show(); }")
|
180
|
+
execute("$('#files_nav').html('<li></li>');")
|
176
181
|
end
|
177
|
-
|
182
|
+
|
178
183
|
def set_file_count(value)
|
179
184
|
execute("$('#file_results_count').html(\"#{value}\");")
|
180
185
|
end
|
181
|
-
|
186
|
+
|
182
187
|
def set_line_count(value)
|
183
188
|
execute("$('#line_results_count').html(\"#{value}\");")
|
184
189
|
end
|
185
|
-
|
190
|
+
|
191
|
+
def add_nav_link(file,hit_count)
|
192
|
+
file = File.basename(file)
|
193
|
+
link= file.gsub(/\.|:|\\|\//,"")
|
194
|
+
execute("$('#files_nav').append('<li><a id=\"link_#{link}\" class=\"file_link\">#{file} (#{hit_count})</a></li>');")
|
195
|
+
end
|
196
|
+
|
186
197
|
def remove_initial_blank_tr
|
187
198
|
execute("$('#results table tr:first').remove();")
|
188
199
|
end
|
@@ -191,7 +202,7 @@ class ProjectSearch
|
|
191
202
|
result = "<div id='no_results'>No results were found using the search terms you provided.</div>"
|
192
203
|
execute("$('#results').html(\"#{escape_javascript(result)}\");")
|
193
204
|
end
|
194
|
-
|
205
|
+
|
195
206
|
def hide_spinner
|
196
207
|
execute("$('#spinner').hide();")
|
197
208
|
end
|
metadata
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
name: redcar-dev
|
3
3
|
version: !ruby/object:Gem::Version
|
4
4
|
prerelease: 7
|
5
|
-
version: 0.12.
|
5
|
+
version: 0.12.13dev
|
6
6
|
platform: java
|
7
7
|
authors:
|
8
8
|
- Daniel Lucraft
|
@@ -10,7 +10,7 @@ autorequire:
|
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
12
|
|
13
|
-
date: 2011-08-
|
13
|
+
date: 2011-08-19 00:00:00 +01:00
|
14
14
|
default_executable:
|
15
15
|
dependencies:
|
16
16
|
- !ruby/object:Gem::Dependency
|
@@ -250,6 +250,7 @@ files:
|
|
250
250
|
- lib/redcar/ruby_extensions.rb
|
251
251
|
- lib/redcar/runner.rb
|
252
252
|
- lib/redcar/usage.rb
|
253
|
+
- lib/tasks/app-bundle.rake
|
253
254
|
- plugins/application/plugin.rb
|
254
255
|
- plugins/application/features/main_menu.feature
|
255
256
|
- plugins/application/features/navigation_history.feature
|
@@ -570,14 +571,6 @@ files:
|
|
570
571
|
- plugins/java/features/fixtures/lib/classes.jar
|
571
572
|
- plugins/java/features/support/env.rb
|
572
573
|
- plugins/java/lib/syntax_check/java.rb
|
573
|
-
- plugins/javascript/plugin.rb
|
574
|
-
- plugins/javascript/features/syntax_check_javascript.feature
|
575
|
-
- plugins/javascript/features/fixtures/test.js
|
576
|
-
- plugins/javascript/features/fixtures/test2.js
|
577
|
-
- plugins/javascript/features/step_definitions/javascript_steps.rb
|
578
|
-
- plugins/javascript/features/support/env.rb
|
579
|
-
- plugins/javascript/lib/syntax_check/javascript.rb
|
580
|
-
- plugins/javascript/vendor/jslint.js
|
581
574
|
- plugins/key_bindings/plugin.rb
|
582
575
|
- plugins/key_bindings/lib/key_bindings.rb
|
583
576
|
- plugins/key_bindings/spec/spec_helper.rb
|
@@ -608,17 +601,6 @@ files:
|
|
608
601
|
- plugins/macros/spec/spec_helper.rb
|
609
602
|
- plugins/macros/spec/macros/predictive/sequence_finder_spec.rb
|
610
603
|
- plugins/macros/views/macro_manager.html.erb
|
611
|
-
- plugins/mirah/plugin.rb
|
612
|
-
- plugins/mirah/README
|
613
|
-
- plugins/mirah/features/syntax_check_mirah.feature
|
614
|
-
- plugins/mirah/features/fixtures/test.mirah
|
615
|
-
- plugins/mirah/lib/mirah.rb
|
616
|
-
- plugins/mirah/lib/mirah/my_error_handler.rb
|
617
|
-
- plugins/mirah/lib/mirah/repl_mirror.rb
|
618
|
-
- plugins/mirah/lib/mirah/syntax_checker.rb
|
619
|
-
- plugins/mirah/spec/spec_helper.rb
|
620
|
-
- plugins/mirah/spec/mirah/repl_mirror_spec.rb
|
621
|
-
- plugins/mirah/vendor/mirah-parser.jar
|
622
604
|
- plugins/my_plugin/plugin.rb
|
623
605
|
- plugins/my_plugin/lib/my_plugin.rb
|
624
606
|
- plugins/open_default_app/plugin.rb
|
@@ -689,7 +671,6 @@ files:
|
|
689
671
|
- plugins/project/spec/project/adapters/remote_protocols/sftp_spec.rb
|
690
672
|
- plugins/project/views/bulk_rename.html.erb
|
691
673
|
- plugins/project_search/plugin.rb
|
692
|
-
- plugins/project_search/TODO.md
|
693
674
|
- plugins/project_search/features/word_search.feature
|
694
675
|
- plugins/project_search/features/support/env.rb
|
695
676
|
- plugins/project_search/lib/project_search.rb
|
File without changes
|
@@ -1,16 +0,0 @@
|
|
1
|
-
When /^I save the tab (\d+) times and wait (\d+) seconds each time$/ do |count,time|
|
2
|
-
count = count.to_i
|
3
|
-
time = time.to_i
|
4
|
-
(1..count).each do |i|
|
5
|
-
begin
|
6
|
-
When "I save the tab"
|
7
|
-
When "I wait #{time} seconds"
|
8
|
-
rescue => e
|
9
|
-
add_exception(e)
|
10
|
-
end
|
11
|
-
end
|
12
|
-
end
|
13
|
-
|
14
|
-
Then /^the tab should not have thrown SWT concurrency exceptions$/ do
|
15
|
-
exception_count.should == 0
|
16
|
-
end
|
@@ -1,18 +0,0 @@
|
|
1
|
-
After do
|
2
|
-
# Truncate the test file
|
3
|
-
File.open(File.expand_path("../../fixtures/test.js", __FILE__), "w")
|
4
|
-
@exceptions = 0
|
5
|
-
end
|
6
|
-
|
7
|
-
Before do
|
8
|
-
@exceptions = 0
|
9
|
-
end
|
10
|
-
|
11
|
-
def add_exception(e)
|
12
|
-
@exceptions = @exceptions + 1
|
13
|
-
p e.message
|
14
|
-
end
|
15
|
-
|
16
|
-
def exception_count
|
17
|
-
@exceptions
|
18
|
-
end
|
@@ -1,70 +0,0 @@
|
|
1
|
-
Feature: Syntax Checking for JavaScript
|
2
|
-
As a user
|
3
|
-
I want to get annotations on syntax errors in JavaScript files
|
4
|
-
#
|
5
|
-
# Background:
|
6
|
-
# When I have opened "plugins/javascript/features/fixtures/test.js"
|
7
|
-
#
|
8
|
-
# Scenario: A syntax-clean JavaScript file has no syntax error annotations
|
9
|
-
# When I replace the contents with "var foo = 1;"
|
10
|
-
# And I save the tab
|
11
|
-
# Then the tab should not have annotations
|
12
|
-
#
|
13
|
-
# Scenario: A syntax-error in a JavaScript file should cause syntax error annotations
|
14
|
-
# When I replace the contents with "var foo = 1;\nbar"
|
15
|
-
# And I save the tab
|
16
|
-
# And I wait 2 seconds
|
17
|
-
# Then the tab should have annotations
|
18
|
-
# And the tab should have an annotation on line 2
|
19
|
-
#
|
20
|
-
# Scenario: Fixing a syntax-error in a JavaScript file should cause syntax error annotations to vanish
|
21
|
-
# When I replace the contents with "var foo = 1;\nbar"
|
22
|
-
# And I save the tab
|
23
|
-
# And I wait 2 seconds
|
24
|
-
# Then the tab should have annotations
|
25
|
-
# When I replace the contents with "var foo = 1;\nvar bar;"
|
26
|
-
# And I save the tab
|
27
|
-
# Then the tab should not have annotations
|
28
|
-
#
|
29
|
-
# Scenario: Checking for syntax errors on a file with syntax errors should not cause concurrency errors
|
30
|
-
# When I replace the contents with "foo\nbar\nfunction\nbax\nboo\nbonne"
|
31
|
-
# And I save the tab 10 times and wait 2 seconds each time
|
32
|
-
# Then the tab should not have thrown SWT concurrency exceptions
|
33
|
-
#
|
34
|
-
# Scenario: Checking for syntax errors between two different error-throwing files should not cause concurrency errors
|
35
|
-
# When I replace the contents with "foo\nbar\nfunction\nbax\nboo\nbonne"
|
36
|
-
# And I have opened "plugins/javascript/features/fixtures/test2.js"
|
37
|
-
# And I replace the contents with "boo foo\nbaz\nbee\nbaux\nbeau"
|
38
|
-
# And I save the tab
|
39
|
-
# And I wait 1 seconds
|
40
|
-
# And I switch up a tab
|
41
|
-
# And I save the tab
|
42
|
-
# And I wait 1 seconds
|
43
|
-
# And I switch down a tab
|
44
|
-
# And I save the tab
|
45
|
-
# And I wait 1 seconds
|
46
|
-
# And I switch up a tab
|
47
|
-
# And I save the tab
|
48
|
-
# And I wait 1 seconds
|
49
|
-
# Then the tab should not have thrown SWT concurrency exceptions
|
50
|
-
# And the tab should have annotations
|
51
|
-
# When I switch down a tab
|
52
|
-
# Then the tab should have annotations
|
53
|
-
#
|
54
|
-
# Scenario: Checking rapidly for syntax errors between two files should not cause concurrency errors
|
55
|
-
# When I replace the contents with "foo\nbar\nfunction\nbax\nboo\nbonne"
|
56
|
-
# And I have opened "plugins/javascript/features/fixtures/test2.js"
|
57
|
-
# And I replace the contents with "boo foo\nbaz\nbee\nbaux\nbeau"
|
58
|
-
# And I save the tab
|
59
|
-
# And I switch up a tab
|
60
|
-
# And I save the tab
|
61
|
-
# And I switch down a tab
|
62
|
-
# And I save the tab
|
63
|
-
# And I switch up a tab
|
64
|
-
# And I save the tab
|
65
|
-
# And I wait 5 seconds
|
66
|
-
# Then the tab should not have thrown SWT concurrency exceptions
|
67
|
-
# And the tab should have annotations
|
68
|
-
# When I switch down a tab
|
69
|
-
# Then the tab should have annotations
|
70
|
-
#
|
@@ -1,58 +0,0 @@
|
|
1
|
-
|
2
|
-
module Redcar
|
3
|
-
module SyntaxCheck
|
4
|
-
class JavaScript < Checker
|
5
|
-
supported_grammars "JavaScript", "JavaScript (Rails)",
|
6
|
-
"jQuery (JavaScript)", "HTML"
|
7
|
-
|
8
|
-
def jslint_path
|
9
|
-
File.join(File.dirname(__FILE__),'..','..','vendor','jslint.js')
|
10
|
-
end
|
11
|
-
|
12
|
-
def rhino_path
|
13
|
-
File.join(Redcar.asset_dir,'js.jar')
|
14
|
-
end
|
15
|
-
|
16
|
-
def main_method
|
17
|
-
"org.mozilla.javascript.tools.shell.Main"
|
18
|
-
end
|
19
|
-
|
20
|
-
def check(*args)
|
21
|
-
path = manifest_path(doc)
|
22
|
-
name = File.basename(path)
|
23
|
-
if t = JavaScript.thread and t.alive?
|
24
|
-
if t[:doc] and t[:doc] == doc
|
25
|
-
t.exit
|
26
|
-
SyntaxCheck.remove_syntax_error_annotations(doc.edit_view)
|
27
|
-
end
|
28
|
-
end
|
29
|
-
JavaScript.thread=Thread.new do
|
30
|
-
SyntaxCheck.remove_syntax_error_annotations(doc.edit_view)
|
31
|
-
Thread.current[:doc] = doc
|
32
|
-
begin
|
33
|
-
output = `java -cp #{rhino_path} #{main_method} #{jslint_path} #{path}`
|
34
|
-
output.each_line do |line|
|
35
|
-
if line =~ /Lint at line (\d+) character (\d+): (.*)/
|
36
|
-
SyntaxCheck::Error.new(doc, $1.to_i-1, $3).annotate
|
37
|
-
sleep 1
|
38
|
-
end
|
39
|
-
end
|
40
|
-
rescue Object => e
|
41
|
-
SyntaxCheck.message(
|
42
|
-
"An error occurred while parsing #{name}: #{e.message}",:error)
|
43
|
-
end
|
44
|
-
end
|
45
|
-
end
|
46
|
-
|
47
|
-
private
|
48
|
-
|
49
|
-
def self.thread=(thread)
|
50
|
-
@thread=thread
|
51
|
-
end
|
52
|
-
|
53
|
-
def self.thread
|
54
|
-
@thread
|
55
|
-
end
|
56
|
-
end
|
57
|
-
end
|
58
|
-
end
|