tiered_category_expressions 0.1.3 → 0.3.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
- SHA1:
3
- metadata.gz: 5501de321cdb8513c0913ceb5163822615701500
4
- data.tar.gz: 24748da10d31e3f935e315582cbc98cc6c6c069f
2
+ SHA256:
3
+ metadata.gz: 9ac6214a3dfb2749c9257aa613e50769f52300ce5575b6abaee93e72fbbf7211
4
+ data.tar.gz: 5974153a9628f5af2f5150641f89e1e92ba9c34e9a82cf94b1bff676b9250e89
5
5
  SHA512:
6
- metadata.gz: 6829ffcf02a4b9bc5fb9d0dd1ef0c80161fed35220eaee6689c867b817261bfcd2d2fcb8f4329a02fc4df887d706e42ccc58cadfb0dd55dda75c60450ce9cc5d
7
- data.tar.gz: 49fc8d928beabb5d4a165aa5d9f4a0f7ff11156e5e11006667ed83cec416dbd5d0386f6c5785beb7e3cbbc5f9c5b49740da2349a25345f435fa0eed309d90625
6
+ metadata.gz: 650310edc447e6449185ea5e29758144bc1144006fdb3d69bdf6d421554fe27980b5725669813c2d6595f2d4a60850911319ba8be280f0210a9ba019b647f97b
7
+ data.tar.gz: 959601a68c6762110177bd954b044b95de5a4d62a3f2f6b4212d1ad3bcca2d13986d28fb118d7d712fbfba99ca4e9b14dbb52994441542e0a57ad8caac1dda17
@@ -0,0 +1,54 @@
1
+ # This configures how Dependabot presents us with dependency updates.
2
+ #
3
+ # Security updates are by definition urgent and bypass this configuration. They are offered as soon as available.
4
+ # Regular updates are offered based on the schedule defined here
5
+ #
6
+ # Docs: https://docs.github.com/en/github/administering-a-repository/keeping-your-dependencies-updated-automatically
7
+ # Config options: https://docs.github.com/en/code-security/dependabot/dependabot-version-updates/configuration-options-for-the-dependabot.yml-file#configuration-options-for-the-dependabotyml-file
8
+ #
9
+ # Choice: update on Tuesday
10
+ #
11
+ # A lot of open source updates happen in the weekend.
12
+ # A lot of companies apply these updates on Monday and discover bugs. Critical bugs will get fixed within 24h.
13
+ # Waiting until Tuesday to update likely results in slightly more stable updates than Monday.
14
+ #
15
+ #
16
+ # Choice: update a few small dependencies each week, to keep the time investment small (max 1h)
17
+ #
18
+ # Making a small, continuous effort to stay up-to-date is more important than always being on the bleeding edge.
19
+ # Dependabot updates are intended for the low-hanging fruit.
20
+ #
21
+ #
22
+ # Choice: major updates (such as Rails) don't have to be applied this way
23
+ #
24
+ # Updates that don't apply cleanly can be ignored. Just turn them into a Maintenance Issue so someone can pick it up later.
25
+
26
+ version: 2
27
+ updates:
28
+ # GitHub Actions
29
+ - package-ecosystem: github-actions
30
+ directory: '/'
31
+ open-pull-requests-limit: 5
32
+ schedule:
33
+ interval: weekly
34
+ day: tuesday
35
+ time: "07:00"
36
+ timezone: "Europe/Amsterdam"
37
+ pull-request-branch-name:
38
+ separator: "-"
39
+ reviewers:
40
+ - "wvengen"
41
+
42
+ # Ruby gems
43
+ - package-ecosystem: bundler
44
+ directory: '/'
45
+ open-pull-requests-limit: 5
46
+ schedule:
47
+ interval: weekly
48
+ day: tuesday
49
+ time: "07:00"
50
+ timezone: "Europe/Amsterdam"
51
+ pull-request-branch-name:
52
+ separator: "-"
53
+ reviewers:
54
+ - "wvengen"
@@ -0,0 +1,29 @@
1
+ name: CI
2
+
3
+ on:
4
+ push:
5
+ branches:
6
+ - main
7
+
8
+ pull_request:
9
+
10
+ jobs:
11
+ build:
12
+ runs-on: ubuntu-latest
13
+ name: On Ruby ${{ matrix.ruby }}
14
+ strategy:
15
+ matrix:
16
+ ruby:
17
+ - '2.7.6'
18
+ - '3.0.4'
19
+ - '3.1.2'
20
+
21
+ steps:
22
+ - uses: actions/checkout@v3
23
+ - name: Set up Ruby
24
+ uses: ruby/setup-ruby@v1
25
+ with:
26
+ ruby-version: ${{ matrix.ruby }}
27
+ bundler-cache: true
28
+ - name: Run the CI task, which runs tests, rubocop and builds the gem
29
+ run: bundle exec rake ci
data/Gemfile CHANGED
@@ -1,4 +1,19 @@
1
- source 'https://rubygems.org'
1
+ # frozen_string_literal: true
2
2
 
