rginger 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.
- checksums.yaml +7 -0
- data/Gemfile +4 -0
- data/README.md +60 -0
- data/Rakefile +9 -0
- data/bin/rginger +98 -0
- data/lib/rginger/parser.rb +122 -0
- data/lib/rginger/version.rb +3 -0
- data/lib/rginger.rb +17 -0
- data/rginger.gemspec +29 -0
- data/rginger.rb +86 -0
- data/test/test_rginger.rb +40 -0
- metadata +114 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: adbc3bb7227958f6f9f449c93940496d359144df
|
4
|
+
data.tar.gz: 0c3f935ecf26185e41170e90c588b80cc00b248e
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 8d682a2b2c11006ed5a13ec0cdc46ee5fa435171e096bb236d3d087d0eae9a7cd6d8ea61cb4701f4f824eb5072f5e5db4e0e561cbb746d67f941a7cbc34789a0
|
7
|
+
data.tar.gz: 859fe01d830dede34059a1003c51be8493216e392f159af26f6c96178e4e47da4fe385ea0987104535e02e83fad6b5313871505b76c2fa29eb45b700b19c57c9
|
data/Gemfile
ADDED
data/README.md
ADDED
@@ -0,0 +1,60 @@
|
|
1
|
+
# RGinger
|
2
|
+
|
3
|
+
RGinger takes an English sentence and gives correction and rephrasing suggestions for it using Ginger proofreading API. It can be used both as a Ruby library and a command line application.
|
4
|
+
|
5
|
+
## Installation
|
6
|
+
|
7
|
+
$ gem install rginger
|
8
|
+
|
9
|
+
## Command Line Usage
|
10
|
+
|
11
|
+
### Usage
|
12
|
+
|
13
|
+
$ rginger [options] "input text"
|
14
|
+
|
15
|
+
|
16
|
+
### Options
|
17
|
+
|
18
|
+
--coloring, --no-coloring, -c: Get colorful output (default: true)
|
19
|
+
--correction, --no-correction, -o: Get suggestions for correcting the original
|
20
|
+
sentence (default: true)
|
21
|
+
--rephrase, --no-rephrase, -r: Get suggestions for rephrasing the original
|
22
|
+
sentence (default: true)
|
23
|
+
--version, -v: Print version and exit
|
24
|
+
--help, -h: Show this message
|
25
|
+
|
26
|
+
### Output Sample
|
27
|
+
|
28
|
+
|
29
|
+
|
30
|
+
|
31
|
+
## Library Usage
|
32
|
+
|
33
|
+
require 'rginger'
|
34
|
+
|
35
|
+
ginger = RGinger::Parser.new
|
36
|
+
result = ginger.correct "I looking forward meet you"
|
37
|
+
|
38
|
+
# {"original"=>"I looking forward meet you",
|
39
|
+
# "data"=>
|
40
|
+
# [{"old"=>"looking",
|
41
|
+
# "from"=>2,
|
42
|
+
# "to"=>8,
|
43
|
+
# "reverse_from"=>-24,
|
44
|
+
# "reverse_to"=>-18,
|
45
|
+
# "new"=>"am looking"},
|
46
|
+
# {"old"=>"meet",
|
47
|
+
# "from"=>18,
|
48
|
+
# "to"=>21,
|
49
|
+
# "reverse_from"=>-8,
|
50
|
+
# "reverse_to"=>-5,
|
51
|
+
# "new"=>"to meet"}],
|
52
|
+
# "corrected"=>"I am looking forward to meet you"}
|
53
|
+
|
54
|
+
### References
|
55
|
+
|
56
|
+
Alif Rachmawadi's [Gingerice](https://github.com/subosito/gingerice) may be a better solution than RGinger for those who do not need colored command line output and "rephrase" functionality.
|
57
|
+
|
58
|
+
### Thanks
|
59
|
+
|
60
|
+
Ginger Software for the great software and services that support learners aspiring for skills of writing good English.
|
data/Rakefile
ADDED
data/bin/rginger
ADDED
@@ -0,0 +1,98 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# -*- coding: utf-8 -*-
|
3
|
+
|
4
|
+
$:.unshift(File::join(File::dirname(File::dirname(__FILE__)), "lib"))
|
5
|
+
|
6
|
+
require 'rginger'
|
7
|
+
require 'trollop'
|
8
|
+
require 'rainbow'
|
9
|
+
|
10
|
+
opts = Trollop::options do
|
11
|
+
version RGinger::VERSION
|
12
|
+
banner <<-EOS
|
13
|
+
RGinger uses Ginger proofreading API and acquires correction and rephrasing suggestions for input English sentence.
|
14
|
+
|
15
|
+
Usage:
|
16
|
+
rginger [options] "input text"
|
17
|
+
where [options] are:
|
18
|
+
EOS
|
19
|
+
|
20
|
+
opt :coloring, "Get colorful output", :default => true
|
21
|
+
opt :correction, "Get suggestions for correcting the original sentence", :default => true
|
22
|
+
opt :rephrase, "Get suggestions for rephrasing the original sentence", :default => true
|
23
|
+
end
|
24
|
+
|
25
|
+
input_text = ARGV ? ARGV.join(" ").dup : ""
|
26
|
+
|
27
|
+
Trollop::die "Input text needs to be given" if !input_text || /\A\s*\z/ =~ input_text
|
28
|
+
Trollop::die "Either 'Correction' or 'Rephrase' option needs to be turned on" if !opts[:correction] && !opts[:rephrase]
|
29
|
+
|
30
|
+
Sickill::Rainbow.enabled = false unless opts[:coloring]
|
31
|
+
|
32
|
+
begin
|
33
|
+
|
34
|
+
ginger = RGinger::Parser.new
|
35
|
+
corrected = nil
|
36
|
+
|
37
|
+
puts ""
|
38
|
+
|
39
|
+
if opts[:correction]
|
40
|
+
result1 = ginger.correct(input_text)
|
41
|
+
data = result1["data"]
|
42
|
+
if !data.empty?
|
43
|
+
puts "ORIGINAL:".background(:blue)
|
44
|
+
print "\t"
|
45
|
+
onset = 0
|
46
|
+
data.each do |d|
|
47
|
+
reverse_from = d["reverse_from"]
|
48
|
+
reverse_to = d["reverse_to"]
|
49
|
+
preceding = input_text[onset ... reverse_from]
|
50
|
+
marked = d["old"]
|
51
|
+
print preceding.bright
|
52
|
+
print marked.foreground(:red).underline.bright
|
53
|
+
onset = onset + preceding.length + d["old"].length
|
54
|
+
end
|
55
|
+
puts input_text[onset .. -1].bright
|
56
|
+
|
57
|
+
puts "CORRECTED:".background(:green)
|
58
|
+
print "\t"
|
59
|
+
onset = 0
|
60
|
+
data.each_with_index do |d, idx|
|
61
|
+
reverse_from = d["reverse_from"]
|
62
|
+
reverse_to = d["reverse_to"]
|
63
|
+
preceding = input_text[onset ... reverse_from]
|
64
|
+
marked = d["new"]
|
65
|
+
print preceding.bright
|
66
|
+
print marked.foreground(:green).underline.bright
|
67
|
+
onset = onset + preceding.length + d["old"].length
|
68
|
+
end
|
69
|
+
puts input_text[onset .. -1].bright
|
70
|
+
else
|
71
|
+
puts "Original:".background(:blue)
|
72
|
+
puts "\t#{input_text}".bright
|
73
|
+
puts "CORRECTED:".background(:green)
|
74
|
+
puts "\tNo suggestion returned".foreground(:magenta)
|
75
|
+
end
|
76
|
+
else
|
77
|
+
puts "Original:".background(:cyan)
|
78
|
+
puts "\t#{input_text}".bright
|
79
|
+
end
|
80
|
+
|
81
|
+
if opts[:rephrase]
|
82
|
+
input_text = corrected if corrected
|
83
|
+
result2 = ginger.rephrase(input_text)["alternatives"]
|
84
|
+
puts "ALTERNATIVES:".background(:cyan)
|
85
|
+
if !result2.empty?
|
86
|
+
result2.each do |r|
|
87
|
+
puts "\t" + r.bright
|
88
|
+
end
|
89
|
+
else
|
90
|
+
puts "\tNo suggestion returned".foreground(:magenta)
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
puts ""
|
95
|
+
|
96
|
+
rescue Exception => e
|
97
|
+
puts e.message
|
98
|
+
end
|
@@ -0,0 +1,122 @@
|
|
1
|
+
require 'net/http'
|
2
|
+
require 'uri'
|
3
|
+
require 'json'
|
4
|
+
|
5
|
+
module RGinger
|
6
|
+
class Parser
|
7
|
+
def initialize
|
8
|
+
end
|
9
|
+
|
10
|
+
def correct(input)
|
11
|
+
|
12
|
+
text = input.dup
|
13
|
+
results = {"original" => input, "data" => []}
|
14
|
+
|
15
|
+
if !text || text == ""
|
16
|
+
results["corrected" => text]
|
17
|
+
return results
|
18
|
+
end
|
19
|
+
|
20
|
+
width = text.length
|
21
|
+
escaped = URI.escape(text)
|
22
|
+
url = "#{API_ENDPOINT}?lang=#{DEFAULT_LANG}&clientVersion=#{API_VERSION}&apiKey=#{API_KEY}&text=#{escaped}"
|
23
|
+
|
24
|
+
json_data = get_json(url)["LightGingerTheTextResult"] rescue {}
|
25
|
+
|
26
|
+
unless json_data.empty?
|
27
|
+
new_string = text
|
28
|
+
json_data.each do |r|
|
29
|
+
if r["Mistakes"].size == r["Suggestions"].size
|
30
|
+
r["Mistakes"].each_with_index do |m, i|
|
31
|
+
from = m["From"]
|
32
|
+
to = m["To"]
|
33
|
+
reverse_from = -(width - from)
|
34
|
+
reverse_to = -(width - to)
|
35
|
+
old_item = new_string[reverse_from .. reverse_to]
|
36
|
+
new_item = r["Suggestions"][i]["Text"]
|
37
|
+
new_string[reverse_from .. reverse_to] = new_item
|
38
|
+
results["data"] << {
|
39
|
+
"old" => old_item,
|
40
|
+
"from" => from,
|
41
|
+
"to" => to,
|
42
|
+
"reverse_from" => reverse_from,
|
43
|
+
"reverse_to" => reverse_to,
|
44
|
+
"new" => new_item,
|
45
|
+
}
|
46
|
+
end
|
47
|
+
else
|
48
|
+
from = r["From"]
|
49
|
+
to = r["To"]
|
50
|
+
reverse_from = -(width - from)
|
51
|
+
reverse_to = -(width - to)
|
52
|
+
old_item = new_string[reverse_from .. reverse_to]
|
53
|
+
new_item = r["Suggestions"][0]["Text"]
|
54
|
+
new_string[reverse_from .. reverse_to] = new_item rescue ""
|
55
|
+
results["data"] << {
|
56
|
+
"old" => old_item,
|
57
|
+
"from" => from,
|
58
|
+
"to" => to,
|
59
|
+
"reverse_from" => reverse_from,
|
60
|
+
"reverse_to" => reverse_to,
|
61
|
+
"new" => new_item,
|
62
|
+
}
|
63
|
+
end
|
64
|
+
results["corrected"] = new_string
|
65
|
+
end
|
66
|
+
end
|
67
|
+
results
|
68
|
+
end
|
69
|
+
|
70
|
+
def rephrase(input)
|
71
|
+
|
72
|
+
text = input.dup
|
73
|
+
results = {"original" => input, "alternatives" => []}
|
74
|
+
return results if !text || text == ""
|
75
|
+
|
76
|
+
width = text.length
|
77
|
+
escaped = URI.escape(text)
|
78
|
+
url = "#{REPHRASE_ENDPOINT}?s=#{escaped}"
|
79
|
+
|
80
|
+
json_data = get_json(url)
|
81
|
+
|
82
|
+
unless json_data.empty? || json_data["Sentences"].empty?
|
83
|
+
results["alternatives"] = json_data["Sentences"].map{|s| s["Sentence"]}
|
84
|
+
end
|
85
|
+
results
|
86
|
+
end
|
87
|
+
|
88
|
+
:private
|
89
|
+
|
90
|
+
def get_json(location, limit = 10)
|
91
|
+
raise ArgumentError, 'too many HTTP redirects' if limit == 0
|
92
|
+
uri = URI.parse(location)
|
93
|
+
|
94
|
+
begin
|
95
|
+
response = Net::HTTP.start(uri.host, uri.port, use_ssl: uri.scheme == 'https') do |http|
|
96
|
+
http.open_timeout = 5
|
97
|
+
http.read_timeout = 10
|
98
|
+
http.get(uri.request_uri)
|
99
|
+
end
|
100
|
+
|
101
|
+
case response
|
102
|
+
when Net::HTTPSuccess
|
103
|
+
json = response.body
|
104
|
+
JSON.parse(json)
|
105
|
+
when Net::HTTPRedirection
|
106
|
+
location = response['location']
|
107
|
+
warn "redirected to #{location}"
|
108
|
+
# Recursive method call
|
109
|
+
get_json(location, limit - 1)
|
110
|
+
else
|
111
|
+
# Error
|
112
|
+
puts [uri.to_s, response.value].join(" : ")
|
113
|
+
end
|
114
|
+
rescue => e
|
115
|
+
# Error
|
116
|
+
puts [uri.to_s, e.class, e].join(" : ")
|
117
|
+
end
|
118
|
+
end
|
119
|
+
|
120
|
+
end
|
121
|
+
|
122
|
+
end
|
data/lib/rginger.rb
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# -*- coding: utf-8 -*-
|
3
|
+
|
4
|
+
$:.unshift(File::join(File::dirname(__FILE__)))
|
5
|
+
|
6
|
+
require 'pp'
|
7
|
+
|
8
|
+
module RGinger
|
9
|
+
API_ENDPOINT = 'http://services.gingersoftware.com/Ginger/correct/json/GingerTheText'
|
10
|
+
REPHRASE_ENDPOINT = 'http://ro.gingersoftware.com/rephrase/rephrase'
|
11
|
+
API_VERSION = '2.0'
|
12
|
+
API_KEY = '6ae0c3a0-afdc-4532-a810-82ded0054236'
|
13
|
+
DEFAULT_LANG = 'US'
|
14
|
+
end
|
15
|
+
|
16
|
+
require 'rginger/parser'
|
17
|
+
require 'rginger/version'
|
data/rginger.gemspec
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# -*- coding: utf-8 -*-
|
3
|
+
|
4
|
+
lib = File.expand_path('../lib', __FILE__)
|
5
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
6
|
+
|
7
|
+
require 'rginger/version'
|
8
|
+
|
9
|
+
Gem::Specification.new do |gem|
|
10
|
+
gem.name = "rginger"
|
11
|
+
gem.version = RGinger::VERSION
|
12
|
+
gem.authors = ["Yoichiro Hasebe"]
|
13
|
+
gem.email = ["yohasebe@gmail.com"]
|
14
|
+
gem.description = "RGinger takes an English sentence and gives correction and rephrasing suggestions for it using Ginger proofreading API."
|
15
|
+
gem.summary = gem.description
|
16
|
+
gem.homepage = "https://github.com/yohasebe/rginger"
|
17
|
+
gem.license = "MIT"
|
18
|
+
|
19
|
+
gem.files = `git ls-files`.split($/)
|
20
|
+
gem.executables = gem.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
21
|
+
gem.test_files = gem.files.grep(%r{^(test|gem|features)/})
|
22
|
+
gem.require_paths = ["lib"]
|
23
|
+
|
24
|
+
gem.add_development_dependency "bundler"
|
25
|
+
gem.add_development_dependency "rake"
|
26
|
+
gem.add_dependency "trollop"
|
27
|
+
gem.add_dependency "rainbow"
|
28
|
+
end
|
29
|
+
|
data/rginger.rb
ADDED
@@ -0,0 +1,86 @@
|
|
1
|
+
require 'net/http'
|
2
|
+
require 'uri'
|
3
|
+
require 'json'
|
4
|
+
|
5
|
+
GINGER_API_ENDPOINT = 'http://services.gingersoftware.com/Ginger/correct/json/GingerTheText'
|
6
|
+
GINGER_REPHRASE_ENDPOINT = 'http://ro.gingersoftware.com/rephrase/rephrase'
|
7
|
+
GINGER_API_VERSION = '2.0'
|
8
|
+
GINGER_API_KEY = '6ae0c3a0-afdc-4532-a810-82ded0054236'
|
9
|
+
DEFAULT_LANG = 'US'
|
10
|
+
|
11
|
+
def get_json(location, limit = 10)
|
12
|
+
raise ArgumentError, 'too many HTTP redirects' if limit == 0
|
13
|
+
uri = URI.parse(location)
|
14
|
+
|
15
|
+
begin
|
16
|
+
response = Net::HTTP.start(uri.host, uri.port, use_ssl: uri.scheme == 'https') do |http|
|
17
|
+
http.open_timeout = 5
|
18
|
+
http.read_timeout = 10
|
19
|
+
http.get(uri.request_uri)
|
20
|
+
end
|
21
|
+
|
22
|
+
case response
|
23
|
+
when Net::HTTPSuccess
|
24
|
+
json = response.body
|
25
|
+
JSON.parse(json)
|
26
|
+
when Net::HTTPRedirection
|
27
|
+
location = response['location']
|
28
|
+
warn "redirected to #{location}"
|
29
|
+
# Recursive method call
|
30
|
+
get_json(location, limit - 1)
|
31
|
+
else
|
32
|
+
# Error
|
33
|
+
puts [uri.to_s, response.value].join(" : ")
|
34
|
+
end
|
35
|
+
rescue => e
|
36
|
+
# Error
|
37
|
+
puts [uri.to_s, e.class, e].join(" : ")
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
puts "# => ORIGINAL"
|
42
|
+
puts original = "I am suffring from a desease, amn't I"
|
43
|
+
width = original.length
|
44
|
+
corrected = []
|
45
|
+
|
46
|
+
text = URI.escape(original)
|
47
|
+
|
48
|
+
correction = "#{GINGER_API_ENDPOINT}?lang=#{DEFAULT_LANG}&clientVersion=#{GINGER_API_VERSION}&apiKey=#{GINGER_API_KEY}&text=#{text}"
|
49
|
+
|
50
|
+
results = get_json(correction)["LightGingerTheTextResult"]
|
51
|
+
|
52
|
+
if results.empty?
|
53
|
+
puts "# No need to correct"
|
54
|
+
a_better = original
|
55
|
+
else
|
56
|
+
new_string = original
|
57
|
+
results.each do |r|
|
58
|
+
if r["Mistakes"].size == r["Suggestions"].size
|
59
|
+
r["Mistakes"].each_with_index do |m, i|
|
60
|
+
from = -(width - m["From"])
|
61
|
+
to = -(width - m["To"])
|
62
|
+
new_string[from .. to] = r["Suggestions"][i]["Text"]
|
63
|
+
end
|
64
|
+
else
|
65
|
+
from = -(width - r["From"])
|
66
|
+
to = -(width - r["To"])
|
67
|
+
new_string[from .. to] = r["Suggestions"][0]["Text"] rescue ""
|
68
|
+
end
|
69
|
+
end
|
70
|
+
puts "# => CORRECTED"
|
71
|
+
puts a_better = new_string
|
72
|
+
end
|
73
|
+
|
74
|
+
text = URI.escape(a_better)
|
75
|
+
|
76
|
+
rephrase = "#{GINGER_REPHRASE_ENDPOINT}?s=#{text}"
|
77
|
+
results = get_json(rephrase)
|
78
|
+
|
79
|
+
if results.empty? || results["Sentences"].empty?
|
80
|
+
puts "# No alternative expressions"
|
81
|
+
else
|
82
|
+
puts "# => ALTERNATIVES"
|
83
|
+
results["Sentences"].each do |item|
|
84
|
+
puts item["Sentence"]
|
85
|
+
end
|
86
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# -*- coding: utf-8 -*-
|
3
|
+
|
4
|
+
$:.unshift(File::join(File::dirname(File.expand_path(File::dirname(__FILE__))), "lib"))
|
5
|
+
|
6
|
+
require 'test/unit'
|
7
|
+
require 'rginger'
|
8
|
+
require 'pp'
|
9
|
+
|
10
|
+
class TestRGinger < Test::Unit::TestCase
|
11
|
+
def setup
|
12
|
+
@ginger = RGinger::Parser.new
|
13
|
+
@text = 'I wke up to teh poring rain.'
|
14
|
+
@corrected = 'I woke up to the pouring rain.'
|
15
|
+
@alternative = 'I woke up to pouring rain.'
|
16
|
+
end
|
17
|
+
|
18
|
+
def test_correcting_sentence
|
19
|
+
result = @ginger.correct(@text)
|
20
|
+
|
21
|
+
assert_equal @text, result['original']
|
22
|
+
assert_equal @corrected, result['corrected']
|
23
|
+
assert_equal 3, result['data'].size
|
24
|
+
assert_equal 2, result['data'].first['from']
|
25
|
+
assert_equal 4, result['data'].first['to']
|
26
|
+
assert_equal -26, result['data'].first['reverse_from']
|
27
|
+
assert_equal -24, result['data'].first['reverse_to']
|
28
|
+
assert_equal "wke", result['data'].first['old']
|
29
|
+
assert_equal "woke", result['data'].first['new']
|
30
|
+
end
|
31
|
+
|
32
|
+
def test_rephrasing_sentence
|
33
|
+
result = @ginger.rephrase(@corrected)
|
34
|
+
|
35
|
+
assert_equal @corrected, result['original']
|
36
|
+
assert_equal 4, result['alternatives'].size
|
37
|
+
assert_equal @alternative, result['alternatives'].first
|
38
|
+
end
|
39
|
+
|
40
|
+
end
|
metadata
ADDED
@@ -0,0 +1,114 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: rginger
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: '0.1'
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Yoichiro Hasebe
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2013-11-28 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: bundler
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - '>='
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - '>='
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rake
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - '>='
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - '>='
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: trollop
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - '>='
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :runtime
|
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: rainbow
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - '>='
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :runtime
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - '>='
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
69
|
+
description: RGinger takes an English sentence and gives correction and rephrasing
|
70
|
+
suggestions for it using Ginger proofreading API.
|
71
|
+
email:
|
72
|
+
- yohasebe@gmail.com
|
73
|
+
executables:
|
74
|
+
- rginger
|
75
|
+
extensions: []
|
76
|
+
extra_rdoc_files: []
|
77
|
+
files:
|
78
|
+
- Gemfile
|
79
|
+
- README.md
|
80
|
+
- Rakefile
|
81
|
+
- bin/rginger
|
82
|
+
- lib/rginger.rb
|
83
|
+
- lib/rginger/parser.rb
|
84
|
+
- lib/rginger/version.rb
|
85
|
+
- rginger.gemspec
|
86
|
+
- rginger.rb
|
87
|
+
- test/test_rginger.rb
|
88
|
+
homepage: https://github.com/yohasebe/rginger
|
89
|
+
licenses:
|
90
|
+
- MIT
|
91
|
+
metadata: {}
|
92
|
+
post_install_message:
|
93
|
+
rdoc_options: []
|
94
|
+
require_paths:
|
95
|
+
- lib
|
96
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
97
|
+
requirements:
|
98
|
+
- - '>='
|
99
|
+
- !ruby/object:Gem::Version
|
100
|
+
version: '0'
|
101
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
102
|
+
requirements:
|
103
|
+
- - '>='
|
104
|
+
- !ruby/object:Gem::Version
|
105
|
+
version: '0'
|
106
|
+
requirements: []
|
107
|
+
rubyforge_project:
|
108
|
+
rubygems_version: 2.1.10
|
109
|
+
signing_key:
|
110
|
+
specification_version: 4
|
111
|
+
summary: RGinger takes an English sentence and gives correction and rephrasing suggestions
|
112
|
+
for it using Ginger proofreading API.
|
113
|
+
test_files:
|
114
|
+
- test/test_rginger.rb
|