opener-constituent-parser 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: bf9cb3d2b534265f6dc4d347f9ace8dcbd36f54e
4
+ data.tar.gz: 2c4ff4b9bea88aff427f4a570fa455f49501d344
5
+ SHA512:
6
+ metadata.gz: 83758c416f6aa1e05c899b0f6cc4be67a904d43328d357d2f5c8e649dbf4d3caa324669b3c473637ee2630d7089a4b4a6ee83eac10ebe70543c65b6243ac2ef6
7
+ data.tar.gz: db883a9e99c5e6200968b8bc23e3bbaee4dfad125f4484e2b2763a550833a7cc5f18a12da9da992900391f73464ccfd2cc90fbae5dcaead5f7d237c6caf1fd68
data/README.md ADDED
@@ -0,0 +1,30 @@
1
+ # Constituent Parser
2
+
3
+ This repository contains a constituent parser component that provides a CLI
4
+ interface and a webservice for the various constituent parser kernels.
5
+
6
+ ## Requirements
7
+
8
+ * Ruby 1.9.2 or newer
9
+
10
+ ## Installation
11
+
12
+ Installing as a regular Gem:
13
+
14
+ gem install opener-constituent-parser
15
+
16
+ Using Bundler:
17
+
18
+ gem 'opener-constituent-parser',
19
+ :git => 'git@github.com:opener-project/constituent-parser.git',
20
+ :branch => 'master'
21
+
22
+ Using specific install:
23
+
24
+ gem install specific_install
25
+ gem specific_install opener-constituent-parser \
26
+ -l https://github.com/opener-project/constituent-parser.git
27
+
28
+ ## Usage
29
+
30
+ cat some_input_file.kaf | constituent-parser -l en
@@ -0,0 +1,7 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require_relative '../lib/opener/constituent_parser'
4
+
5
+ cli = Opener::ConstituentParser::CLI.new(:args => ARGV)
6
+
7
+ cli.run(STDIN.tty? ? nil : STDIN.read)
@@ -0,0 +1,10 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require_relative '../lib/opener/constituent_parser/server'
4
+
5
+ # Without calling `Rack::Server#options` manually the CLI arguments will never
6
+ # be passed, thus the application can't be specified as a constructor argument.
7
+ server = Rack::Server.new
8
+ server.options[:config] = File.expand_path('../../config.ru', __FILE__)
9
+
10
+ server.start
data/config.ru ADDED
@@ -0,0 +1,4 @@
1
+ require File.expand_path('../lib/opener/constituent_parser', __FILE__)
2
+ require File.expand_path('../lib/opener/constituent_parser/server', __FILE__)
3
+
4
+ run Opener::ConstituentParser::Server
@@ -0,0 +1,86 @@
1
+ module Opener
2
+ class ConstituentParser
3
+ ##
4
+ # CLI wrapper around {Opener::ConstituentParser} using OptionParser.
5
+ #
6
+ # @!attribute [r] options
7
+ # @return [Hash]
8
+ # @!attribute [r] option_parser
9
+ # @return [OptionParser]
10
+ #
11
+ class CLI
12
+ attr_reader :options, :option_parser
13
+
14
+ ##
15
+ # @param [Hash] options
16
+ #
17
+ def initialize(options = {})
18
+ @options = DEFAULT_OPTIONS.merge(options)
19
+
20
+ @option_parser = OptionParser.new do |opts|
21
+ opts.program_name = 'constituent-parser'
22
+ opts.summary_indent = ' '
23
+
24
+ opts.on('-h', '--help', 'Shows this help message') do
25
+ show_help
26
+ end
27
+
28
+ opts.on('-v', '--version', 'Shows the current version') do
29
+ show_version
30
+ end
31
+
32
+ opts.on(
33
+ '-l',
34
+ '--language [VALUE]',
35
+ 'Uses this specific language'
36
+ ) do |value|
37
+ @options[:language] = value
38
+ end
39
+
40
+ opts.separator <<-EOF
41
+
42
+ Examples:
43
+
44
+ cat input_file.kaf | #{opts.program_name}
45
+ cat input_file.kaf | #{opts.program_name} -l nl
46
+ EOF
47
+ end
48
+ end
49
+
50
+ ##
51
+ # @param [String] input
52
+ #
53
+ def run(input)
54
+ option_parser.parse!(options[:args])
55
+
56
+ runner = ConstituentParser.new(options)
57
+
58
+ stdout, stderr, process = runner.run(input)
59
+
60
+ if process.success?
61
+ puts stdout
62
+
63
+ STDERR.puts(stderr) unless stderr.empty?
64
+ else
65
+ abort stderr
66
+ end
67
+ end
68
+
69
+ private
70
+
71
+ ##
72
+ # Shows the help message and exits the program.
73
+ #
74
+ def show_help
75
+ abort option_parser.to_s
76
+ end
77
+
78
+ ##
79
+ # Shows the version and exits the program.
80
+ #
81
+ def show_version
82
+ abort "#{option_parser.program_name} v#{VERSION} on #{RUBY_DESCRIPTION}"
83
+ end
84
+ end # CLI
85
+ end # ConstituentParser
86
+ end # Opener
@@ -0,0 +1,283 @@
1
+ input[type="text"], textarea
2
+ {
3
+ width: 500px;
4
+ }
5
+
6
+ body {
7
+ font-family: Helvetica, arial, sans-serif;
8
+ font-size: 14px;
9
+ line-height: 1.6;
10
+ padding-top: 10px;
11
+ padding-bottom: 10px;
12
+ background-color: white;
13
+ padding: 30px; }
14
+
15
+ body > *:first-child {
16
+ margin-top: 0 !important; }
17
+ body > *:last-child {
18
+ margin-bottom: 0 !important; }
19
+
20
+ a {
21
+ color: #4183C4; }
22
+ a.absent {
23
+ color: #cc0000; }
24
+ a.anchor {
25
+ display: block;
26
+ padding-left: 30px;
27
+ margin-left: -30px;
28
+ cursor: pointer;
29
+ position: absolute;
30
+ top: 0;
31
+ left: 0;
32
+ bottom: 0; }
33
+
34
+ h1, h2, h3, h4, h5, h6 {
35
+ margin: 20px 0 10px;
36
+ padding: 0;
37
+ font-weight: bold;
38
+ -webkit-font-smoothing: antialiased;
39
+ cursor: text;
40
+ position: relative; }
41
+
42
+ h1:hover a.anchor, h2:hover a.anchor, h3:hover a.anchor, h4:hover a.anchor, h5:hover a.anchor, h6:hover a.anchor {
43
+ background: url("../../images/modules/styleguide/para.png") no-repeat 10px center;
44
+ text-decoration: none; }
45
+
46
+ h1 tt, h1 code {
47
+ font-size: inherit; }
48
+
49
+ h2 tt, h2 code {
50
+ font-size: inherit; }
51
+
52
+ h3 tt, h3 code {
53
+ font-size: inherit; }
54
+
55
+ h4 tt, h4 code {
56
+ font-size: inherit; }
57
+
58
+ h5 tt, h5 code {
59
+ font-size: inherit; }
60
+
61
+ h6 tt, h6 code {
62
+ font-size: inherit; }
63
+
64
+ h1 {
65
+ font-size: 28px;
66
+ color: black; }
67
+
68
+ h2 {
69
+ font-size: 24px;
70
+ border-bottom: 1px solid #cccccc;
71
+ color: black; }
72
+
73
+ h3 {
74
+ font-size: 18px; }
75
+
76
+ h4 {
77
+ font-size: 16px; }
78
+
79
+ h5 {
80
+ font-size: 14px; }
81
+
82
+ h6 {
83
+ color: #777777;
84
+ font-size: 14px; }
85
+
86
+ p, blockquote, ul, ol, dl, li, table, pre {
87
+ margin: 15px 0; }
88
+
89
+ hr {
90
+ background: transparent url("../../images/modules/pulls/dirty-shade.png") repeat-x 0 0;
91
+ border: 0 none;
92
+ color: #cccccc;
93
+ height: 4px;
94
+ padding: 0; }
95
+
96
+ body > h2:first-child {
97
+ margin-top: 0;
98
+ padding-top: 0; }
99
+ body > h1:first-child {
100
+ margin-top: 0;
101
+ padding-top: 0; }
102
+ body > h1:first-child + h2 {
103
+ margin-top: 0;
104
+ padding-top: 0; }
105
+ body > h3:first-child, body > h4:first-child, body > h5:first-child, body > h6:first-child {
106
+ margin-top: 0;
107
+ padding-top: 0; }
108
+
109
+ a:first-child h1, a:first-child h2, a:first-child h3, a:first-child h4, a:first-child h5, a:first-child h6 {
110
+ margin-top: 0;
111
+ padding-top: 0; }
112
+
113
+ h1 p, h2 p, h3 p, h4 p, h5 p, h6 p {
114
+ margin-top: 0; }
115
+
116
+ li p.first {
117
+ display: inline-block; }
118
+
119
+ ul, ol {
120
+ padding-left: 30px; }
121
+
122
+ ul :first-child, ol :first-child {
123
+ margin-top: 0; }
124
+
125
+ ul :last-child, ol :last-child {
126
+ margin-bottom: 0; }
127
+
128
+ dl {
129
+ padding: 0; }
130
+ dl dt {
131
+ font-size: 14px;
132
+ font-weight: bold;
133
+ font-style: italic;
134
+ padding: 0;
135
+ margin: 15px 0 5px; }
136
+ dl dt:first-child {
137
+ padding: 0; }
138
+ dl dt > :first-child {
139
+ margin-top: 0; }
140
+ dl dt > :last-child {
141
+ margin-bottom: 0; }
142
+ dl dd {
143
+ margin: 0 0 15px;
144
+ padding: 0 15px; }
145
+ dl dd > :first-child {
146
+ margin-top: 0; }
147
+ dl dd > :last-child {
148
+ margin-bottom: 0; }
149
+
150
+ blockquote {
151
+ border-left: 4px solid #dddddd;
152
+ padding: 0 15px;
153
+ color: #777777; }
154
+ blockquote > :first-child {
155
+ margin-top: 0; }
156
+ blockquote > :last-child {
157
+ margin-bottom: 0; }
158
+
159
+ table {
160
+ padding: 0; }
161
+ table tr {
162
+ border-top: 1px solid #cccccc;
163
+ background-color: white;
164
+ margin: 0;
165
+ padding: 0; }
166
+ table tr:nth-child(2n) {
167
+ background-color: #f8f8f8; }
168
+ table tr th {
169
+ font-weight: bold;
170
+ border: 1px solid #cccccc;
171
+ text-align: left;
172
+ margin: 0;
173
+ padding: 6px 13px; }
174
+ table tr td {
175
+ border: 1px solid #cccccc;
176
+ text-align: left;
177
+ margin: 0;
178
+ padding: 6px 13px; }
179
+ table tr th :first-child, table tr td :first-child {
180
+ margin-top: 0; }
181
+ table tr th :last-child, table tr td :last-child {
182
+ margin-bottom: 0; }
183
+
184
+ img {
185
+ max-width: 100%; }
186
+
187
+ span.frame {
188
+ display: block;
189
+ overflow: hidden; }
190
+ span.frame > span {
191
+ border: 1px solid #dddddd;
192
+ display: block;
193
+ float: left;
194
+ overflow: hidden;
195
+ margin: 13px 0 0;
196
+ padding: 7px;
197
+ width: auto; }
198
+ span.frame span img {
199
+ display: block;
200
+ float: left; }
201
+ span.frame span span {
202
+ clear: both;
203
+ color: #333333;
204
+ display: block;
205
+ padding: 5px 0 0; }
206
+ span.align-center {
207
+ display: block;
208
+ overflow: hidden;
209
+ clear: both; }
210
+ span.align-center > span {
211
+ display: block;
212
+ overflow: hidden;
213
+ margin: 13px auto 0;
214
+ text-align: center; }
215
+ span.align-center span img {
216
+ margin: 0 auto;
217
+ text-align: center; }
218
+ span.align-right {
219
+ display: block;
220
+ overflow: hidden;
221
+ clear: both; }
222
+ span.align-right > span {
223
+ display: block;
224
+ overflow: hidden;
225
+ margin: 13px 0 0;
226
+ text-align: right; }
227
+ span.align-right span img {
228
+ margin: 0;
229
+ text-align: right; }
230
+ span.float-left {
231
+ display: block;
232
+ margin-right: 13px;
233
+ overflow: hidden;
234
+ float: left; }
235
+ span.float-left span {
236
+ margin: 13px 0 0; }
237
+ span.float-right {
238
+ display: block;
239
+ margin-left: 13px;
240
+ overflow: hidden;
241
+ float: right; }
242
+ span.float-right > span {
243
+ display: block;
244
+ overflow: hidden;
245
+ margin: 13px auto 0;
246
+ text-align: right; }
247
+
248
+ code, tt {
249
+ margin: 0 2px;
250
+ padding: 0 5px;
251
+ white-space: nowrap;
252
+ border: 1px solid #eaeaea;
253
+ background-color: #f8f8f8;
254
+ border-radius: 3px; }
255
+
256
+ pre code {
257
+ margin: 0;
258
+ padding: 0;
259
+ white-space: pre;
260
+ border: none;
261
+ background: transparent; }
262
+
263
+ .highlight pre {
264
+ background-color: #f8f8f8;
265
+ border: 1px solid #cccccc;
266
+ font-size: 13px;
267
+ line-height: 19px;
268
+ overflow: auto;
269
+ padding: 6px 10px;
270
+ border-radius: 3px; }
271
+
272
+ pre {
273
+ background-color: #f8f8f8;
274
+ border: 1px solid #cccccc;
275
+ font-size: 13px;
276
+ line-height: 19px;
277
+ overflow: auto;
278
+ padding: 6px 10px;
279
+ border-radius: 3px; }
280
+ pre code, pre tt {
281
+ background-color: transparent;
282
+ border: none; }
283
+
@@ -0,0 +1,14 @@
1
+ require 'opener/webservice'
2
+
3
+ module Opener
4
+ class ConstituentParser
5
+ ##
6
+ # Constituent parser server powered by Sinatra.
7
+ #
8
+ class Server < Webservice
9
+ set :views, File.expand_path('../views', __FILE__)
10
+ text_processor ConstituentParser
11
+ accepted_params :input, :language
12
+ end # Server
13
+ end # ConstituentParser
14
+ end # Opener
@@ -0,0 +1,5 @@
1
+ module Opener
2
+ class ConstituentParser
3
+ VERSION = '1.0.0'
4
+ end # ConstituentParser
5
+ end # Opener
@@ -0,0 +1,88 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <link type="text/css" rel="stylesheet" href="markdown.css" />
5
+
6
+ <title>Constituent Parser Webservice</title>
7
+ </head>
8
+ <body>
9
+ <h1>Constituent Parser Webservice</h1>
10
+
11
+ <p>
12
+ * required
13
+
14
+ <br />
15
+
16
+ ** When entering a value no response will be displayed in the browser.
17
+ </p>
18
+
19
+ <form action="/" method="POST">
20
+ <div>
21
+ <label for="input">KAF input *</label>
22
+ <br />
23
+
24
+ <textarea id="input" name="input" cols="50" rows="10"></textarea>
25
+ </div>
26
+
27
+ <div>
28
+ <label for="language">Language</label>
29
+ <br />
30
+
31
+ <select id="language" name="language">
32
+ <option value="nl">Dutch</option>
33
+ <option value="en">English</option>
34
+ <option value="fr">French</option>
35
+ <option value="de">German</option>
36
+ <option value="it">Italian</option>
37
+ <option value="es">Spanish</option>
38
+ </select>
39
+ </div>
40
+
41
+ <% 5.times do |number| %>
42
+
43
+ <div>
44
+ <label for="callbacks">Callback URL <%= number + 1%> **</label>
45
+ <br />
46
+
47
+ <input id="callbacks" type="text" name="callbacks[]" />
48
+ </div>
49
+
50
+ <% end %>
51
+
52
+ <div>
53
+ <label for="error_callback">Error Callback</label>
54
+ <br />
55
+
56
+ <input id="error_callback" type="text" name="error_callback" />
57
+ </div>
58
+
59
+ <input type="submit" value="Submit" />
60
+ </form>
61
+
62
+ <h2>Actions</h2>
63
+
64
+ <dl>
65
+ <dt>GET /</dt>
66
+ <dd>Shows this page</dd>
67
+
68
+ <dt>POST /</dt>
69
+ <dd>Submits a KAF document</dd>
70
+ </dl>
71
+
72
+ <h2>Parameters</h2>
73
+
74
+ <dl>
75
+ <dt>text *</dt>
76
+ <dd>The KAF document to process.</dd>
77
+
78
+ <dt>language</dt>
79
+ <dd>The language (code) to use, e.g. "en" or "fr".</dd>
80
+
81
+ <dt>callbacks</dt>
82
+ <dd>A collection of callback URLs that are processed as a chain.</dd>
83
+
84
+ <dt>error_callback</dt>
85
+ <dd>Errors are submitted to this URL in the "error" field.</dd>
86
+ </dl>
87
+ </body>
88
+ </html>
@@ -0,0 +1,98 @@
1
+ require 'open3'
2
+ require 'optparse'
3
+ require 'opener/constituent_parsers/base'
4
+
5
+ require_relative 'constituent_parser/version'
6
+ require_relative 'constituent_parser/cli'
7
+
8
+ module Opener
9
+ ##
10
+ # Constituent parser for various languages such as English and German.
11
+ #
12
+ # @!attribute [r] options
13
+ # @return [Hash]
14
+ #
15
+ class ConstituentParser
16
+ attr_reader :options
17
+
18
+ ##
19
+ # Returns the default language to use.
20
+ #
21
+ # @return [String]
22
+ #
23
+ DEFAULT_LANGUAGE = 'en'.freeze
24
+
25
+ ##
26
+ # Hash containing the default options to use.
27
+ #
28
+ # @return [Hash]
29
+ #
30
+ DEFAULT_OPTIONS = {
31
+ :args => [],
32
+ :language => DEFAULT_LANGUAGE
33
+ }.freeze
34
+
35
+ ##
36
+ # @param [Hash] options
37
+ # @see Opener::ConstituentParsers::Base#initialize
38
+ #
39
+ def initialize(options = {})
40
+ @options = DEFAULT_OPTIONS.merge(options)
41
+ end
42
+
43
+ ##
44
+ # Processes the input and returns an array containing the output of STDOUT,
45
+ # STDERR and an object containing process information.
46
+ #
47
+ # @param [String] input
48
+ # @return [Array]
49
+ #
50
+ def run(input)
51
+ args = options[:args].dup
52
+
53
+ if language_constant_defined?
54
+ kernel = language_constant.new(:args => args)
55
+ else
56
+ kernel = ConstituentParsers::Base.new(
57
+ :args => args,
58
+ :language => options[:language]
59
+ )
60
+ end
61
+
62
+ return kernel.run(input)
63
+ end
64
+
65
+ ##
66
+ # @return [String]
67
+ #
68
+ def output_type
69
+ return 'text/plain'
70
+ end
71
+
72
+ protected
73
+
74
+
75
+ ##
76
+ # Returns `true` if the current language has a dedicated kernel class.
77
+ #
78
+ # @return [TrueClass|FalseClass]
79
+ #
80
+ def language_constant_defined?
81
+ return ConstituentParsers.const_defined?(language_constant_name)
82
+ end
83
+
84
+ ##
85
+ # @return [String]
86
+ #
87
+ def language_constant_name
88
+ return options[:language].upcase
89
+ end
90
+
91
+ ##
92
+ # @return [Class]
93
+ #
94
+ def language_constant
95
+ return ConstituentParsers.const_get(language_constant_name)
96
+ end
97
+ end # ConstituentParser
98
+ end # Opener
@@ -0,0 +1,27 @@
1
+ require File.expand_path('../lib/opener/constituent_parser/version', __FILE__)
2
+
3
+ Gem::Specification.new do |gem|
4
+ gem.name = 'opener-constituent-parser'
5
+ gem.version = Opener::ConstituentParser::VERSION
6
+ gem.authors = ['development@olery.com']
7
+ gem.summary = 'Constituent parser including a webservice.'
8
+ gem.description = gem.summary
9
+ gem.has_rdoc = 'yard'
10
+
11
+ gem.required_ruby_version = '>= 1.9.2'
12
+
13
+ gem.files = Dir.glob([
14
+ 'lib/**/*.*',
15
+ '*.gemspec',
16
+ 'README.md',
17
+ 'config.ru'
18
+ ])
19
+
20
+ gem.executables = Dir.glob('bin/*').map { |f| File.basename(f) }
21
+
22
+ gem.add_dependency 'opener-webservice'
23
+ gem.add_dependency 'opener-constituent-parser-base', '>= 0.1.0'
24
+
25
+ gem.add_development_dependency 'opener-build-tools'
26
+ gem.add_development_dependency 'rake'
27
+ end
metadata ADDED
@@ -0,0 +1,112 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: opener-constituent-parser
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - development@olery.com
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2014-05-19 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: opener-webservice
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
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: opener-constituent-parser-base
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: 0.1.0
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: 0.1.0
41
+ - !ruby/object:Gem::Dependency
42
+ name: opener-build-tools
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
+ description: Constituent parser including a webservice.
70
+ email:
71
+ executables:
72
+ - constituent-parser
73
+ - constituent-parser-server
74
+ extensions: []
75
+ extra_rdoc_files: []
76
+ files:
77
+ - README.md
78
+ - bin/constituent-parser
79
+ - bin/constituent-parser-server
80
+ - config.ru
81
+ - lib/opener/constituent_parser.rb
82
+ - lib/opener/constituent_parser/cli.rb
83
+ - lib/opener/constituent_parser/public/markdown.css
84
+ - lib/opener/constituent_parser/server.rb
85
+ - lib/opener/constituent_parser/version.rb
86
+ - lib/opener/constituent_parser/views/index.erb
87
+ - opener-constituent-parser.gemspec
88
+ homepage:
89
+ licenses: []
90
+ metadata: {}
91
+ post_install_message:
92
+ rdoc_options: []
93
+ require_paths:
94
+ - lib
95
+ required_ruby_version: !ruby/object:Gem::Requirement
96
+ requirements:
97
+ - - ">="
98
+ - !ruby/object:Gem::Version
99
+ version: 1.9.2
100
+ required_rubygems_version: !ruby/object:Gem::Requirement
101
+ requirements:
102
+ - - ">="
103
+ - !ruby/object:Gem::Version
104
+ version: '0'
105
+ requirements: []
106
+ rubyforge_project:
107
+ rubygems_version: 2.2.2
108
+ signing_key:
109
+ specification_version: 4
110
+ summary: Constituent parser including a webservice.
111
+ test_files: []
112
+ has_rdoc: yard