3
- # Specify your gem's dependencies in tiered_category_expressions.gemspec
3
+ source "https://rubygems.org"
4
+
5
+ # Specify your gem's runtime dependencies in questionmark-barcodes.gemspec
4
6
  gemspec
7
+
8
+ #
9
+ # These dependencies are only used for development.
10
+ #
11
+
12
+ # Rake wraps common tasks such as running tools and generating releases
13
+ gem "rake", "~> 13.0"
14
+
15
+ # RSpec is our test framework
16
+ gem "rspec", "~> 3.12"
17
+
18
+ # Documentation
19
+ gem "yard", "~> 0.9.34"
data/LANGREF.md CHANGED
@@ -1,4 +1,4 @@
1
- # TCE language reference
1
+ # TCE v1.1 language reference
2
2
 
3
3
  ## Introduction
4
4
 
@@ -14,6 +14,7 @@ TCEs follow the same structure. They consist of category tier names separated by
14
14
 
15
15
  - `agf > groente`
16
16
  - `agf > groente > komkommer`
17
+ - `agf > groente > komkommer.`
17
18
  - `agf > groente > kom%`
18
19
  - `agf > groente | fruit > komkommer`
19
20
  - `agf > groente > !tomaat`
@@ -27,7 +28,7 @@ When a TCE is matched with a category:
27
28
  - Letter case is ignored, e.g. both "NONFOOD" and "NonFood" match "nonfood" and vice versa.
28
29
  - Everything other than alphabetic and numeric characters (including spaces) is ignored, e.g. "nonfood" matches both "non-food" and "non food".
29
30
  - Accents are ignored, e.g. "knäckebröd" matches "knackebrod" and vice versa.
30
- - It matches a _subtree_ of categories, e.g. the TCE `"nonfood"` matches the category `["Nonfood"]` as well as `["Nonfood", "Schoonmaak", "Soda"]`.
31
+ - By default it matches a _subtree_ of categories, e.g. the TCE `"nonfood"` matches the category `["Nonfood"]` as well as `["Nonfood", "Schoonmaak", "Soda"]`.
31
32
 
32
33
  Even though they are ignored, tier names in TCEs may contain spaces, upper and lowercase characters and accented characters. To the contrary, they **cannot** contain special characters.
33
34
 
@@ -105,6 +106,41 @@ Note that TCEs are considered equal if they match the same categories. E.g. thes
105
106
  ["Rucola"]
106
107
  ```
107
108
 
109
+ ### Explicit last tier(s) `.`
110
+ ```ruby
111
+ "agf > groente > komkommer."
112
+
113
+ # Matches
114
+ ["AGF", "Groente", "Komkommer"]
115
+
116
+ # Does not match
117
+ ["AGF", "Groente", "Komkommer", "Snack komkommer"]
118
+ ```
119
+
120
+ ```ruby
121
+ "agf > groente. > komkommer"
122
+
123
+ # Matches
124
+ ["AGF", "Groente"]
125
+ ["AGF", "Groente", "Komkommer"]
126
+ ["AGF", "Groente", "Komkommer", "Snack komkommer"]
127
+
128
+ # Does not match
129
+ ["AGF", "Groente", "Tomaat"]
130
+ ```
131
+
132
+ ```ruby
133
+ "agf > groente. > komkommer."
134
+
135
+ # Matches
136
+ ["AGF", "Groente"]
137
+ ["AGF", "Groente", "Komkommer"]
138
+
139
+ # Does not match
140
+ ["AGF", "Groente", "Tomaat"]
141
+ ["AGF", "Groente", "Komkommer", "Snack komkommer"]
142
+ ```
143
+
108
144
  ### Combining patterns
109
145
  ```ruby
110
146
  "groente > seizoensgroente > %"
@@ -142,3 +178,21 @@ Note that TCEs are considered equal if they match the same categories. E.g. thes
142
178
  ["Nonfood", "Diervoeding"]
143
179
  ["Nonfood"]
144
180
  ```
181
+
182
+ ```ruby
183
+ "voeding. >> %voeding."
184
+
185
+ # Matches
186
+ ["Voeding"]
187
+ ["Voeding", "Babyvoeding"]
188
+ ["Voeding", "Diervoeding"]
189
+ ["Voeding", "Baby", "Babyvoeding"]
190
+ ["Voeding", "Dier", "Diervoeding"]
191
+
192
+ # Does not match
193
+ ["Voeding", "AGF"]
194
+ ["Voeding", "Babyvoeding", "Newborn"]
195
+ ["Voeding", "Diervoeding", "Hond"]
196
+ ["Voeding", "Baby", "Babyvoeding", "Newborn"]
197
+ ["Voeding", "Dier", "Diervoeding", "Hond"]
198
+ ```
data/README.md CHANGED
@@ -1,6 +1,10 @@
1
+ <div style="float: right">
2
+ <a href="https://badge.fury.io/rb/tiered_category_expressions"><img src="https://badge.fury.io/rb/tiered_category_expressions.svg" alt="Rubygem" height="18" /></a>
3
+ </div>
4
+
1
5
  # Tiered Category Expressions
2
6
 
3
- Work with TCEs in Ruby.
7
+ Work with TCE v1.1 in Ruby.
4
8
 
5
9
  ## Installation
6
10
 
@@ -34,12 +38,13 @@ require 'tiered_category_expressions/core'
34
38
 
35
39
  - [Library documentation](https://www.rubydoc.info/gems/tiered_category_expressions/)
36
40
  - [TCE language reference](https://www.rubydoc.info/gems/tiered_category_expressions/file/LANGREF.md)
41
+ - [Introductory blogpost](https://developers.thequestionmark.org/2019/07/24/pattern-matching-expert-system-classification)
37
42
 
38
43
  ## Usage examples
39
44
 
40
45
  ```ruby
41
46
  tce = TCE("groceries > nonfood | pharmacy >> !baby formula")
42
- # => TieredCategoryExpressions::Expression[groceries > nonfood | pharmacy >> !baby formula]
47
+ # => TieredCategoryExpressions::Expression
43
48
 
44
49
  tce.matches?(["Groceries", "Non-food", "Cleaning", "Soap"])
45
50
  # => true
@@ -51,13 +56,13 @@ tce.matches?(["Groceries", "Pharmacy", "Baby", "Pacifiers"])
51
56
  # => true
52
57
 
53
58
  tce.to_regexp
54
- # => /^(groceries)>(nonfood|pharmacy)>(?!(.+>)*(babyformula)>).+>/i
59
+ # => Regexp
55
60
 
56
61
  tce.as_regexp
57
- # => "^(groceries)>(nonfood|pharmacy)>(?!(.+>)*(babyformula)>).+>"
62
+ # => String
58
63
 
59
64
  TCE("groceries > nonfood") > TCE("baby") > ">> pacifiers"
60
- # => TieredCategoryExpressions::Expression[groceries > nonfood > baby >> pacifiers]
65
+ # => TieredCategoryExpressions::Expression
61
66
  ```
62
67
 
63
68
  ## Development
data/Rakefile CHANGED
@@ -1,9 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Disable pushing the gem to rubygems
4
+ # Source: https://github.com/rubygems/rubygems/blob/master/bundler/lib/bundler/gem_helper.rb#L231
5
+ ENV["gem_push"] = "no"
6
+
1
7
  require "bundler/gem_tasks"
2
8
  require "rspec/core/rake_task"
3
9
 
4
10
  RSpec::Core::RakeTask.new(:spec)
5
11
 
6
- task :default => :spec
12
+ desc "Run all tasks required to pass CI"
13
+ task ci: %i[spec build]
7
14
 
8
15
  namespace :docs do
9
16
  desc "Build the YARD documentation"
@@ -20,3 +27,5 @@ end
20
27
 
21
28
  desc "Build and view the YARD documentation"
22
29
  task :docs => ["docs:build", "docs:view"]
30
+
31
+ task default: %i[ci]
@@ -36,9 +36,12 @@ module TieredCategoryExpressions
36
36
  raise ParseError, "unexpected input at character #{column}"
37
37
  end
38
38
 
39
+ # @param strict [Boolean] If +true+ is given then the object should not match categories with tiers that extend
40
+ # beyond those specified by the TCE. This is the case when the TCE ends with ".".
39
41
  # @!visibility private
40
- def initialize(tiers)
42
+ def initialize(tiers, strict:)
41
43
  @tiers = tiers
44
+ @strict = !!strict
42
45
  end
43
46
 
44
47
  # @!visibility private
@@ -46,14 +49,18 @@ module TieredCategoryExpressions
46
49
  "TieredCategoryExpressions::Expression[#{self}]"
47
50
  end
48
51
 
52
+ # @param implied_root [Boolean] If +true+ no leading ">" is included.
49
53
  # @return [String] String representation of the expression
50
- def to_s
51
- @tiers.join(" ").sub(/^>(?!>)\s*/, "") # Initial ">" is implied (but ">>" is not)
54
+ def to_s(implied_root: true)
55
+ str = @tiers.join(" ")
56
+ str << "." if @strict
57
+ str = str.sub(/^>(?!>)\s*/, "") if implied_root # Initial ">" is implied (but ">>" is not)
58
+ str
52
59
  end
53
60
 
54
61
  # @return [Regexp] Regexp representation of the expression as a string (does not include flags)
55
62
  def as_regexp
56
- "^#{@tiers.map(&:as_regexp).join}"
63
+ "^#{@tiers.map(&:as_regexp).join}#{'$' if @strict}"
57
64
  end
58
65
 
59
66
  # @return [String] Regexp representation of the expression
@@ -65,6 +72,7 @@ module TieredCategoryExpressions
65
72
  #
66
73
  # @param category [Array<String>] Category to match
67
74
  # @return [Boolean]
75
+ #
68
76
  def matches?(category)
69
77
  to_regexp.match?(Preprocessor.call(category))
70
78
  end
@@ -89,14 +97,21 @@ module TieredCategoryExpressions
89
97
  # @return [Expression]
90
98
  #
91
99
  def >(other)
92
- self.class.new(@tiers + TieredCategoryExpressions::TCE(other).tiers)
100
+ TieredCategoryExpressions::TCE(to_s + TieredCategoryExpressions::TCE(other).to_s(implied_root: false))
101
+ end
102
+
103
+ # @return [Boolean] +true+ if the TCE object does not match categories with tiers that extend beyond those
104
+ # specified by the TCE. This is the case when the TCE ends with ".".
105
+ #
106
+ def strict?
107
+ @strict
93
108
  end
94
109
 
95
110
  # Returns an SQL LIKE query that may be used to speed up certain SQL queries.
96
111
  #
97
112
  # SQL queries that involve matching some input against stored TCE regexps can be slow. Possibly, they can be
98
113
  # optimized by applying a much faster LIKE query first, which reduces the number of regexps to apply. The LIKE
99
- # query alone still yields false positives, so it must be combined with the corresponding regexp.
114
+ # query alone can still yield false positives, so it must be combined with the corresponding regexp.
100
115
  #
101
116
  # For instance:
102
117
  #
@@ -109,7 +124,9 @@ module TieredCategoryExpressions
109
124
  # Depending on the TCEs in the _mappings_ table.
110
125
  #
111
126
  def as_sql_like_query
112
- @tiers.map(&:as_sql_like_query).join + "%"
127
+ q = @tiers.map(&:as_sql_like_query).join
128
+ q += "%" unless @strict || q.end_with?("%")
129
+ q
113
130
  end
114
131
 
115
132
  protected
@@ -11,14 +11,18 @@ module TieredCategoryExpressions
11
11
  # # => TieredCategoryExpressions::Expression[Nonfood > Baby > Baby formula]
12
12
  #
13
13
  # @param category [Array<String>]
14
+ # @param strict [Boolean] If +true+ is given then the resulting TCE will not match subcategories of the given
15
+ # category.
14
16
  # @return [Expression, nil]
15
17
  #
16
- def call(category)
18
+ def call(category, strict: false)
17
19
  return if category.empty?
18
20
 
19
21
  tiers = category.map { |t| sanitize_name(t) or return nil }
22
+ expression = tiers.join(">")
23
+ expression << "." if strict
20
24
 
21
- TieredCategoryExpressions::TCE(tiers.join(" > "))
25
+ TieredCategoryExpressions::TCE(expression)
22
26
  end
23
27
 
24
28
  private
@@ -17,9 +17,16 @@ module TieredCategoryExpressions
17
17
 
18
18
  rule(:word) { (match["[:alnum:]"] | str("%")).repeat(1) >> space? }
19
19
  rule(:name) { word.repeat(1).as(:name) }
20
- rule(:namelist) { (name >> (namesep >> name).repeat).as(:namelist) }
20
+ rule(:namelist) { (name.repeat(1, 1) >> (namesep >> name).repeat).as(:namelist) }
21
+
22
+ rule(:stop) { str(".") >> space? }
23
+
24
+ rule(:tier1) { (connector | negator).maybe.as(:operator) >> namelist }
25
+ rule(:tier) { connector.as(:operator) >> namelist }
26
+ rule(:tiers) { tier.repeat >> (stop >> (tier.repeat(1, 1) >> tiers).as(:tail)).maybe }
27
+
28
+ rule(:tce) { space? >> (tier1.repeat(1, 1) >> tiers).as(:tiers) >> stop.maybe.as(:eoct) }
21
29
 
22
- rule(:tce) { space? >> (((connector | negator).as(:operator).maybe >> namelist).as(:tier) >> (connector.as(:operator) >> namelist).as(:tier).repeat).as(:expression) }
23
30
  root(:tce)
24
31
  end
25
32
  end
@@ -0,0 +1,19 @@
1
+ module TieredCategoryExpressions
2
+ class Tail
3
+ def initialize(tiers)
4
+ @tiers = tiers
5
+ end
6
+
7
+ def to_s
8
+ ". " + @tiers.join(" ")
9
+ end
10
+
11
+ def as_regexp
12
+ "($|(#{@tiers.map(&:as_regexp).join}))"
13
+ end
14
+
15
+ def as_sql_like_query
16
+ "%"
17
+ end
18
+ end
19
+ end
@@ -1,5 +1,18 @@
1
1
  module TieredCategoryExpressions
2
2
  class Tier < Struct.new(:operator, :namelist)
3
+ def self.build(operator, names)
4
+ klass = case operator&.to_s&.tr(" ", "")
5
+ when ">", nil then Child
6
+ when ">!", "!" then IChild
7
+ when ">>" then Descendant
8
+ when ">>!" then IDescendant
9
+ else raise "no such operator #{operator.inspect}"
10
+ end
11
+
12
+ namelist = Namelist.new(names)
13
+ klass.new(namelist)
14
+ end
15
+
3
16
  def to_s
4
17
  "#{operator} #{namelist}"
5
18
  end
@@ -32,7 +45,7 @@ module TieredCategoryExpressions
32
45
  end
33
46
 
34
47
  def as_regexp
35
- "(?!#{namelist.as_regexp}>).+>"
48
+ "(?!#{namelist.as_regexp}>)[a-z0-9]+>"
36
49
  end
37
50
 
38
51
  def as_sql_like_query
@@ -46,7 +59,7 @@ module TieredCategoryExpressions
46
59
  end
47
60
 
48
61
  def as_regexp
49
- "(.+>)*#{namelist.as_regexp}>"
62
+ "([a-z0-9]+>)*#{namelist.as_regexp}>"
50
63
  end
51
64
 
52
65
  def as_sql_like_query
@@ -60,7 +73,7 @@ module TieredCategoryExpressions
60
73
  end
61
74
 
62
75
  def as_regexp
63
- "(?!(.+>)*#{namelist.as_regexp}>).+>"
76
+ "(?!([a-z0-9]+>)*#{namelist.as_regexp}>)([a-z0-9]+>)+"
64
77
  end
65
78
 
66
79
  def as_sql_like_query
@@ -2,25 +2,25 @@ require "parslet"
2
2
  require "tiered_category_expressions/name"
3
3
  require "tiered_category_expressions/namelist"
4
4
  require "tiered_category_expressions/tiers"
5
+ require "tiered_category_expressions/tail"
5
6
  require "tiered_category_expressions/expression"
6
7
 
7
8
  module TieredCategoryExpressions
8
9
  class Transformer < Parslet::Transform
9
- rule(:name => simple(:name)) { Name.new(name.to_s) }
10
+ rule(:name => simple(:name)) do
11
+ Name.new(name.to_s)
12
+ end
10
13
 
11
- rule(:tier => subtree(:tier)) do
12
- klass = case tier[:operator]&.to_s&.tr(" ", "")
13
- when ">", nil then Tier::Child
14
- when ">!", "!" then Tier::IChild
15
- when ">>" then Tier::Descendant
16
- when ">>!" then Tier::IDescendant
17
- else raise "no such operator #{tier[:operator].inspect}"
18
- end
14
+ rule(:operator => simple(:op), :namelist => sequence(:names)) do
15
+ Tier.build(op, names)
16
+ end
19
17
 
20
- namelist = Namelist.new([tier[:namelist]].flatten)
21
- klass.new(namelist)
18
+ rule(:tail => sequence(:tiers)) do
19
+ Tail.new(tiers)
22
20
  end
23
21
 
24
- rule(:expression => subtree(:tiers)) { Expression.new([tiers].flatten) }
22
+ rule(:tiers => sequence(:tiers), :eoct => simple(:eoct)) do
23
+ Expression.new(tiers, strict: !!eoct)
24
+ end
25
25
  end
26
26
  end
@@ -1,3 +1,3 @@
1
1
  module TieredCategoryExpressions
2
- VERSION = "0.1.3"
2
+ VERSION = "0.3.0"
3
3
  end
@@ -29,10 +29,5 @@ Gem::Specification.new do |spec|
29
29
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
30
30
  spec.require_paths = ["lib"]
31
31
 
32
- spec.add_development_dependency "bundler", "~> 1.13"
33
- spec.add_development_dependency "rake", "~> 10.0"
34
- spec.add_development_dependency "rspec", "~> 3.0"
35
- spec.add_development_dependency "pry"
36
- spec.add_development_dependency "pry-coolline"
37
- spec.add_runtime_dependency "parslet", "~> 1.8"
32
+ spec.add_runtime_dependency "parslet", "~> 2.0"
38
33
  end
metadata CHANGED
@@ -1,99 +1,29 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: tiered_category_expressions
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.3
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sjoerd Andringa
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2019-05-03 00:00:00.000000000 Z
11
+ date: 2023-08-22 00:00:00.000000000 Z
12
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: '1.13'
20
- type: :development
21
- prerelease: false
22
- version_requirements: !ruby/object:Gem::Requirement
23
- requirements:
24
- - - "~>"
25
- - !ruby/object:Gem::Version
26
- version: '1.13'
27
- - !ruby/object:Gem::Dependency
28
- name: rake
29
- requirement: !ruby/object:Gem::Requirement
30
- requirements:
31
- - - "~>"
32
- - !ruby/object:Gem::Version
33
- version: '10.0'
34
- type: :development
35
- prerelease: false
36
- version_requirements: !ruby/object:Gem::Requirement
37
- requirements:
38
- - - "~>"
39
- - !ruby/object:Gem::Version
40
- version: '10.0'
41
- - !ruby/object:Gem::Dependency
42
- name: rspec
43
- requirement: !ruby/object:Gem::Requirement
44
- requirements:
45
- - - "~>"
46
- - !ruby/object:Gem::Version
47
- version: '3.0'
48
- type: :development
49
- prerelease: false
50
- version_requirements: !ruby/object:Gem::Requirement
51
- requirements:
52
- - - "~>"
53
- - !ruby/object:Gem::Version
54
- version: '3.0'
55
- - !ruby/object:Gem::Dependency
56
- name: pry
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: pry-coolline
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
13
  - !ruby/object:Gem::Dependency
84
14
  name: parslet
85
15
  requirement: !ruby/object:Gem::Requirement
86
16
  requirements:
87
17
  - - "~>"
88
18
  - !ruby/object:Gem::Version
89
- version: '1.8'
19
+ version: '2.0'
90
20
  type: :runtime
91
21
  prerelease: false
92
22
  version_requirements: !ruby/object:Gem::Requirement
93
23
  requirements:
94
24
  - - "~>"
95
25
  - !ruby/object:Gem::Version
96
- version: '1.8'
26
+ version: '2.0'
97
27
  description:
98
28
  email:
99
29
  - sjoerd@thequestionmark.org
@@ -101,10 +31,11 @@ executables: []
101
31
  extensions: []
102
32
  extra_rdoc_files: []
103
33
  files:
34
+ - ".github/dependabot.yml"
35
+ - ".github/workflows/main.yml"
104
36
  - ".gitignore"
105
37
  - ".rspec"
106
38
  - ".ruby-version"
107
- - ".travis.yml"
108
39
  - ".yardopts"
109
40
  - Gemfile
110
41
  - LANGREF.md
@@ -122,6 +53,7 @@ files:
122
53
  - lib/tiered_category_expressions/namelist.rb
123
54
  - lib/tiered_category_expressions/parser.rb
124
55
  - lib/tiered_category_expressions/preprocessor.rb
56
+ - lib/tiered_category_expressions/tail.rb
125
57
  - lib/tiered_category_expressions/tiers.rb
126
58
  - lib/tiered_category_expressions/transformer.rb
127
59
  - lib/tiered_category_expressions/util.rb
@@ -147,8 +79,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
147
79
  - !ruby/object:Gem::Version
148
80
  version: '0'
149
81
  requirements: []
150
- rubyforge_project:
151
- rubygems_version: 2.6.14.3
82
+ rubygems_version: 3.1.6
152
83
  signing_key:
153
84
  specification_version: 4
154
85
  summary: Tiered category expressions
data/.travis.yml DELETED
@@ -1,5 +0,0 @@
1
- sudo: false
2
- language: ruby
3
- rvm:
4
- - 2.4.5
5
- before_install: gem install bundler -v 1.13.6