grnline 0.0.1

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/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source "https://rubygems.org"
2
+
3
+ # Specify your gem's dependencies in grnline.gemspec
4
+ gemspec
data/LICENSE.txt ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2013 Haruka Yoshihara
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,37 @@
1
+ # Grnline
2
+
3
+ ## Description
4
+
5
+ GrnLine is the wrapper for the interactive mode of [groonga](http://groonga.org/).
6
+
7
+ GrnLine is created by Ruby.
8
+ This uses [grnwrap](https://github.com/michisu/grnwrap) as a
9
+ reference. grnwrap is created by Python.
10
+
11
+ ## Installation
12
+
13
+ ```
14
+ $ gem install grnline
15
+ ```
16
+
17
+ ## Usage
18
+
19
+ You can use the options of groonga as ones for grnline. For example,
20
+ you execute groonga with a new database:
21
+
22
+ $ grnline -n <groonga-db>
23
+
24
+ Then, grnline has the own options. Please see ```grnline -- -h```.
25
+ When you want to know groonga's options, please type ```grnline -h```.
26
+
27
+ ## Author
28
+
29
+ Haruka Yoshihara (yshr04hrk at gmail.com)
30
+
31
+ ## Contributing
32
+
33
+ 1. Fork it
34
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
35
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
36
+ 4. Push to the branch (`git push origin my-new-feature`)
37
+ 5. Create new Pull Request
data/Rakefile ADDED
@@ -0,0 +1,30 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ require "packnga"
4
+
5
+ base_dir = File.join(File.dirname(__FILE__))
6
+ lib_dir = File.join(base_dir, "lib")
7
+ $LOAD_PATH.unshift(lib_dir)
8
+ require "grnline/version"
9
+
10
+ helper = Bundler::GemHelper.new(base_dir)
11
+ helper.install
12
+ def helper.version_tag
13
+ version
14
+ end
15
+
16
+ spec = helper.gemspec
17
+
18
+ Packnga::DocumentTask.new(spec) do
19
+ end
20
+
21
+ Packnga::ReleaseTask.new(spec) do
22
+ end
23
+
24
+ desc "Run tests."
25
+ task :test do
26
+ ruby("test/run-test.rb")
27
+ end
28
+
29
+ task :default => :test
30
+
data/TODO ADDED
@@ -0,0 +1,2 @@
1
+ * Add tests
2
+ * Supports output format except JSON (MessagePack, XML...)
data/bin/grnline ADDED
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env ruby
2
+ # -*- coding: utf-8; mode: ruby -*-
3
+
4
+ require "grnline"
5
+
6
+ exit_status = GrnLine::Wrapper.new.run(ARGV)
7
+ exit_status = true if exit_status.nil?
8
+ exit(exit_status)
data/doc/text/news.md ADDED
@@ -0,0 +1,5 @@
1
+ # News
2
+
3
+ ## <a id="0-0-1">0.0.1</a>: 2013-05-31
4
+
5
+ The first release !
data/grnline.gemspec ADDED
@@ -0,0 +1,47 @@
1
+ # -*- coding: utf-8; mode: ruby -*-
2
+
3
+ base_dir = File.dirname(__FILE__)
4
+ $LOAD_PATH.unshift(File.expand_path("lib", base_dir))
5
+
6
+ require "grnline/version"
7
+ version = GrnLine::VERSION.dup
8
+
9
+ readme_path = File.join(base_dir, "README.md")
10
+ entries = File.read(readme_path).split(/^##\s(.*)$/)
11
+ entry = lambda do |entry_title|
12
+ entries[entries.index(entry_title) + 1]
13
+ end
14
+ clean_white_space = lambda do |entry|
15
+ entry.gsub(/(\A\n+|\n+\z)/, '') + "\n"
16
+ end
17
+
18
+ description = clean_white_space.call(entry.call("Description"))
19
+ summary, description = description.split(/\n\n+/, 2)
20
+
21
+ Gem::Specification.new do |spec|
22
+ spec.name = "grnline"
23
+ spec.version = version
24
+ spec.authors = ["Haruka Yoshihara"]
25
+ spec.email = ["yshr04hrk@gmail.com"]
26
+ spec.summary = summary
27
+ spec.description = description
28
+ spec.license = "MIT"
29
+
30
+ spec.files = ["README.md", "LICENSE.txt", "TODO"]
31
+ spec.files += ["Rakefile", "Gemfile", "grnline.gemspec"]
32
+ spec.files += Dir.glob("lib/**/*.rb")
33
+ spec.files += Dir.glob("doc/text/*.*")
34
+ spec.test_files = Dir.glob("test/**/*.rb")
35
+ Dir.chdir("bin") do
36
+ spec.executables = Dir.glob("*")
37
+ end
38
+ spec.require_paths = ["lib"]
39
+
40
+ spec.add_runtime_dependency("json")
41
+ spec.add_development_dependency("packnga")
42
+ spec.add_development_dependency("bundler")
43
+ spec.add_development_dependency("rake")
44
+ spec.add_development_dependency("test-unit")
45
+ spec.add_development_dependency("test-unit-notify")
46
+ spec.add_development_dependency("redcarpet")
47
+ end
@@ -0,0 +1,92 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ require "ostruct"
4
+ require "optparse"
5
+
6
+ module GrnLine
7
+ class OptionsParser
8
+
9
+ SEPARATOR = "--"
10
+
11
+ def initialize
12
+ @options = OpenStruct.new
13
+ @options.groonga = "groonga"
14
+ @options.pager = "less"
15
+ @options.groonga_arguments = []
16
+ @options.output = $stdout
17
+ @options.pretty_print = true
18
+ end
19
+
20
+ def parse(argv)
21
+ parser = generate_parser
22
+
23
+ if not argv.include?(SEPARATOR)
24
+ @options.groonga_arguments = argv
25
+ else
26
+ grnline_arguments, groonga_arguments = split_arguments(argv)
27
+
28
+ parser.parse!(grnline_arguments)
29
+ @options.groonga_arguments = groonga_arguments
30
+ end
31
+ @options
32
+ end
33
+
34
+ def split_arguments(argv)
35
+ grnline_arguments = []
36
+ groonga_arguments = []
37
+ separator_index = argv.index(SEPARATOR)
38
+
39
+ unless separator_index.zero?
40
+ groonga_arguments = argv[0 .. (separator_index - 1)]
41
+ end
42
+ grnline_arguments = argv[(separator_index + 1) .. -1]
43
+
44
+ [grnline_arguments, groonga_arguments]
45
+ end
46
+
47
+ def generate_parser
48
+ parser = OptionParser.new
49
+ banner = "Usage: #{$0} [groonga_options] -- [grnline_options]\n" +
50
+ " 'groonga_options' is options for groonga. " +
51
+ "Please type `groonga --help` for the details of them.\n" +
52
+ " grnline_options :"
53
+ parser.banner = banner
54
+
55
+ parser.on("-g", "--groonga=GROONGA",
56
+ "your groonga.",
57
+ "(#{@options.groonga})") do |groonga|
58
+ @options.groonga = groonga
59
+ end
60
+
61
+ parser.on("-p", "--[no-]pretty-print",
62
+ "Pretty print responses from groonga.",
63
+ "(#{@options.pretty_print})") do |pretty_print|
64
+ @options.pretty_print = pretty_print
65
+ end
66
+
67
+ # TODO: supports pager for displaying results from groonga
68
+ # parser.on("-p", "--pager=PAGER",
69
+ # "your pager using to display results.") do |pager|
70
+ # @options.pager = pager
71
+ # end
72
+
73
+ parser.on("--output=OUTPUT",
74
+ "Destination to output responses from groonga.",
75
+ "(STDOUT)") do |output|
76
+ @options.output = output
77
+ end
78
+
79
+ parser.on("-v", "--version", "Show version and exit.") do
80
+ puts(GrnLine::VERSION)
81
+ exit(true)
82
+ end
83
+
84
+ parser.on_tail("-h", "--help", "Show this message and exit.") do
85
+ puts(parser.help)
86
+ exit(true)
87
+ end
88
+
89
+ parser
90
+ end
91
+ end
92
+ end
@@ -0,0 +1,5 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ module GrnLine
4
+ VERSION = "0.0.1"
5
+ end
@@ -0,0 +1,159 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ require "readline"
4
+ require "json"
5
+ require "open3"
6
+ require "grnline/options-parser"
7
+
8
+ module GrnLine
9
+ class Wrapper
10
+ attr_accessor :options
11
+
12
+ GROONGA_COMMANDS = [
13
+ "cache_limit", "check", "clearlock", "column_create", "column_list",
14
+ "column_remove", "column_rename", "define_selector", "defrag",
15
+ "delete", "dump", "load", "log_level", "log_put", "log_reopen",
16
+ "quit", "register", "select", "shutdown", "status", "table_create",
17
+ "table_list", "table_remove", "table_rename", "truncate"
18
+ ]
19
+ GROONGA_SHUTDOWN_COMMANDS = ["quit", "shutdown"]
20
+
21
+ class << self
22
+ def run(argv)
23
+ new.run(argv)
24
+ end
25
+ end
26
+
27
+ def initialize
28
+ @options = nil
29
+ setup_input_completion
30
+ end
31
+
32
+ def run(argv)
33
+ @options = parse_commandline_options(argv)
34
+ groonga_commandline = generate_groonga_commandline
35
+
36
+ Open3.popen3(*groonga_commandline) do |input, output, error, _|
37
+ @input, @output, @error = input, output, error
38
+
39
+ return true unless ensure_groonga_running
40
+ return false unless ensure_groonga_ready
41
+
42
+ setup_interrupt_shutdown
43
+
44
+ while(command = Readline.readline("groonga> ", true)) do
45
+ process_command(command)
46
+ exit(true) if GROONGA_SHUTDOWN_COMMANDS.include?(command)
47
+ end
48
+
49
+ shutdown_groonga
50
+ end
51
+ end
52
+
53
+ private
54
+
55
+ def parse_commandline_options(argv)
56
+ options_parser = GrnLine::OptionsParser.new
57
+ options_parser.parse(argv)
58
+ end
59
+
60
+ def generate_groonga_commandline
61
+ [@options.groonga, *@options.groonga_arguments]
62
+ end
63
+
64
+ def process_command(command)
65
+ raw_response = nil
66
+ begin
67
+ raw_response = read_groonga_response(command)
68
+ rescue => e
69
+ raise("Failed to access the groonga database: #{e.message}")
70
+ end
71
+
72
+ if raw_response and not raw_response.empty?
73
+ # TODO: support pretty print for formats except JSON
74
+ output_response(raw_response)
75
+ end
76
+ end
77
+
78
+ def read_groonga_response(command)
79
+ return nil if command.empty?
80
+ response = ""
81
+
82
+ @input.puts(command)
83
+ @input.flush
84
+
85
+ timeout = 1
86
+ while IO.select([@output], [], [], timeout)
87
+ break if @output.eof?
88
+ read_content = @output.readpartial(1024)
89
+ response << read_content
90
+ timeout = 0 if read_content.bytesize < 1024
91
+ end
92
+
93
+ response
94
+ end
95
+
96
+ def output_response(raw_response)
97
+ # TODO: support pretty print for formats except JSON
98
+ response = raw_response
99
+ if @options.pretty_print
100
+ begin
101
+ response = JSON.pretty_generate(JSON.parse(response))
102
+ rescue
103
+ end
104
+ end
105
+
106
+ if @options.output.instance_of?(String)
107
+ File.open(@options.output, "w") do |file|
108
+ file.puts(response)
109
+ end
110
+ else
111
+ @options.output.puts(response)
112
+ end
113
+ end
114
+
115
+ def execute(command)
116
+ @input.puts(command)
117
+ @input.flush
118
+ @output.gets
119
+ end
120
+
121
+ def shutdown_groonga
122
+ execute("shutdown")
123
+ @input.close
124
+ end
125
+
126
+ def setup_interrupt_shutdown
127
+ trap("INT") do
128
+ shutdown_groonga
129
+ exit(true)
130
+ end
131
+ end
132
+
133
+ def setup_input_completion
134
+ Readline.completion_proc = lambda do |word|
135
+ GROONGA_COMMANDS.grep(/\A#{Regexp.escape(word)}/)
136
+ end
137
+ end
138
+
139
+ def ensure_groonga_running
140
+ if IO.select([@output], nil, nil, 1) and not @output.eof?
141
+ puts(@output.read)
142
+ return false
143
+ end
144
+ return true
145
+ end
146
+
147
+ def ensure_groonga_ready
148
+ begin
149
+ execute("status")
150
+ rescue
151
+ if IO.select([@error], [], [], 0)
152
+ $stderr.puts(@error.read)
153
+ return false
154
+ end
155
+ end
156
+ return true
157
+ end
158
+ end
159
+ end
data/lib/grnline.rb ADDED
@@ -0,0 +1,5 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ require "grnline/version"
4
+ require "grnline/wrapper"
5
+
data/test/run-test.rb ADDED
@@ -0,0 +1,24 @@
1
+ #!/usr/bin/env ruby
2
+ # -*- coding: utf-8 -*-
3
+
4
+ $VERBOSE = true
5
+
6
+ base_dir = File.expand_path(File.join(File.dirname(__FILE__), ".."))
7
+ lib_dir = File.join(base_dir, "lib")
8
+ test_dir = File.join(base_dir, "test")
9
+
10
+ require "test-unit"
11
+ require "test/unit/notify"
12
+
13
+ $LOAD_PATH.unshift(lib_dir)
14
+ $LOAD_PATH.unshift(base_dir)
15
+
16
+ $LOAD_PATH.unshift(test_dir)
17
+
18
+ Dir.glob("#{base_dir}/test/**/test{_,-}*.rb") do |file|
19
+ require file.gsub(/\.rb$/, "")
20
+ end
21
+
22
+ ENV["TEST_UNIT_MAX_DIFF_TARGET_STRING_SIZE"] ||= "5000"
23
+
24
+ exit(Test::Unit::AutoRunner.run)
@@ -0,0 +1,59 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ require "grnline/options-parser"
4
+
5
+ class OptionsParserTest < Test::Unit::TestCase
6
+ def setup
7
+ @parser = GrnLine::OptionsParser.new
8
+ @separator = [GrnLine::OptionsParser::SEPARATOR]
9
+ end
10
+
11
+ def test_pretty_print
12
+ argv = @separator + ["--no-pretty-print"]
13
+ options = @parser.parse(argv)
14
+
15
+ assert_options(options, :pretty_print => false)
16
+ end
17
+
18
+ def test_separator_in_both_arguments
19
+ groonga_arguments = ["-n", "db/db"]
20
+ argv = groonga_arguments + @separator + ["--output", "output_path"]
21
+ options = @parser.parse(argv)
22
+
23
+ assert_options(options,
24
+ :output => "output_path",
25
+ :groonga_arguments => groonga_arguments)
26
+ end
27
+
28
+ def test_separator_with_grnline_arguments_only
29
+ argv = @separator + ["--output", "output_path"]
30
+ options = @parser.parse(argv)
31
+
32
+ assert_options(options, :output => "output_path")
33
+ end
34
+
35
+ def test_separator_with_groonga_arguments_only
36
+ argv = ["-n", "db/db"]
37
+ options = @parser.parse(argv)
38
+ assert_options(options, :groonga_arguments => argv)
39
+ end
40
+
41
+ def test_no_arguments
42
+ argv = []
43
+ options = @parser.parse(argv)
44
+ assert_options(options, {})
45
+ end
46
+
47
+ private
48
+
49
+ def assert_options(options, expected_options)
50
+ output = expected_options[:output] || $stdout
51
+ groonga_arguments = expected_options[:groonga_arguments] || []
52
+ pretty_print = expected_options[:pretty_print]
53
+ pretty_print = true if pretty_print.nil?
54
+
55
+ assert_equal(output, options.output)
56
+ assert_equal(groonga_arguments, options.groonga_arguments)
57
+ assert_equal(pretty_print, options.pretty_print)
58
+ end
59
+ end
@@ -0,0 +1,60 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ require "grnline/wrapper"
4
+ require "stringio"
5
+ require "ostruct"
6
+
7
+ class TestWrapper < Test::Unit::TestCase
8
+ def setup
9
+ @grnline = GrnLine::Wrapper.new
10
+ @grnline.options = OpenStruct.new
11
+ @output = StringIO.new
12
+ end
13
+
14
+ class OutputResponseTest < self
15
+ def test_prerry_print
16
+ @grnline.options.pretty_print = true
17
+ @grnline.options.output = @output
18
+
19
+ @grnline.send(:output_response, raw_response)
20
+ assert_equal(pretty_response, @output.string)
21
+ end
22
+
23
+ def test_no_prerry_print
24
+ @grnline.options.pretty_print = false
25
+ @grnline.options.output = @output
26
+
27
+ @grnline.send(:output_response, raw_response)
28
+ assert_equal(raw_response, @output.string)
29
+ end
30
+ end
31
+
32
+ def raw_response
33
+ <<-RESPONSE
34
+ [[0,1369743525.62977,9.20295715332031e-05],{"alloc_count":129,"starttime":1369743522,"uptime":3,"version":"3.0.1","n_queries":0,"cache_hit_rate":0.0,"command_version":1,"default_command_version":1,"max_command_version":2}]
35
+ RESPONSE
36
+ end
37
+
38
+ def pretty_response
39
+ <<-RESPONSE
40
+ [
41
+ [
42
+ 0,
43
+ 1369743525.62977,
44
+ 9.20295715332031e-05
45
+ ],
46
+ {
47
+ "alloc_count": 129,
48
+ "starttime": 1369743522,
49
+ "uptime": 3,
50
+ "version": "3.0.1",
51
+ "n_queries": 0,
52
+ "cache_hit_rate": 0.0,
53
+ "command_version": 1,
54
+ "default_command_version": 1,
55
+ "max_command_version": 2
56
+ }
57
+ ]
58
+ RESPONSE
59
+ end
60
+ end
metadata ADDED
@@ -0,0 +1,190 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: grnline
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Haruka Yoshihara
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2013-05-31 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: json
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ! '>='
28
+ - !ruby/object:Gem::Version
29
+ version: '0'
30
+ - !ruby/object:Gem::Dependency
31
+ name: packnga
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ! '>='
36
+ - !ruby/object:Gem::Version
37
+ version: '0'
38
+ type: :development
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ! '>='
44
+ - !ruby/object:Gem::Version
45
+ version: '0'
46
+ - !ruby/object:Gem::Dependency
47
+ name: bundler
48
+ requirement: !ruby/object:Gem::Requirement
49
+ none: false
50
+ requirements:
51
+ - - ! '>='
52
+ - !ruby/object:Gem::Version
53
+ version: '0'
54
+ type: :development
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ! '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ - !ruby/object:Gem::Dependency
63
+ name: rake
64
+ requirement: !ruby/object:Gem::Requirement
65
+ none: false
66
+ requirements:
67
+ - - ! '>='
68
+ - !ruby/object:Gem::Version
69
+ version: '0'
70
+ type: :development
71
+ prerelease: false
72
+ version_requirements: !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - ! '>='
76
+ - !ruby/object:Gem::Version
77
+ version: '0'
78
+ - !ruby/object:Gem::Dependency
79
+ name: test-unit
80
+ requirement: !ruby/object:Gem::Requirement
81
+ none: false
82
+ requirements:
83
+ - - ! '>='
84
+ - !ruby/object:Gem::Version
85
+ version: '0'
86
+ type: :development
87
+ prerelease: false
88
+ version_requirements: !ruby/object:Gem::Requirement
89
+ none: false
90
+ requirements:
91
+ - - ! '>='
92
+ - !ruby/object:Gem::Version
93
+ version: '0'
94
+ - !ruby/object:Gem::Dependency
95
+ name: test-unit-notify
96
+ requirement: !ruby/object:Gem::Requirement
97
+ none: false
98
+ requirements:
99
+ - - ! '>='
100
+ - !ruby/object:Gem::Version
101
+ version: '0'
102
+ type: :development
103
+ prerelease: false
104
+ version_requirements: !ruby/object:Gem::Requirement
105
+ none: false
106
+ requirements:
107
+ - - ! '>='
108
+ - !ruby/object:Gem::Version
109
+ version: '0'
110
+ - !ruby/object:Gem::Dependency
111
+ name: redcarpet
112
+ requirement: !ruby/object:Gem::Requirement
113
+ none: false
114
+ requirements:
115
+ - - ! '>='
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ none: false
122
+ requirements:
123
+ - - ! '>='
124
+ - !ruby/object:Gem::Version
125
+ version: '0'
126
+ description: ! 'GrnLine is created by Ruby.
127
+
128
+ This uses [grnwrap](https://github.com/michisu/grnwrap) as a
129
+
130
+ reference. grnwrap is created by Python.
131
+
132
+ '
133
+ email:
134
+ - yshr04hrk@gmail.com
135
+ executables:
136
+ - grnline
137
+ extensions: []
138
+ extra_rdoc_files: []
139
+ files:
140
+ - README.md
141
+ - LICENSE.txt
142
+ - TODO
143
+ - Rakefile
144
+ - Gemfile
145
+ - grnline.gemspec
146
+ - lib/grnline/options-parser.rb
147
+ - lib/grnline/version.rb
148
+ - lib/grnline/wrapper.rb
149
+ - lib/grnline.rb
150
+ - doc/text/news.md
151
+ - test/run-test.rb
152
+ - test/test-options-parser.rb
153
+ - test/test-wrapper.rb
154
+ - bin/grnline
155
+ homepage:
156
+ licenses:
157
+ - MIT
158
+ post_install_message:
159
+ rdoc_options: []
160
+ require_paths:
161
+ - lib
162
+ required_ruby_version: !ruby/object:Gem::Requirement
163
+ none: false
164
+ requirements:
165
+ - - ! '>='
166
+ - !ruby/object:Gem::Version
167
+ version: '0'
168
+ segments:
169
+ - 0
170
+ hash: 1192488674147790038
171
+ required_rubygems_version: !ruby/object:Gem::Requirement
172
+ none: false
173
+ requirements:
174
+ - - ! '>='
175
+ - !ruby/object:Gem::Version
176
+ version: '0'
177
+ segments:
178
+ - 0
179
+ hash: 1192488674147790038
180
+ requirements: []
181
+ rubyforge_project:
182
+ rubygems_version: 1.8.23
183
+ signing_key:
184
+ specification_version: 3
185
+ summary: GrnLine is the wrapper for the interactive mode of [groonga](http://groonga.org/).
186
+ test_files:
187
+ - test/run-test.rb
188
+ - test/test-options-parser.rb
189
+ - test/test-wrapper.rb
190
+ has_rdoc: