srx 0.1.0 → 0.6.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 18c2fc1da5f4a792393a9dd4955c79d73bc9d00943000f38689a5763d8c8ff4c
4
- data.tar.gz: 2385b9f65e61ad291e1419e217b737653bbeea0d4f62dc7fbb4ae35e6948984c
3
+ metadata.gz: f678f4fe5e7f30edbe600f27a5dd00217528d84291248ebf76f8d5c4df62f333
4
+ data.tar.gz: 5d096e1688a5c57756bb86be9a31d504aa99cbb877de434737e5c4578808f4f1
5
5
  SHA512:
6
- metadata.gz: 915b837e6a239f7de688d51ca3fca2bbdcf898234f825cbd49894223e8c31f71167d6a22d9097a36ab75ea3fc8f383ae790d3df8e0e3fce2fb8210022412fad2
7
- data.tar.gz: 326d3de2c328aa49be07c7df62229fe40c8cf3b2c4101f090b9c805b9e3a2fcd1c8eec155b6b3af9c556ff5c548d5263425975bdc9b0368b334342ce47dd71d9
6
+ metadata.gz: 78d28e9ebb51c4ac61f2b15dc27d527f802a7a9c40812741ca817a14b0e231e0dce310f0b9c38411fb8dfe2f02953ca7344a90ad85fea5290d2b234be5795130
7
+ data.tar.gz: 2521273e4f164b44be0f43b2dd54cc17f380edc130e600c37cf8ef2b0ae847e287e91a59c036e638461462c7b2fc83401a5c348501429fe107becacbdd906188
@@ -13,7 +13,7 @@ jobs:
13
13
  ruby-version: 2.7.2
14
14
  - name: Install
15
15
  run: |
16
- gem install bundler -v 2.2.7
16
+ gem install bundler -v 2.2.9
17
17
  bundle install
18
18
  - name: Type check
19
19
  run: bundle exec solargraph typecheck --level typed
data/.rubocop.yml CHANGED
@@ -1,5 +1,9 @@
1
1
  inherit_from: .rubocop_todo.yml
2
2
 
3
+ inherit_mode:
4
+ merge:
5
+ - Exclude
6
+
3
7
  AllCops:
4
8
  TargetRubyVersion: 2.4
5
9
  SuggestExtensions: false
@@ -10,4 +14,4 @@ AllCops:
10
14
  Layout/LineLength:
11
15
  Max: 120
12
16
  Exclude:
13
- - 'test/srx/golden_rules_test.rb'
17
+ - 'test/golden_rules_test.rb'
data/.rubocop_todo.yml CHANGED
@@ -1,12 +1,12 @@
1
1
  # This configuration was generated by
2
2
  # `rubocop --auto-gen-config`
3
- # on 2021-02-08 14:52:03 UTC using RuboCop version 1.9.1.
3
+ # on 2021-02-25 04:43:35 UTC using RuboCop version 1.10.0.
4
4
  # The point is for the user to remove these configuration records
5
5
  # one by one as the offenses are removed from the code base.
6
6
  # Note that changes in the inspected code, or installation of new
7
7
  # versions of RuboCop, may require this file to be generated again.
8
8
 
9
- # Offense count: 3
9
+ # Offense count: 5
10
10
  # Configuration parameters: IgnoredMethods, CountRepeatedAttributes.
11
11
  Metrics/AbcSize:
12
12
  Max: 24
@@ -17,15 +17,15 @@ Metrics/AbcSize:
17
17
  Metrics/BlockLength:
18
18
  Max: 269
19
19
 
20
- # Offense count: 1
20
+ # Offense count: 2
21
21
  # Configuration parameters: IgnoredMethods.
22
22
  Metrics/CyclomaticComplexity:
23
23
  Max: 9
24
24
 
25
- # Offense count: 3
25
+ # Offense count: 9
26
26
  # Configuration parameters: CountComments, CountAsOne, ExcludedMethods, IgnoredMethods.
27
27
  Metrics/MethodLength:
28
- Max: 25
28
+ Max: 26
29
29
 
30
30
  # Offense count: 1
31
31
  # Configuration parameters: IgnoredMethods.
data/CHANGELOG.md ADDED
@@ -0,0 +1,29 @@
1
+ ## [Unreleased]
2
+
3
+ ## [0.6.0] - 2021-04-15
4
+
5
+ - Improved HTML parsing accuracy
6
+
7
+ ## [0.5.0] - 2021-02-25
8
+
9
+ - When `nil` is supplied for the `language` parameter, it is now treated as the
10
+ empty string for rule-matching purposes (previously it would match no rules)
11
+
12
+ ## [0.4.0] - 2021-02-18
13
+
14
+ - Optimize memory usage
15
+
16
+ ## [0.3.0] - 2021-02-16
17
+
18
+ - All `Srx::Engine` methods except `#segment` are now private
19
+ - ICU regex syntax `\xhhhh` is now no longer converted to Ruby regex, as this
20
+ syntax was not correct; it now must be `\x{hhhh}`
21
+ - ICU regex syntax `\0ooo` is now supported
22
+
23
+ ## [0.2.0] - 2021-02-13
24
+
25
+ - Handle HTML void elements correctly
26
+
27
+ ## [0.1.0] - 2021-02-13
28
+
29
+ - Initial release
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- srx (0.1.0)
4
+ srx (0.6.0)
5
5
  nokogiri (~> 1.11)
6
6
 
7
7
  GEM
@@ -14,29 +14,29 @@ GEM
14
14
  diff-lcs (1.4.4)
15
15
  e2mmap (0.1.0)
16
16
  jaro_winkler (1.5.4)
17
- kramdown (2.3.0)
17
+ kramdown (2.3.1)
18
18
  rexml
19
19
  kramdown-parser-gfm (1.1.0)
20
20
  kramdown (~> 2.0)
21
21
  memory_profiler (1.0.0)
22
- minitest (5.14.3)
23
- nokogiri (1.11.1-x86_64-darwin)
22
+ minitest (5.14.4)
23
+ nokogiri (1.11.3-x86_64-darwin)
24
24
  racc (~> 1.4)
25
25
  parallel (1.20.1)
26
- parser (3.0.0.0)
26
+ parser (3.0.1.0)
27
27
  ast (~> 2.4.1)
28
28
  racc (1.5.2)
29
29
  rainbow (3.0.0)
30
30
  rake (13.0.3)
31
- regexp_parser (2.0.3)
31
+ regexp_parser (2.1.1)
32
32
  reverse_markdown (2.0.0)
33
33
  nokogiri
34
- rexml (3.2.4)
34
+ rexml (3.2.5)
35
35
  rspec-expectations (3.10.1)
36
36
  diff-lcs (>= 1.2.0, < 2.0)
37
37
  rspec-support (~> 3.10.0)
38
38
  rspec-support (3.10.2)
39
- rubocop (1.9.1)
39
+ rubocop (1.12.1)
40
40
  parallel (~> 1.10)
41
41
  parser (>= 3.0.0.0)
42
42
  rainbow (>= 2.2.2, < 4.0)
@@ -48,7 +48,7 @@ GEM
48
48
  rubocop-ast (1.4.1)
49
49
  parser (>= 2.7.1.5)
50
50
  ruby-progressbar (1.11.0)
51
- solargraph (0.40.3)
51
+ solargraph (0.40.4)
52
52
  backport (~> 1.1)
53
53
  benchmark
54
54
  bundler (>= 1.17.2)
@@ -81,4 +81,4 @@ DEPENDENCIES
81
81
  srx!
82
82
 
83
83
  BUNDLED WITH
84
- 2.2.7
84
+ 2.2.9
data/README.md CHANGED
@@ -13,7 +13,10 @@ This gem provides facilities for reading SRX files and an engine for performing
13
13
  segmentation.
14
14
 
15
15
  Only a minimal rule set is supplied by default; for actual usage you are
