redcar 0.10 → 0.11.0dev
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/CHANGES +14 -0
- data/Rakefile +68 -29
- data/lib/redcar.rb +2 -2
- data/plugins/application/lib/application/dialogs/filter_list_dialog.rb +2 -1
- data/plugins/application_swt/spec/application_swt/gradient_spec.rb +3 -12
- data/plugins/core/lib/core/resource.rb +13 -5
- data/plugins/document_search/features/find.feature +366 -214
- data/plugins/document_search/features/incremental_search.feature +351 -0
- data/plugins/document_search/features/replace.feature +16 -16
- data/plugins/document_search/features/step_definitions/find_steps.rb +16 -0
- data/plugins/document_search/features/support/env.rb +11 -0
- data/plugins/document_search/lib/document_search.rb +149 -109
- data/plugins/document_search/lib/document_search/commands.rb +251 -202
- data/plugins/document_search/lib/document_search/find_speedbar.rb +138 -81
- data/plugins/document_search/lib/document_search/incremental_search_speedbar.rb +70 -0
- data/plugins/document_search/lib/document_search/query_options.rb +15 -39
- data/plugins/document_search/plugin.rb +1 -1
- data/plugins/edit_view/features/step_definitions/editing_steps.rb +6 -2
- data/plugins/edit_view_swt/lib/edit_view_swt.rb +2 -2
- data/plugins/file_parser/lib/file_parser.rb +6 -1
- data/plugins/html_view/features/step_definitions/web_view_steps.rb +12 -0
- data/plugins/html_view/features/support/env.rb +16 -0
- data/plugins/html_view/lib/html_view.rb +5 -1
- data/plugins/line_tools/lib/line_tools.rb +16 -0
- data/plugins/project/features/find_file.feature +28 -0
- data/plugins/project/features/open_and_save_files.feature +11 -0
- data/plugins/project/features/step_definitions/file_steps.rb +6 -1
- data/plugins/project/features/support/env.rb +2 -0
- data/plugins/project/lib/project.rb +49 -6
- data/plugins/project/lib/project/commands.rb +18 -6
- data/plugins/project/lib/project/find_file_dialog.rb +19 -8
- data/plugins/project/lib/project/find_recent_dialog.rb +30 -0
- data/plugins/project/lib/project/manager.rb +41 -10
- data/plugins/project/lib/project/recent.rb +64 -0
- data/plugins/project/spec/fixtures/myproject/vendor/bar.rb +0 -0
- data/plugins/project/spec/fixtures/myproject/vendor/plugins/bar.rb +0 -0
- data/plugins/{find-in-project → project_search}/TODO.md +3 -3
- data/plugins/project_search/features/support/env.rb +6 -0
- data/plugins/project_search/features/word_search.feature +34 -0
- data/plugins/project_search/lib/project_search.rb +73 -0
- data/plugins/project_search/lib/project_search/binary_data_detector.rb +46 -0
- data/plugins/project_search/lib/project_search/commands.rb +62 -0
- data/plugins/project_search/lib/project_search/hit.rb +17 -0
- data/plugins/{find-in-project/lib/find_in_project → project_search/lib/project_search}/images/collapsed.png +0 -0
- data/plugins/{find-in-project/lib/find_in_project → project_search/lib/project_search}/images/expanded.png +0 -0
- data/plugins/{find-in-project/lib/find_in_project → project_search/lib/project_search}/images/spinner.gif +0 -0
- data/plugins/project_search/lib/project_search/lucene_index.rb +64 -0
- data/plugins/project_search/lib/project_search/lucene_refresh.rb +22 -0
- data/plugins/project_search/lib/project_search/project.rb +14 -0
- data/plugins/project_search/lib/project_search/query.rb +29 -0
- data/plugins/{find-in-project/lib/find_in_project → project_search/lib/project_search}/stylesheets/style.css +14 -3
- data/plugins/project_search/lib/project_search/views/_file.html.erb +60 -0
- data/plugins/{find-in-project/lib/find_in_project → project_search/lib/project_search}/views/index.html.erb +12 -9
- data/plugins/project_search/lib/project_search/word_search.rb +105 -0
- data/plugins/project_search/lib/project_search/word_search_controller.rb +207 -0
- data/plugins/project_search/plugin.rb +8 -0
- data/plugins/project_search/spec/fixtures/project/binary_file.bin +0 -0
- data/plugins/project_search/spec/fixtures/project/foo.txt +43 -0
- data/plugins/project_search/spec/fixtures/project/qux.rb +3 -0
- data/plugins/project_search/spec/project_search/binary_data_detector_spec.rb +24 -0
- data/plugins/project_search/spec/project_search/word_search_spec.rb +157 -0
- data/plugins/project_search/spec/spec_helper.rb +27 -0
- data/plugins/redcar/redcar.rb +77 -71
- data/plugins/ruby/lib/ruby/syntax_checker.rb +1 -1
- data/plugins/snippets/features/snippets.feature +12 -0
- data/plugins/snippets/lib/snippets/tab_handler.rb +1 -1
- metadata +46 -25
- data/plugins/document_search/features/find_and_replace.feature +0 -723
- data/plugins/document_search/lib/document_search/find_and_replace_speedbar.rb +0 -142
- data/plugins/find-in-project/lib/find_in_project.rb +0 -35
- data/plugins/find-in-project/lib/find_in_project/commands.rb +0 -30
- data/plugins/find-in-project/lib/find_in_project/controllers.rb +0 -170
- data/plugins/find-in-project/lib/find_in_project/views/_divider.html.erb +0 -4
- data/plugins/find-in-project/lib/find_in_project/views/_file_heading.html.erb +0 -10
- data/plugins/find-in-project/lib/find_in_project/views/_file_line.html.erb +0 -6
- data/plugins/find-in-project/plugin.rb +0 -11
- data/plugins/project/lib/project/recent_directories.rb +0 -54
@@ -0,0 +1,64 @@
|
|
1
|
+
module Redcar
|
2
|
+
class Project
|
3
|
+
# Purpose of this class is to have a menu that shows the 10 most recent opened files and directories
|
4
|
+
# This way users can quickly go to files and directories they have recently opened, or use frequently
|
5
|
+
class Recent
|
6
|
+
|
7
|
+
# Create menus for recent files and directories
|
8
|
+
def self.storage
|
9
|
+
@storage ||= begin
|
10
|
+
storage = Plugin::Storage.new('recent')
|
11
|
+
storage.set_default('list', [])
|
12
|
+
storage.set_default('max_list_length', 100)
|
13
|
+
storage.set_default('max_recent_menu_length', 10)
|
14
|
+
storage
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
def self.generate_menu(builder)
|
19
|
+
recent = storage['list']
|
20
|
+
count = 0
|
21
|
+
recent.each do |path|
|
22
|
+
if count >= storage['max_recent_menu_length']
|
23
|
+
break
|
24
|
+
end
|
25
|
+
count = count.next
|
26
|
+
|
27
|
+
if File.exist?(File.expand_path(path))
|
28
|
+
if File.directory?(path)
|
29
|
+
builder.item(File.basename(path) + "/") do
|
30
|
+
Project::Manager.open_project_for_path(path)
|
31
|
+
end
|
32
|
+
elsif File.file?(File.expand_path(path))
|
33
|
+
builder.item(File.basename(path)) do
|
34
|
+
Project::Manager.open_file(path)
|
35
|
+
end
|
36
|
+
else
|
37
|
+
remove_path(path)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
|
44
|
+
# Stores the given path to the text file, to appear in the recents menu.
|
45
|
+
#
|
46
|
+
# @param [String] path the path of a file or directory to be saved
|
47
|
+
def self.store_path(path)
|
48
|
+
path = File.expand_path(path)
|
49
|
+
storage["list"].delete(path)
|
50
|
+
storage["list"].unshift(path)
|
51
|
+
if storage["list"].length == storage['max_list_length'] + 1
|
52
|
+
storage["list"].pop
|
53
|
+
end
|
54
|
+
storage.save
|
55
|
+
end
|
56
|
+
|
57
|
+
def self.remove_path(path)
|
58
|
+
path = File.expand_path(path)
|
59
|
+
storage["list"].delete(path)
|
60
|
+
storage.save
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
File without changes
|
File without changes
|
@@ -1,11 +1,11 @@
|
|
1
|
-
* Speed
|
1
|
+
* Speed up regex search (in particular, with context). Stats below.
|
2
2
|
|
3
3
|
Searching for "redcar" in the Redcar source code:
|
4
4
|
- Without Context:
|
5
5
|
- Textmate AckMate: ~2 seconds
|
6
|
-
- Redcar
|
6
|
+
- Redcar regex search: ~50 seconds
|
7
7
|
- With Context:
|
8
8
|
- Textmate AckMate: ~4 seconds
|
9
|
-
- Redcar
|
9
|
+
- Redcar regex search: ~5 minutes
|
10
10
|
|
11
11
|
* Per-project settings
|
@@ -0,0 +1,34 @@
|
|
1
|
+
Feature: Word search
|
2
|
+
As a user
|
3
|
+
I want to search for the occurrences of complete words in my project
|
4
|
+
|
5
|
+
Background:
|
6
|
+
Given I will choose "plugins/project_search/spec/fixtures/project" from the "open_directory" dialog
|
7
|
+
And I open a directory
|
8
|
+
When I open the "Word Search" from the "Project" menu
|
9
|
+
And I wait "3" seconds
|
10
|
+
|
11
|
+
Scenario: See the search interface
|
12
|
+
Then I should see "Search for complete words only" in the web view
|
13
|
+
|
14
|
+
Scenario: Run a search
|
15
|
+
When I fill in "#query" with "foo" in the web view
|
16
|
+
And I press "Find In Project" in the web view
|
17
|
+
Then I should see "foo bar baz" in the web view
|
18
|
+
|
19
|
+
#Scenario: Opening the TODO list shows the todo items and their action texts without colons
|
20
|
+
# Then the HTML tab should say "a course of action"
|
21
|
+
# And the HTML tab should not say ": a course of action"
|
22
|
+
#
|
23
|
+
#Scenario: Opening the TODO list shows the todo item's file names
|
24
|
+
# Then the HTML tab should say "OPTIMIZE_colon.file"
|
25
|
+
# And the HTML tab should say "FIXME.file"
|
26
|
+
#
|
27
|
+
#Scenario: Opening the TODO list shows the todo item's line numbers
|
28
|
+
# Then the HTML tab should say "OPTIMIZE_colon.file:1"
|
29
|
+
# And the HTML tab should say "FIXME.file:3"
|
30
|
+
#
|
31
|
+
#Scenario: Clicking a TODO item's file name should open it in an edit tab
|
32
|
+
# When I click "FIXME.file" in the HTML tab
|
33
|
+
# Then my active tab should be "FIXME.file"
|
34
|
+
# And the contents should be "#\n#\n<c># FIXME note"
|
@@ -0,0 +1,73 @@
|
|
1
|
+
|
2
|
+
$:.push(File.dirname(__FILE__) + "/../vendor/lucene/lib")
|
3
|
+
require 'lucene'
|
4
|
+
|
5
|
+
require 'project_search/word_search_controller'
|
6
|
+
require 'project_search/lucene_index'
|
7
|
+
require 'project_search/lucene_refresh'
|
8
|
+
require 'project_search/binary_data_detector'
|
9
|
+
require 'project_search/commands'
|
10
|
+
require 'project_search/hit'
|
11
|
+
require 'project_search/word_search'
|
12
|
+
|
13
|
+
class ProjectSearch
|
14
|
+
def self.menus
|
15
|
+
Redcar::Menu::Builder.build do
|
16
|
+
sub_menu "Project" do
|
17
|
+
group :priority => 1 do
|
18
|
+
item "Search", :command => ProjectSearch::WordSearchCommand
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
def self.keymaps
|
25
|
+
osx = Redcar::Keymap.build("main", :osx) do
|
26
|
+
link "Cmd+Shift+F", ProjectSearch::WordSearchCommand
|
27
|
+
end
|
28
|
+
linwin = Redcar::Keymap.build("main", [:linux, :windows]) do
|
29
|
+
link "Ctrl+Shift+F", ProjectSearch::WordSearchCommand
|
30
|
+
end
|
31
|
+
[osx, linwin]
|
32
|
+
end
|
33
|
+
|
34
|
+
def self.toolbars
|
35
|
+
Redcar::ToolBar::Builder.build do
|
36
|
+
item "Search", :command => WordSearchCommand,
|
37
|
+
:icon => File.join(Redcar::ICONS_DIRECTORY, "application-search-result.png"),
|
38
|
+
:barname => :project
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
def self.storage
|
43
|
+
@storage ||= begin
|
44
|
+
storage = Redcar::Plugin::Storage.new('find_in_project')
|
45
|
+
storage.set_default('recent_queries', [])
|
46
|
+
storage.set_default('excluded_dirs', ['.git', '.svn', '.redcar'])
|
47
|
+
storage.set_default('excluded_files', [])
|
48
|
+
storage.set_default('excluded_patterns', [/tags$/, /\.log$/])
|
49
|
+
storage.set_default('literal_match', false)
|
50
|
+
storage.set_default('match_case', false)
|
51
|
+
storage.set_default('with_context', false)
|
52
|
+
storage.set_default('context_lines', 2)
|
53
|
+
storage.save
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
Lucene::Config.use do |config|
|
58
|
+
config[:store_on_file] = true
|
59
|
+
config[:storage_path] = ""
|
60
|
+
config[:id_field] = :id
|
61
|
+
end
|
62
|
+
|
63
|
+
|
64
|
+
def self.project_refresh_task_type
|
65
|
+
LuceneRefresh
|
66
|
+
end
|
67
|
+
|
68
|
+
def self.indexes
|
69
|
+
@indexes ||= {}
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
|
@@ -0,0 +1,46 @@
|
|
1
|
+
|
2
|
+
class ProjectSearch
|
3
|
+
# This class discriminates between binary and textual data.
|
4
|
+
class BinaryDataDetector
|
5
|
+
# Is the data binary?
|
6
|
+
#
|
7
|
+
# @param [String] data
|
8
|
+
def self.binary?(data)
|
9
|
+
not textual?(data)
|
10
|
+
end
|
11
|
+
|
12
|
+
# Is the data plain text?
|
13
|
+
#
|
14
|
+
# @param [String] data
|
15
|
+
def self.textual?(data)
|
16
|
+
found_good_byte = false
|
17
|
+
data.each_byte do |b|
|
18
|
+
return false if bad_byte?(b)
|
19
|
+
found_good_byte = found_good_byte || good_byte?(b)
|
20
|
+
end
|
21
|
+
found_good_byte
|
22
|
+
end
|
23
|
+
|
24
|
+
INDIVIDUAL_GOOD_BYTES = [9, 10, 13]
|
25
|
+
|
26
|
+
# At least one of these good bytes must be found for the text to be
|
27
|
+
# discriminated as plain text.
|
28
|
+
#
|
29
|
+
# @param [Fixnum] byte
|
30
|
+
def self.good_byte?(byte)
|
31
|
+
(byte >= 32 and byte <= 255) or INDIVIDUAL_GOOD_BYTES.include?(byte)
|
32
|
+
end
|
33
|
+
|
34
|
+
INDIVIDUAL_BAD_BYTES = [0, 6, 14]
|
35
|
+
|
36
|
+
# If any of these bytes are found then we immediately discriminate the data
|
37
|
+
# as binary.
|
38
|
+
#
|
39
|
+
# @param [Fixnum] byte
|
40
|
+
def self.bad_byte?(byte)
|
41
|
+
(byte >= 14 and byte <= 31) or INDIVIDUAL_BAD_BYTES.include?(byte)
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
|
@@ -0,0 +1,62 @@
|
|
1
|
+
|
2
|
+
class ProjectSearch
|
3
|
+
class WordSearchCommand < Redcar::Command
|
4
|
+
sensitize :open_project
|
5
|
+
|
6
|
+
def find_open_instance
|
7
|
+
all_tabs = Redcar.app.focussed_window.notebooks.map { |nb| nb.tabs }.flatten
|
8
|
+
all_tabs.find do |t|
|
9
|
+
t.is_a?(Redcar::HtmlTab) && t.title == ProjectSearch::WordSearchController::TITLE
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
def execute
|
14
|
+
if project = Redcar::Project::Manager.focussed_project
|
15
|
+
if (tab = find_open_instance)
|
16
|
+
tab.html_view.refresh
|
17
|
+
tab.focus
|
18
|
+
else
|
19
|
+
index = ProjectSearch.indexes[project.path]
|
20
|
+
if index and index.has_content?
|
21
|
+
tab = win.new_tab(Redcar::HtmlTab)
|
22
|
+
tab.html_view.controller = ProjectSearch::WordSearchController.new
|
23
|
+
tab.focus
|
24
|
+
else
|
25
|
+
Redcar::Application::Dialog.message_box("Your project is still being indexed.", :type => :error)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
else
|
29
|
+
Redcar::Application::Dialog.message_box("You need an open project to be able to use Find In Project!", :type => :error)
|
30
|
+
end
|
31
|
+
return
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
class RegexSearchCommand < Redcar::Command
|
36
|
+
sensitize :open_project
|
37
|
+
|
38
|
+
def execute
|
39
|
+
if Redcar::Project::Manager.focussed_project
|
40
|
+
if (tab = find_open_instance)
|
41
|
+
tab.html_view.controller = tab.html_view.controller # refresh
|
42
|
+
else
|
43
|
+
tab = win.new_tab(Redcar::HtmlTab)
|
44
|
+
tab.html_view.controller = ProjectSearch::RegexSearchController.new
|
45
|
+
end
|
46
|
+
tab.focus
|
47
|
+
else
|
48
|
+
# warning
|
49
|
+
Redcar::Application::Dialog.message_box("You need an open project to be able to use Find In Project!", :type => :error)
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
private
|
54
|
+
|
55
|
+
def find_open_instance
|
56
|
+
all_tabs = Redcar.app.focussed_window.notebooks.map { |nb| nb.tabs }.flatten
|
57
|
+
all_tabs.find do |t|
|
58
|
+
t.is_a?(Redcar::HtmlTab) && t.title == ProjectSearch::RegexSearchController.new.title
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
|
2
|
+
class ProjectSearch
|
3
|
+
class Hit
|
4
|
+
attr_reader :file, :line_num, :pre_context, :post_context
|
5
|
+
|
6
|
+
def initialize(file, line_num, line, regex,
|
7
|
+
pre_context, post_context)
|
8
|
+
@file, @line_num, @line, @regex = file, line_num, line, regex
|
9
|
+
@pre_context = pre_context
|
10
|
+
@post_context = post_context
|
11
|
+
end
|
12
|
+
|
13
|
+
def line(start_with=nil, end_with=nil)
|
14
|
+
@line.gsub(@regex) { start_with.to_s + $& + end_with.to_s }
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
File without changes
|
File without changes
|
File without changes
|
@@ -0,0 +1,64 @@
|
|
1
|
+
|
2
|
+
class ProjectSearch
|
3
|
+
class LuceneIndex
|
4
|
+
attr_accessor :last_updated, :lucene_index
|
5
|
+
|
6
|
+
def initialize(project)
|
7
|
+
@project = project
|
8
|
+
@has_content = false
|
9
|
+
load
|
10
|
+
end
|
11
|
+
|
12
|
+
def timestamp_file_path
|
13
|
+
File.join(@project.config_dir, 'lucene_last_updated')
|
14
|
+
end
|
15
|
+
|
16
|
+
def load
|
17
|
+
@last_updated = Time.at(0)
|
18
|
+
if File.exist?(timestamp_file_path)
|
19
|
+
@last_updated = Time.at(File.read(timestamp_file_path).chomp.to_i)
|
20
|
+
@has_content = true
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
def dump
|
25
|
+
File.open(timestamp_file_path, "w") do |fout|
|
26
|
+
fout.puts(last_updated.to_i.to_s)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
def has_content?
|
31
|
+
@has_content
|
32
|
+
end
|
33
|
+
|
34
|
+
def update
|
35
|
+
changed_files = @project.file_list.changed_since(last_updated)
|
36
|
+
@last_updated = Time.now
|
37
|
+
changed_files.reject! do |fn, ts|
|
38
|
+
fn.index(@project.config_dir)
|
39
|
+
end
|
40
|
+
Lucene::Transaction.run do
|
41
|
+
@lucene_index ||= Lucene::Index.new(File.join(@project.config_dir, "lucene"))
|
42
|
+
begin
|
43
|
+
@lucene_index.field_infos[:contents][:store] = true
|
44
|
+
@lucene_index.field_infos[:contents][:tokenized] = true
|
45
|
changed_files.each do |fn, ts|
|
46
|
+
unless File.basename(fn)[0..0] == "." or fn.include?(".git")
|
47
|
+
contents = File.read(fn)
|
48
|
+
unless BinaryDataDetector.binary?(contents[0..200])
|
49
|
+
adjusted_contents = contents.gsub(/\.([^\s])/, '. \1')
|
50
|
+
@lucene_index << { :id => fn, :contents => adjusted_contents }
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
@lucene_index.commit
|
55
|
+
@has_content = true
|
56
|
+
rescue => e
|
57
|
+
puts e.message
|
58
|
+
puts e.backtrace
|
59
|
+
end
|
60
|
+
end
|
61
|
+
dump
|
62
|
+
end
|
63
|
+
|
64
|
+
end
|
65
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
|
2
|
+
class ProjectSearch
|
3
|
+
|
4
|
+
class LuceneRefresh < Redcar::Task
|
5
|
+
def initialize(project)
|
6
|
+
@project = project
|
7
|
+
end
|
8
|
+
|
9
|
+
def description
|
10
|
+
"#{@project.path}: refresh index"
|
11
|
+
end
|
12
|
+
|
13
|
+
def execute
|
14
|
+
return if @project.remote?
|
15
|
+
unless index = ProjectSearch.indexes[@project.path]
|
16
|
+
index = ProjectSearch::LuceneIndex.new(@project)
|
17
|
+
ProjectSearch.indexes[@project.path] = index
|
18
|
+
end
|
19
|
+
index.update
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
|
2
|
+
module Redcar
|
3
|
+
class Project
|
4
|
+
def search(query, options)
|
5
|
+
options ||= {}
|
6
|
+
|
7
|
+
strategy = (options[:regex] || false) ? RegexSearch : WordSearch
|
8
|
+
match_case = options[:match_case] || true
|
9
|
+
context = options[:context] || 0
|
10
|
+
|
11
|
+
strategy.new(ProjectSearch.indexes[self], query, match_case, context)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
|
2
|
+
class ProjectSearch
|
3
|
+
class Query
|
4
|
+
attr_reader :query_string
|
5
|
+
|
6
|
+
# Construct a
|
7
|
+
#
|
8
|
+
#
|
9
|
+
def initialize(project, query_string, regex, match_case, context)
|
10
|
+
@project = project
|
11
|
+
@query_string = query_string
|
12
|
+
@regex = regex
|
13
|
+
@match_case = match_case
|
14
|
+
@context = context
|
15
|
+
end
|
16
|
+
|
17
|
+
def match_case?
|
18
|
+
@match_case
|
19
|
+
end
|
20
|
+
|
21
|
+
def context
|
22
|
+
@context
|
23
|
+
end
|
24
|
+
|
25
|
+
def regex?
|
26
|
+
@regex
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|