groonga-command-parser 1.1.5 → 1.1.7
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.
- checksums.yaml +4 -4
- data/Gemfile +15 -2
- data/doc/text/news.md +16 -0
- data/groonga-command-parser.gemspec +2 -9
- data/lib/groonga/command/parser/load-values-parser.rb +30 -74
- data/lib/groonga/command/parser/version.rb +2 -2
- data/lib/groonga/command/parser.rb +9 -2
- data/test/groonga-command-parser-test-utils.rb +2 -4
- data/test/test-load-value-parser.rb +2 -1
- data/test/test-parser.rb +5 -3
- metadata +6 -93
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: d1c7ab070f9742299d45da97516fb76767ce62259830b13d8a73ce0ccdcc25cb
|
|
4
|
+
data.tar.gz: 5aef3400a00b4b77a91705e1293874a33ad838b81823f9308a30a0edb73aa754
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 18f975cff3610220604ffea180db48324daad2d46d55943b727e91ba44fa4438077d0bcc25f810b9fe4f820d9f47312dc28cb9042bdcd7edc243db46ae8cdaa7
|
|
7
|
+
data.tar.gz: cec4a3661c62a357642be784c5050ed042a56be5805b9d6dc23aa178b61ca6bf111777eef702ded1dce44c637fa21f55f13cd6f1e5a3b7afc8c0626d425dc220
|
data/Gemfile
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
# -*-
|
|
1
|
+
# -*- ruby -*-
|
|
2
2
|
#
|
|
3
|
-
# Copyright (C) 2012 Kouhei
|
|
3
|
+
# Copyright (C) 2012-2026 Sutou Kouhei <kou@clear-code.com>
|
|
4
4
|
#
|
|
5
5
|
# This library is free software; you can redistribute it and/or
|
|
6
6
|
# modify it under the terms of the GNU Lesser General Public
|
|
@@ -19,3 +19,16 @@
|
|
|
19
19
|
source "https://rubygems.org/"
|
|
20
20
|
|
|
21
21
|
gemspec
|
|
22
|
+
|
|
23
|
+
gem "json", git: "https://github.com/ruby/json.git"
|
|
24
|
+
|
|
25
|
+
group :development do
|
|
26
|
+
gem "kramdown"
|
|
27
|
+
gem "packnga"
|
|
28
|
+
gem "rake"
|
|
29
|
+
gem "yard"
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
group :test do
|
|
33
|
+
gem "test-unit"
|
|
34
|
+
end
|
data/doc/text/news.md
CHANGED
|
@@ -1,5 +1,21 @@
|
|
|
1
1
|
# News
|
|
2
2
|
|
|
3
|
+
## 1.1.7: 2026-06-26
|
|
4
|
+
|
|
5
|
+
### Fixes
|
|
6
|
+
|
|
7
|
+
* `load`: Removed trailing spaces in data. This was a backward
|
|
8
|
+
incompatible change in 1.1.6. This change restored the previous
|
|
9
|
+
behavior.
|
|
10
|
+
|
|
11
|
+
## 1.1.6: 2026-06-25
|
|
12
|
+
|
|
13
|
+
### Improvements
|
|
14
|
+
|
|
15
|
+
* Migrated to json gem from json-stream gem.
|
|
16
|
+
|
|
17
|
+
* Dropped support for Ruby 2.6.
|
|
18
|
+
|
|
3
19
|
## 1.1.5: 2024-12-24
|
|
4
20
|
|
|
5
21
|
### Improvements
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# -*- mode: ruby -*-
|
|
2
2
|
#
|
|
3
|
-
# Copyright (C) 2012-
|
|
3
|
+
# Copyright (C) 2012-2026 Sutou Kouhei <kou@clear-code.com>
|
|
4
4
|
#
|
|
5
5
|
# This library is free software; you can redistribute it and/or
|
|
6
6
|
# modify it under the terms of the GNU Lesser General Public
|
|
@@ -53,13 +53,6 @@ Gem::Specification.new do |spec|
|
|
|
53
53
|
spec.require_paths = ["lib"]
|
|
54
54
|
|
|
55
55
|
spec.add_runtime_dependency("groonga-command", ">= 1.4.0")
|
|
56
|
-
spec.add_runtime_dependency("json
|
|
57
|
-
|
|
58
|
-
spec.add_development_dependency("test-unit")
|
|
59
|
-
spec.add_development_dependency("rake")
|
|
60
|
-
spec.add_development_dependency("bundler")
|
|
61
|
-
spec.add_development_dependency("packnga")
|
|
62
|
-
spec.add_development_dependency("yard")
|
|
63
|
-
spec.add_development_dependency("kramdown")
|
|
56
|
+
spec.add_runtime_dependency("json", ">= 2.20.0")
|
|
64
57
|
end
|
|
65
58
|
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# Copyright (C) 2015-
|
|
1
|
+
# Copyright (C) 2015-2026 Sutou Kouhei <kou@clear-code.com>
|
|
2
2
|
#
|
|
3
3
|
# This library is free software; you can redistribute it and/or
|
|
4
4
|
# modify it under the terms of the GNU Lesser General Public
|
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
# License along with this library; if not, write to the Free Software
|
|
15
15
|
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
|
16
16
|
|
|
17
|
-
require "json
|
|
17
|
+
require "json"
|
|
18
18
|
|
|
19
19
|
module Groonga
|
|
20
20
|
module Command
|
|
@@ -24,35 +24,44 @@ module Groonga
|
|
|
24
24
|
attr_writer :on_consumed
|
|
25
25
|
attr_writer :on_end
|
|
26
26
|
def initialize
|
|
27
|
-
|
|
27
|
+
@parser = JSON::ResumableParser.new
|
|
28
28
|
@on_value = nil
|
|
29
29
|
@on_consumed = nil
|
|
30
30
|
@on_end = nil
|
|
31
|
-
@
|
|
32
|
-
@keys = []
|
|
31
|
+
@n_processed_values = 0
|
|
33
32
|
end
|
|
34
33
|
|
|
35
34
|
def <<(data)
|
|
36
35
|
data_size = data.bytesize
|
|
37
36
|
return self if data_size.zero?
|
|
38
37
|
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
38
|
+
@parser << data
|
|
39
|
+
begin
|
|
40
|
+
done = @parser.parse
|
|
41
|
+
rescue JSON::ParserError => error
|
|
42
|
+
consumed = data_size - @parser.rest.bytesize
|
|
43
|
+
raise Error.new(error.message,
|
|
44
|
+
data[0, consumed],
|
|
45
|
+
data[consumed..-1])
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
if done
|
|
49
|
+
@parser.value[@n_processed_values..-1].each do |value|
|
|
50
|
+
@on_value.call(value)
|
|
51
|
+
end
|
|
52
|
+
@n_processed_values = 0
|
|
53
|
+
else
|
|
54
|
+
partial_value = @parser.partial_value
|
|
55
|
+
if partial_value
|
|
56
|
+
partial_value[@n_processed_values..-2].each do |value|
|
|
57
|
+
@on_value.call(value)
|
|
58
|
+
end
|
|
59
|
+
@n_processed_values = partial_value.size - 1
|
|
50
60
|
end
|
|
51
|
-
:continue
|
|
52
61
|
end
|
|
53
62
|
|
|
54
|
-
|
|
55
|
-
consumed
|
|
63
|
+
consumed = data.bytesize
|
|
64
|
+
consumed -= @parser.rest.bytesize if done
|
|
56
65
|
if consumed > 0
|
|
57
66
|
if consumed < data_size
|
|
58
67
|
@on_consumed.call(data[0, consumed])
|
|
@@ -60,7 +69,8 @@ module Groonga
|
|
|
60
69
|
@on_consumed.call(data)
|
|
61
70
|
end
|
|
62
71
|
end
|
|
63
|
-
|
|
72
|
+
|
|
73
|
+
if done
|
|
64
74
|
if consumed < data_size
|
|
65
75
|
@on_end.call(data[consumed..-1])
|
|
66
76
|
else
|
|
@@ -70,60 +80,6 @@ module Groonga
|
|
|
70
80
|
|
|
71
81
|
self
|
|
72
82
|
end
|
|
73
|
-
|
|
74
|
-
private
|
|
75
|
-
def initialize_parser
|
|
76
|
-
@parser = JSON::Stream::Parser.new
|
|
77
|
-
@parser.singleton_class.__send__(:attr_reader, :pos)
|
|
78
|
-
@parser.end_document do
|
|
79
|
-
throw(@tag, :done)
|
|
80
|
-
end
|
|
81
|
-
@parser.start_object do
|
|
82
|
-
push_container({})
|
|
83
|
-
end
|
|
84
|
-
@parser.end_object do
|
|
85
|
-
pop_container
|
|
86
|
-
end
|
|
87
|
-
@parser.start_array do
|
|
88
|
-
push_container([])
|
|
89
|
-
end
|
|
90
|
-
@parser.end_array do
|
|
91
|
-
pop_container
|
|
92
|
-
end
|
|
93
|
-
@parser.key do |key|
|
|
94
|
-
push_key(key)
|
|
95
|
-
end
|
|
96
|
-
@parser.value do |value|
|
|
97
|
-
push_value(value)
|
|
98
|
-
end
|
|
99
|
-
end
|
|
100
|
-
|
|
101
|
-
def push_container(container)
|
|
102
|
-
@containers.push(container)
|
|
103
|
-
end
|
|
104
|
-
|
|
105
|
-
def pop_container
|
|
106
|
-
container = @containers.pop
|
|
107
|
-
if @containers.size == 1
|
|
108
|
-
@on_value.call(container)
|
|
109
|
-
else
|
|
110
|
-
push_value(container)
|
|
111
|
-
end
|
|
112
|
-
end
|
|
113
|
-
|
|
114
|
-
def push_key(key)
|
|
115
|
-
@keys.push(key)
|
|
116
|
-
end
|
|
117
|
-
|
|
118
|
-
def push_value(value)
|
|
119
|
-
container = @containers.last
|
|
120
|
-
case container
|
|
121
|
-
when ::Hash
|
|
122
|
-
container[@keys.pop] = value
|
|
123
|
-
when ::Array
|
|
124
|
-
container.push(value)
|
|
125
|
-
end
|
|
126
|
-
end
|
|
127
83
|
end
|
|
128
84
|
end
|
|
129
85
|
end
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# Copyright (C) 2013-
|
|
1
|
+
# Copyright (C) 2013-2026 Sutou Kouhei <kou@clear-code.com>
|
|
2
2
|
#
|
|
3
3
|
# This library is free software; you can redistribute it and/or
|
|
4
4
|
# modify it under the terms of the GNU Lesser General Public
|
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
module Groonga
|
|
18
18
|
module Command
|
|
19
19
|
class Parser
|
|
20
|
-
VERSION = "1.1.
|
|
20
|
+
VERSION = "1.1.7"
|
|
21
21
|
end
|
|
22
22
|
end
|
|
23
23
|
end
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# Copyright (C) 2011-
|
|
1
|
+
# Copyright (C) 2011-2026 Sutou Kouhei <kou@clear-code.com>
|
|
2
2
|
#
|
|
3
3
|
# This library is free software; you can redistribute it and/or
|
|
4
4
|
# modify it under the terms of the GNU Lesser General Public
|
|
@@ -15,7 +15,13 @@
|
|
|
15
15
|
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
|
16
16
|
|
|
17
17
|
require "English"
|
|
18
|
-
require "cgi"
|
|
18
|
+
require "cgi/escape"
|
|
19
|
+
begin
|
|
20
|
+
CGI.unescape("")
|
|
21
|
+
rescue NameError
|
|
22
|
+
# Ruby < 4.0 need cgi for CGI.unescape.
|
|
23
|
+
require "cgi"
|
|
24
|
+
end
|
|
19
25
|
require "json"
|
|
20
26
|
|
|
21
27
|
require "groonga/command"
|
|
@@ -381,6 +387,7 @@ module Groonga
|
|
|
381
387
|
end
|
|
382
388
|
@load_values_parser.on_end = lambda do |rest|
|
|
383
389
|
loading = @loading
|
|
390
|
+
@command.original_source.rstrip! if @need_original_source
|
|
384
391
|
on_load_complete(@command)
|
|
385
392
|
reset
|
|
386
393
|
@buffer << rest if loading and rest
|
|
@@ -1,6 +1,4 @@
|
|
|
1
|
-
#
|
|
2
|
-
#
|
|
3
|
-
# Copyright (C) 2011-2013 Kouhei Sutou <kou@clear-code.com>
|
|
1
|
+
# Copyright (C) 2011-2026 Sutou Kouhei <kou@clear-code.com>
|
|
4
2
|
#
|
|
5
3
|
# This library is free software; you can redistribute it and/or
|
|
6
4
|
# modify it under the terms of the GNU Lesser General Public
|
|
@@ -16,7 +14,7 @@
|
|
|
16
14
|
# License along with this library; if not, write to the Free Software
|
|
17
15
|
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
|
18
16
|
|
|
19
|
-
require "cgi"
|
|
17
|
+
require "cgi/escape"
|
|
20
18
|
require "stringio"
|
|
21
19
|
|
|
22
20
|
require "groonga/command/parser"
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# Copyright (C) 2015 Kouhei
|
|
1
|
+
# Copyright (C) 2015-2026 Sutou Kouhei <kou@clear-code.com>
|
|
2
2
|
#
|
|
3
3
|
# This library is free software; you can redistribute it and/or
|
|
4
4
|
# modify it under the terms of the GNU Lesser General Public
|
|
@@ -155,6 +155,7 @@ class LoadValuesParserTest < Test::Unit::TestCase
|
|
|
155
155
|
|
|
156
156
|
sub_test_case "error" do
|
|
157
157
|
test "unfinished" do
|
|
158
|
+
omit("We can't implement this with JSON::ResumableParser")
|
|
158
159
|
assert_equal([
|
|
159
160
|
{
|
|
160
161
|
"object" => {
|
data/test/test-parser.rb
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# Copyright (C) 2011-
|
|
1
|
+
# Copyright (C) 2011-2026 Sutou Kouhei <kou@clear-code.com>
|
|
2
2
|
#
|
|
3
3
|
# This library is free software; you can redistribute it and/or
|
|
4
4
|
# modify it under the terms of the GNU Lesser General Public
|
|
@@ -412,6 +412,7 @@ load --table Users
|
|
|
412
412
|
expected_events << [:load_value, <<-SOURCE, value]
|
|
413
413
|
load --table Users
|
|
414
414
|
[
|
|
415
|
+
{"_key": "alice", "name": "Alice"}
|
|
415
416
|
SOURCE
|
|
416
417
|
expected_events << [:load_complete, <<-SOURCE.chomp]
|
|
417
418
|
load --table Users
|
|
@@ -427,6 +428,7 @@ load --table Users
|
|
|
427
428
|
expected_events << [:load_value, <<-SOURCE, value]
|
|
428
429
|
load --table Users
|
|
429
430
|
[
|
|
431
|
+
{"_key": "bob", "name": "Bob"}
|
|
430
432
|
SOURCE
|
|
431
433
|
expected_events << [:load_complete, <<-SOURCE.chomp]
|
|
432
434
|
load --table Users
|
|
@@ -453,7 +455,7 @@ EOS
|
|
|
453
455
|
end
|
|
454
456
|
|
|
455
457
|
def test_no_record_separate_comma
|
|
456
|
-
message = "
|
|
458
|
+
message = "expected ',' or ']' after array value"
|
|
457
459
|
before = <<-BEFORE
|
|
458
460
|
[
|
|
459
461
|
{"_key": "alice", "name": "Alice"}
|
|
@@ -473,7 +475,7 @@ EOC
|
|
|
473
475
|
end
|
|
474
476
|
|
|
475
477
|
def test_garbage_before_json
|
|
476
|
-
message = "
|
|
478
|
+
message = "unexpected character: 'XXX'"
|
|
477
479
|
before = ""
|
|
478
480
|
after = <<-AFTER
|
|
479
481
|
XXX
|
metadata
CHANGED
|
@@ -1,14 +1,13 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: groonga-command-parser
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 1.1.
|
|
4
|
+
version: 1.1.7
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Kouhei Sutou
|
|
8
|
-
autorequire:
|
|
9
8
|
bindir: bin
|
|
10
9
|
cert_chain: []
|
|
11
|
-
date:
|
|
10
|
+
date: 1980-01-02 00:00:00.000000000 Z
|
|
12
11
|
dependencies:
|
|
13
12
|
- !ruby/object:Gem::Dependency
|
|
14
13
|
name: groonga-command
|
|
@@ -25,103 +24,19 @@ dependencies:
|
|
|
25
24
|
- !ruby/object:Gem::Version
|
|
26
25
|
version: 1.4.0
|
|
27
26
|
- !ruby/object:Gem::Dependency
|
|
28
|
-
name: json
|
|
27
|
+
name: json
|
|
29
28
|
requirement: !ruby/object:Gem::Requirement
|
|
30
29
|
requirements:
|
|
31
30
|
- - ">="
|
|
32
31
|
- !ruby/object:Gem::Version
|
|
33
|
-
version:
|
|
32
|
+
version: 2.20.0
|
|
34
33
|
type: :runtime
|
|
35
34
|
prerelease: false
|
|
36
35
|
version_requirements: !ruby/object:Gem::Requirement
|
|
37
36
|
requirements:
|
|
38
37
|
- - ">="
|
|
39
38
|
- !ruby/object:Gem::Version
|
|
40
|
-
version:
|
|
41
|
-
- !ruby/object:Gem::Dependency
|
|
42
|
-
name: test-unit
|
|
43
|
-
requirement: !ruby/object:Gem::Requirement
|
|
44
|
-
requirements:
|
|
45
|
-
- - ">="
|
|
46
|
-
- !ruby/object:Gem::Version
|
|
47
|
-
version: '0'
|
|
48
|
-
type: :development
|
|
49
|
-
prerelease: false
|
|
50
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
51
|
-
requirements:
|
|
52
|
-
- - ">="
|
|
53
|
-
- !ruby/object:Gem::Version
|
|
54
|
-
version: '0'
|
|
55
|
-
- !ruby/object:Gem::Dependency
|
|
56
|
-
name: rake
|
|
57
|
-
requirement: !ruby/object:Gem::Requirement
|
|
58
|
-
requirements:
|
|
59
|
-
- - ">="
|
|
60
|
-
- !ruby/object:Gem::Version
|
|
61
|
-
version: '0'
|
|
62
|
-
type: :development
|
|
63
|
-
prerelease: false
|
|
64
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
65
|
-
requirements:
|
|
66
|
-
- - ">="
|
|
67
|
-
- !ruby/object:Gem::Version
|
|
68
|
-
version: '0'
|
|
69
|
-
- !ruby/object:Gem::Dependency
|
|
70
|
-
name: bundler
|
|
71
|
-
requirement: !ruby/object:Gem::Requirement
|
|
72
|
-
requirements:
|
|
73
|
-
- - ">="
|
|
74
|
-
- !ruby/object:Gem::Version
|
|
75
|
-
version: '0'
|
|
76
|
-
type: :development
|
|
77
|
-
prerelease: false
|
|
78
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
79
|
-
requirements:
|
|
80
|
-
- - ">="
|
|
81
|
-
- !ruby/object:Gem::Version
|
|
82
|
-
version: '0'
|
|
83
|
-
- !ruby/object:Gem::Dependency
|
|
84
|
-
name: packnga
|
|
85
|
-
requirement: !ruby/object:Gem::Requirement
|
|
86
|
-
requirements:
|
|
87
|
-
- - ">="
|
|
88
|
-
- !ruby/object:Gem::Version
|
|
89
|
-
version: '0'
|
|
90
|
-
type: :development
|
|
91
|
-
prerelease: false
|
|
92
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
93
|
-
requirements:
|
|
94
|
-
- - ">="
|
|
95
|
-
- !ruby/object:Gem::Version
|
|
96
|
-
version: '0'
|
|
97
|
-
- !ruby/object:Gem::Dependency
|
|
98
|
-
name: yard
|
|
99
|
-
requirement: !ruby/object:Gem::Requirement
|
|
100
|
-
requirements:
|
|
101
|
-
- - ">="
|
|
102
|
-
- !ruby/object:Gem::Version
|
|
103
|
-
version: '0'
|
|
104
|
-
type: :development
|
|
105
|
-
prerelease: false
|
|
106
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
107
|
-
requirements:
|
|
108
|
-
- - ">="
|
|
109
|
-
- !ruby/object:Gem::Version
|
|
110
|
-
version: '0'
|
|
111
|
-
- !ruby/object:Gem::Dependency
|
|
112
|
-
name: kramdown
|
|
113
|
-
requirement: !ruby/object:Gem::Requirement
|
|
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
|
-
requirements:
|
|
122
|
-
- - ">="
|
|
123
|
-
- !ruby/object:Gem::Version
|
|
124
|
-
version: '0'
|
|
39
|
+
version: 2.20.0
|
|
125
40
|
description: ''
|
|
126
41
|
email:
|
|
127
42
|
- kou@clear-code.com
|
|
@@ -159,7 +74,6 @@ homepage: https://github.com/groonga/groonga-command-parser
|
|
|
159
74
|
licenses:
|
|
160
75
|
- LGPLv2.1+
|
|
161
76
|
metadata: {}
|
|
162
|
-
post_install_message:
|
|
163
77
|
rdoc_options: []
|
|
164
78
|
require_paths:
|
|
165
79
|
- lib
|
|
@@ -174,8 +88,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
174
88
|
- !ruby/object:Gem::Version
|
|
175
89
|
version: '0'
|
|
176
90
|
requirements: []
|
|
177
|
-
rubygems_version:
|
|
178
|
-
signing_key:
|
|
91
|
+
rubygems_version: 4.0.10
|
|
179
92
|
specification_version: 4
|
|
180
93
|
summary: Groonga-command-parser is a Ruby library to parses [groonga](http://groonga.org/)'s
|
|
181
94
|
command syntax. You can write a program to process groonga's command by using groonga-command-parser.
|