16
- encouraged to supply your own SRX rules.
16
+ encouraged to supply your own SRX rules. One such set of rules is that from
17
+ [LanguageTool](https://languagetool.org/); this is conveniently packaged into a
18
+ companion gem:
19
+ [srx-languagetool-ruby](https://github.com/amake/srx-languagetool-ruby).
17
20
 
18
21
  ## What's different about this gem?
19
22
 
@@ -43,7 +46,21 @@ Some disadvantages:
43
46
  test](https://github.com/diasks2/pragmatic_segmenter#comparison-of-segmentation-tools-libraries-and-algorithms),
44
47
  scoring 47% (English) and 48% (others) with the default rules. However you can
45
48
  improve on that with better rules such as
46
- [LanguageTool's](https://github.com/languagetool-org/languagetool/blob/05707300df14668e97d064811931e0668f2b695b/languagetool-core/src/main/resources/org/languagetool/resource/segment.srx).
49
+ [LanguageTool's](https://github.com/amake/srx-languagetool-ruby).
50
+
51
+ ## Caveats
52
+
53
+ The SRX spec calls for [ICU regular
54
+ expressions](https://unicode-org.github.io/icu/userguide/strings/regexp.html),
55
+ but this library uses standard [Ruby
56
+ regexp](https://ruby-doc.org/core-2.7.0/Regexp.html). Please note:
57
+
58
+ - Not all ICU syntax is supported
59
+ - For supported syntax, in some cases the meaning of a regex may differ when
60
+ interpreted as Ruby regexp
61
+ - The following ICU syntax is supported through translation to Ruby syntax:
62
+ - `\x{hhhh}` → `\u{hhhh}`
63
+ - `\0ooo` → `\u{hhhh}`
47
64
 
48
65
  ## Installation
49
66
 
@@ -93,7 +110,7 @@ input = 'foo <bar baz="a. b."> bazinga'
93
110
  Srx::Engine.new(Data.default).segment(input, language: 'en')
94
111
  #=> ["foo <bar baz=\"a.", " b.\"> bazinga"]
95
112
 
96
- Srx::Engine.new(data, format: :xml).segment(input, language: 'en')
113
+ Srx::Engine.new(Data.default, format: :xml).segment(input, language: 'en')
97
114
  #=> ["foo <bar baz=\"a. b.\"> bazinga"]
98
115
  ```
99
116
 
data/lib/srx/data.rb CHANGED
@@ -43,23 +43,23 @@ module Srx
43
43
  end
44
44
 
45
45
  def segment_subflows?
46
- header['segmentsubflows'] == 'yes'
46
+ @segment_subflows ||= header['segmentsubflows'] == 'yes'
47
47
  end
48
48
 
49
49
  def cascade?
50
- header['cascade'] == 'yes'
50
+ @cascade ||= header['cascade'] == 'yes'
51
51
  end
52
52
 
53
53
  def include_start_formatting?
54
- include_formatting?(:start)
54
+ @include_start_formatting ||= include_formatting?(:start)
55
55
  end
56
56
 
57
57
  def include_end_formatting?
58
- include_formatting?(:end)
58
+ @include_end_formatting ||= include_formatting?(:end)
59
59
  end
60
60
 
61
61
  def include_isolated_formatting?
62
- include_formatting?(:isolated)
62
+ @include_isolated_formatting ||= include_formatting?(:isolated)
63
63
  end
64
64
 
65
65
  # @return [Array<LanguageRule>]
@@ -108,7 +108,7 @@ module Srx
108
108
  class LanguageRule < XmlWrapper
109
109
  # @return [String]
110
110
  def name
111
- @xml['languagerulename']
111
+ @name ||= @xml['languagerulename']
112
112
  end
113
113
 
114
114
  # @return [Array<Rule>]
@@ -130,13 +130,13 @@ module Srx
130
130
  # Eagerly load everything for this class because before_break and
131
131
  # after_break can be legitimately nil, so lazy loading gets ugly.
132
132
 
133
- @break = @xml['break'].nil? || @xml['break'] == 'yes'
133
+ @break = @xml['break'].then { |brk| brk.nil? || brk == 'yes' }
134
134
 
135
135
  @before_break = xpath(:beforebreak).first&.text.then do |pattern|
136
136
  IcuRegex.compile(pattern) if pattern
137
137
  end
138
138
 
139
- @after_break ||= xpath(:afterbreak).first&.text.then do |pattern|
139
+ @after_break = xpath(:afterbreak).first&.text.then do |pattern|
140
140
  IcuRegex.compile(pattern) if pattern
141
141
  end
142
142
  end
@@ -155,7 +155,7 @@ module Srx
155
155
  class LanguageMap < XmlWrapper
156
156
  # @return [String]
157
157
  def language_rule_name
158
- @xml['languagerulename']
158
+ @language_rule_name ||= @xml['languagerulename']
159
159
  end
160
160
 
161
161
  # @return [Regexp]
data/lib/srx/engine.rb CHANGED
@@ -7,7 +7,7 @@ module Srx
7
7
  attr_reader :data
8
8
 
9
9
  # @param data [Data]
10
- # @param markup [Regexp]
10
+ # @param format [Symbol] see {Format#get}
11
11
  def initialize(data, format: :text)
12
12
  @data = data
13
13
  @format = Format.get(format)
@@ -31,6 +31,8 @@ module Srx
31
31
  results
32
32
  end
33
33
 
34
+ private
35
+
34
36
  # @param language [String]
35
37
  # @return [Array<Data::Rule>]
36
38
  def rules(language)
@@ -43,9 +45,11 @@ module Srx
43
45
  names.flat_map { |name| rule_map[name].rules }
44
46
  end
45
47
 
46
- # @param language [String]
48
+ # @param language [String] nil treated as empty string
47
49
  # @return [Array<String>]
48
50
  def rule_names(language)
51
+ language ||= ''
52
+
49
53
  @data.map_rules.map do |lang_map|
50
54
  next unless lang_map.language_pattern.match?(language)
51
55
 
@@ -56,20 +60,19 @@ module Srx
56
60
  end
57
61
 
58
62
  # @param str [String]
59
- # @param pos [Integer] the position to start searching from
60
63
  # @param rules [Array<Data::LanguageRule::Rule>]
61
- # @return [Array(Integer,Data::LanguageRule::Rule)] an array of 1) the
62
- # position of a break, and 2) the rule that matched at that position. Note
63
- # that the final break will always be at the end of the string and may not
64
- # have an associated rule.
64
+ # @return [Array<Array(Integer,Data::LanguageRule::Rule)>] an array of pairs
65
+ # of 1) the position of a break, and 2) the rule that matched at that
66
+ # position. Note that the final break will always be at the end of the
67
+ # string and may not have an associated rule.
65
68
  def breaks_by_pos(str, rules)
66
- rules
67
- .flat_map { |rule| all_matches(str, rule) }
68
- .group_by(&:first)
69
- .transform_values { |pairs| pairs.first.last }
70
- .select { |_pos, rule| rule.break? }
71
- .sort_by(&:first)
72
- .tap { |breaks| breaks << [str.length] unless breaks&.last&.first == str.length }
69
+ grouped = rules.flat_map { |rule| all_matches(str, rule) }
70
+ .group_by(&:first)
71
+ grouped.transform_values! { |pairs| pairs.first.last }
72
+ grouped.select! { |_pos, rule| rule.break? }
73
+ result = grouped.sort_by(&:first)
74
+ result << [str.length] unless result.last&.first == str.length
75
+ result
73
76
  end
74
77
 
75
78
  # @param str [String]
data/lib/srx/format.rb CHANGED
@@ -3,6 +3,7 @@
3
3
  require_relative 'format/base_format'
4
4
  require_relative 'format/text'
5
5
  require_relative 'format/xml'
6
+ require_relative 'format/html'
6
7
 
7
8
  module Srx
8
9
  # Format-specific data and logic
@@ -10,11 +11,11 @@ module Srx
10
11
  FORMATS = {
11
12
  text: Text.new,
12
13
  xml: Xml.new,
13
- html: Xml.new # TODO: specialize for HTML
14
+ html: Html.new
14
15
  }.freeze
15
16
 
16
17
  class << self
17
- # @param format [Symbol]
18
+ # @param format [Symbol] see keys of {FORMATS} for accepted values
18
19
  # @return [BaseFormat]
19
20
  def get(format)
20
21
  raise(ArgumentError, "Unknown format: #{format}") unless FORMATS.key?(format)
@@ -0,0 +1,57 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'set'
4
+ require 'English'
5
+
6
+ module Srx
7
+ module Format
8
+ # Support for HTML. Tag grammar based on XML.
9
+ #
10
+ # @see https://www.w3.org/TR/xml/
11
+ # @see https://html.spec.whatwg.org/multipage/syntax.html
12
+ class Html < Xml
13
+ # Differs from XML in supporting unquoted values
14
+ # @see https://html.spec.whatwg.org/multipage/syntax.html#attributes-2
15
+ ATT_VALUE = /#{Xml::ATT_VALUE}|(?:[^<>&"'`=\u0020\u0009\u000D\u000A]|#{Xml::REFERENCE})+/.freeze
16
+
17
+ # Differs from XML in supporting empty attributes
18
+ # @see https://html.spec.whatwg.org/multipage/syntax.html#attributes-2
19
+ ATTRIBUTE = /#{Xml::NAME}(?:#{Xml::EQUALS}#{ATT_VALUE})?/.freeze
20
+
21
+ START_TAG = /<(?<name>#{Xml::NAME})(?:#{Xml::SPACE}#{ATTRIBUTE})*#{Xml::SPACE}?>/.freeze
22
+ EMPTY_ELEM_TAG = %r{<#{Xml::NAME}(?:#{Xml::SPACE}#{ATTRIBUTE})*#{Xml::SPACE}?/>}.freeze
23
+
24
+ TAG = /#{START_TAG}|#{Xml::END_TAG}|#{EMPTY_ELEM_TAG}/.freeze
25
+
26
+ # A set of HTML tags that are "void elements", meaning they do not need a
27
+ # paired closing tag.
28
+ #
29
+ # @see https://html.spec.whatwg.org/#void-elements
30
+ # @see https://developer.mozilla.org/en-US/docs/Web/HTML/Element/command
31
+ # @see https://developer.mozilla.org/en-US/docs/Web/HTML/Element/keygen
32
+ # @see https://developer.mozilla.org/en-US/docs/Web/HTML/Element/menuitem
33
+ VOID_ELEMENTS = Set[
34
+ 'area', 'base', 'br', 'col', 'command', 'embed', 'hr', 'img', 'input',
35
+ 'link', 'meta', 'menuitem', 'param', 'source', 'track', 'wbr'
36
+ ].freeze
37
+
38
+ def extract_markups(str)
39
+ extract_markups_by_pattern(str, TAG)
40
+ end
41
+
42
+ def start_formatting?(markup)
43
+ START_TAG.match(markup) do |m|
44
+ !VOID_ELEMENTS.include?(m['name'])
45
+ end
46
+ end
47
+
48
+ def isolated_formatting?(markup)
49
+ return true if EMPTY_ELEM_TAG.match?(markup)
50
+
51
+ START_TAG.match(markup) do |m|
52
+ VOID_ELEMENTS.include?(m['name'])
53
+ end
54
+ end
55
+ end
56
+ end
57
+ end
@@ -27,14 +27,7 @@ module Srx
27
27
  TAG = /#{START_TAG}|#{END_TAG}|#{EMPTY_ELEM_TAG}/.freeze
28
28
 
29
29
  def extract_markups(str)
30
- markups = []
31
-
32
- plain_text = str.gsub(TAG) do |match|
33
- markups << [$LAST_MATCH_INFO.begin(0), match]
34
- ''
35
- end
36
-
37
- [plain_text, markups]
30
+ extract_markups_by_pattern(str, TAG)
38
31
  end
39
32
 
40
33
  def start_formatting?(markup)
@@ -48,6 +41,21 @@ module Srx
48
41
  def isolated_formatting?(markup)
49
42
  EMPTY_ELEM_TAG.match?(markup)
50
43
  end
44
+
45
+ protected
46
+
47
+ # @param str [String]
48
+ # @param pattern [Regexp]
49
+ def extract_markups_by_pattern(str, pattern)
50
+ markups = []
51
+
52
+ plain_text = str.gsub(pattern) do |match|
53
+ markups << [$LAST_MATCH_INFO.begin(0), match]
54
+ ''
55
+ end
56
+
57
+ [plain_text, markups]
58
+ end
51
59
  end
52
60
  end
53
61
  end
data/lib/srx/icu_regex.rb CHANGED
@@ -3,13 +3,20 @@
3
3
  module Srx
4
4
  # Utilities for handling SRX (ICU) regular expressions
5
5
  module IcuRegex
6
- HEX_PATTERN = /(?<!\\)(?:\\\\)*\\x(?<hex>[a-f0-9]{4}|\{[a-f0-9]{4}\})/i.freeze
6
+ HEX_PATTERN = /(?<!\\)(?:\\\\)*\\x(?<hex>\{[a-f0-9]{1,6}\})/i.freeze
7
+ OCTAL_PATTERN = /(?<!\\)(?:\\\\)*\\0(?<oct>[0-7]{1,3})/i.freeze
7
8
 
8
9
  class << self
9
10
  # @param icu_regex [String]
10
11
  # @return [String]
11
12
  def to_ruby(icu_regex)
12
- icu_regex.gsub(HEX_PATTERN, '\u\k<hex>')
13
+ result = icu_regex.dup
14
+ result.gsub!(HEX_PATTERN, '\u\k<hex>')
15
+ result.gsub!(OCTAL_PATTERN) do |m|
16
+ $LAST_MATCH_INFO['oct'].to_i(8).then { |o| o <= 255 ? format(%q(\u{%x}), o) : m }
17
+ end
18
+
19
+ result
13
20
  end
14
21
 
15
22
  # @param icu_regex [String]
@@ -68,7 +68,7 @@
68
68
  \xff01: Fullwidth exclamation mark
69
69
  -->
70
70
  <rule break="yes">
71
- <beforebreak>[\xff61\x3002\xff0e\xff1f\xff01]+</beforebreak>
71
+ <beforebreak>[\x{ff61}\x{3002}\x{ff0e}\x{ff1f}\x{ff01}]+</beforebreak>
72
72
  <afterbreak></afterbreak>
73
73
  </rule>
74
74
  </languagerule>
data/lib/srx/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Srx
4
- VERSION = '0.1.0'
4
+ VERSION = '0.6.0'
5
5
  end
data/srx.gemspec CHANGED
@@ -15,6 +15,7 @@ Gem::Specification.new do |spec|
15
15
 
16
16
  spec.metadata['homepage_uri'] = spec.homepage
17
17
  spec.metadata['source_code_uri'] = 'https://github.com/amake/srx-ruby.git'
18
+ spec.metadata['changelog_uri'] = 'https://github.com/amake/srx-ruby/blob/master/CHANGELOG.md'
18
19
 
19
20
  # Specify which files should be added to the gem when it is released.
20
21
  # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: srx
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.6.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Aaron Madlon-Kay
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2021-02-13 00:00:00.000000000 Z
11
+ date: 2021-04-15 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: nokogiri
@@ -135,6 +135,7 @@ files:
135
135
  - ".rubocop.yml"
136
136
  - ".rubocop_todo.yml"
137
137
  - ".solargraph.yml"
138
+ - CHANGELOG.md
138
139
  - Gemfile
139
140
  - Gemfile.lock
140
141
  - LICENSE.txt
@@ -150,6 +151,7 @@ files:
150
151
  - lib/srx/engine.rb
151
152
  - lib/srx/format.rb
152
153
  - lib/srx/format/base_format.rb
154
+ - lib/srx/format/html.rb
153
155
  - lib/srx/format/text.rb
154
156
  - lib/srx/format/xml.rb
155
157
  - lib/srx/icu_regex.rb
@@ -163,6 +165,7 @@ licenses:
163
165
  metadata:
164
166
  homepage_uri: https://github.com/amake/srx-ruby
165
167
  source_code_uri: https://github.com/amake/srx-ruby.git
168
+ changelog_uri: https://github.com/amake/srx-ruby/blob/master/CHANGELOG.md
166
169
  post_install_message:
167
170
  rdoc_options: []
168
171
  require_paths: