From ae135736c46d12c58c8813f05ee94fad250a2062 Mon Sep 17 00:00:00 2001 From: Edgar Gonzalez Date: Tue, 13 Jun 2023 19:36:16 -0400 Subject: [PATCH 01/23] Add rbs gem --- Gemfile | 1 + 1 file changed, 1 insertion(+) diff --git a/Gemfile b/Gemfile index a915cc3..73289ed 100644 --- a/Gemfile +++ b/Gemfile @@ -4,6 +4,7 @@ source 'https://rubygems.org' gemspec +gem 'rbs' gem 'rubyzip' group :development do From 81bca77feeddb56967014e175ed1e0518fce64cb Mon Sep 17 00:00:00 2001 From: Edgar Gonzalez Date: Tue, 13 Jun 2023 22:40:53 -0400 Subject: [PATCH 02/23] Add all rbs types in sig/ --- sig/lib/rambling/trie.rbs | 27 ++++++++ sig/lib/rambling/trie/comparable.rbs | 7 +++ sig/lib/rambling/trie/compressible.rbs | 7 +++ sig/lib/rambling/trie/compressor.rbs | 19 ++++++ .../trie/configuration/properties.rbs | 24 +++++++ .../configuration/provider_collection.rbs | 41 ++++++++++++ sig/lib/rambling/trie/container.rbs | 63 +++++++++++++++++++ sig/lib/rambling/trie/enumerable.rbs | 11 ++++ sig/lib/rambling/trie/inspectable.rbs | 19 ++++++ sig/lib/rambling/trie/invalid_operation.rbs | 7 +++ sig/lib/rambling/trie/nodes/compressed.rbs | 21 +++++++ sig/lib/rambling/trie/nodes/node.rbs | 47 ++++++++++++++ sig/lib/rambling/trie/nodes/raw.rbs | 25 ++++++++ sig/lib/rambling/trie/readers/reader.rbs | 9 +++ sig/lib/rambling/trie/serializers/file.rbs | 8 +++ sig/lib/rambling/trie/serializers/marshal.rbs | 13 ++++ .../rambling/trie/serializers/serializer.rbs | 10 +++ sig/lib/rambling/trie/serializers/yaml.rbs | 13 ++++ sig/lib/rambling/trie/serializers/zip.rbs | 19 ++++++ sig/lib/rambling/trie/stringifyable.rbs | 9 +++ 20 files changed, 399 insertions(+) create mode 100644 sig/lib/rambling/trie.rbs create mode 100644 sig/lib/rambling/trie/comparable.rbs create mode 100644 sig/lib/rambling/trie/compressible.rbs create mode 100644 sig/lib/rambling/trie/compressor.rbs create mode 100644 sig/lib/rambling/trie/configuration/properties.rbs create mode 100644 sig/lib/rambling/trie/configuration/provider_collection.rbs create mode 100644 sig/lib/rambling/trie/container.rbs create mode 100644 sig/lib/rambling/trie/enumerable.rbs create mode 100644 sig/lib/rambling/trie/inspectable.rbs create mode 100644 sig/lib/rambling/trie/invalid_operation.rbs create mode 100644 sig/lib/rambling/trie/nodes/compressed.rbs create mode 100644 sig/lib/rambling/trie/nodes/node.rbs create mode 100644 sig/lib/rambling/trie/nodes/raw.rbs create mode 100644 sig/lib/rambling/trie/readers/reader.rbs create mode 100644 sig/lib/rambling/trie/serializers/file.rbs create mode 100644 sig/lib/rambling/trie/serializers/marshal.rbs create mode 100644 sig/lib/rambling/trie/serializers/serializer.rbs create mode 100644 sig/lib/rambling/trie/serializers/yaml.rbs create mode 100644 sig/lib/rambling/trie/serializers/zip.rbs create mode 100644 sig/lib/rambling/trie/stringifyable.rbs diff --git a/sig/lib/rambling/trie.rbs b/sig/lib/rambling/trie.rbs new file mode 100644 index 0000000..1141c7e --- /dev/null +++ b/sig/lib/rambling/trie.rbs @@ -0,0 +1,27 @@ +module Rambling + module Trie + VERSION: String + + @properties: Configuration::Properties + + def create: (String?, Readers::Reader?) { (Container) -> void } -> Container + + def load: (String, Serializers::Serializer[untyped]?) -> Container + + def dump: (Container, String, Serializers::Serializer[untyped]?) -> void + + def config: { (Configuration::Properties) -> void } -> Configuration::Properties + + private + + def properties: -> untyped + + def readers: -> untyped + + def serializers: -> untyped + + def compressor: -> untyped + + def root_builder: -> ^() -> Nodes::Node + end +end diff --git a/sig/lib/rambling/trie/comparable.rbs b/sig/lib/rambling/trie/comparable.rbs new file mode 100644 index 0000000..0caa833 --- /dev/null +++ b/sig/lib/rambling/trie/comparable.rbs @@ -0,0 +1,7 @@ +module Rambling + module Trie + module Comparable + def ==: (Nodes::Node) -> bool + end + end +end diff --git a/sig/lib/rambling/trie/compressible.rbs b/sig/lib/rambling/trie/compressible.rbs new file mode 100644 index 0000000..aba910e --- /dev/null +++ b/sig/lib/rambling/trie/compressible.rbs @@ -0,0 +1,7 @@ +module Rambling + module Trie + module Compressible + def compressible?: -> bool + end + end +end diff --git a/sig/lib/rambling/trie/compressor.rbs b/sig/lib/rambling/trie/compressor.rbs new file mode 100644 index 0000000..963fdd5 --- /dev/null +++ b/sig/lib/rambling/trie/compressor.rbs @@ -0,0 +1,19 @@ +module Rambling + module Trie + class Compressor + def compress: (Nodes::Node) -> Nodes::Compressed + + private + + def compress_child_and_merge: (Nodes::Node) -> Nodes::Compressed + + def merge: (Nodes::Node, Nodes::Node) -> Nodes::Compressed + + def compress_children_and_copy: (Nodes::Node) -> Nodes::Compressed + + def compress_children: (Hash[Symbol, Nodes::Node]) -> Hash[Symbol, Nodes::Node] + + def new_compressed_node: (Symbol?, Nodes::Node?, Hash[Symbol, Nodes::Node], bool?) -> untyped + end + end +end diff --git a/sig/lib/rambling/trie/configuration/properties.rbs b/sig/lib/rambling/trie/configuration/properties.rbs new file mode 100644 index 0000000..75d04ec --- /dev/null +++ b/sig/lib/rambling/trie/configuration/properties.rbs @@ -0,0 +1,24 @@ +module Rambling + module Trie + module Configuration + class Properties + attr_reader readers: ProviderCollection[Readers::Reader] + attr_reader serializers: ProviderCollection[Serializers::Serializer[untyped]] + attr_accessor compressor: Compressor + attr_accessor root_builder: ^() -> Nodes::Node + attr_accessor tmp_path: String + + def reset: -> void + + private + + attr_writer readers: ProviderCollection[Readers::Reader] + attr_writer serializers: ProviderCollection[Serializers::Serializer[untyped]] + + def reset_readers: -> void + + def reset_serializers: -> void + end + end + end +end diff --git a/sig/lib/rambling/trie/configuration/provider_collection.rbs b/sig/lib/rambling/trie/configuration/provider_collection.rbs new file mode 100644 index 0000000..a8255ee --- /dev/null +++ b/sig/lib/rambling/trie/configuration/provider_collection.rbs @@ -0,0 +1,41 @@ +module Rambling + module Trie + module Configuration + class ProviderCollection[TProvider] + @providers: Hash[Symbol, TProvider] + + attr_reader name: Symbol + attr_reader default: TProvider? + + def []: (Symbol) -> TProvider + + def add: (Symbol, TProvider) -> TProvider + + def default=: (TProvider) -> TProvider + + def formats: -> Array[Symbol] + + def providers: -> Hash[Symbol, TProvider] + + def reset: -> void + + def resolve: (String) -> TProvider? + + private + + attr_reader configured_default: TProvider? + attr_reader configured_providers: Hash[Symbol, TProvider] + + def []=: (Symbol, TProvider) -> TProvider + + def values: -> Array[TProvider] + + def file_format: (String) -> Symbol + + def contains?: (TProvider) -> bool + + alias provider_instances values + end + end + end +end diff --git a/sig/lib/rambling/trie/container.rbs b/sig/lib/rambling/trie/container.rbs new file mode 100644 index 0000000..25284a0 --- /dev/null +++ b/sig/lib/rambling/trie/container.rbs @@ -0,0 +1,63 @@ +module Rambling + module Trie + class Container + @compressor: Compressor + + attr_reader root: Nodes::Node + + def add: (String) -> Nodes::Node + + def concat: (Array[String]) -> Array[Nodes::Node] + + def compress!: -> Container + + def compress: -> Container + + def each: -> (Enumerator[String, void] | Nodes::Node) + + def partial_word?: (String) -> bool + + def word?: (String) -> bool + + def scan: (String) -> Array[String] + + def words_within: (String) -> Array[String] + + def words_within?: (String) -> bool + + def ==: (Container) -> bool + + def []: (Symbol) -> Nodes::Node + + def children: -> Array[Nodes::Node] + + def children_tree: -> Hash[Symbol, Nodes::Node] + + def compressed?: -> bool + + def to_a: -> Array[String] + + def key?: (Symbol) -> bool + + def size: -> Numeric + + alias include? word? + alias match? partial_word? + alias words? scan + alias << add + alias has_key? key? + alias has_letter? key? + + private + + attr_reader compressor: Compressor + attr_writer root: Nodes::Node + + def words_within_root: (String) -> (Enumerator[String, void] | Numeric) + + def compress_root: -> Nodes::Compressed + + def char_symbols: (String) -> Array[Symbol] + end + end +end diff --git a/sig/lib/rambling/trie/enumerable.rbs b/sig/lib/rambling/trie/enumerable.rbs new file mode 100644 index 0000000..31938ca --- /dev/null +++ b/sig/lib/rambling/trie/enumerable.rbs @@ -0,0 +1,11 @@ +module Rambling + module Trie + module Enumerable + include ::Enumerable[Nodes::Node] + + alias size count + + def each: { (String) -> void } -> (Enumerator[String, void] | Enumerable) + end + end +end diff --git a/sig/lib/rambling/trie/inspectable.rbs b/sig/lib/rambling/trie/inspectable.rbs new file mode 100644 index 0000000..a4ceb09 --- /dev/null +++ b/sig/lib/rambling/trie/inspectable.rbs @@ -0,0 +1,19 @@ +module Rambling + module Trie + module Inspectable + def inspect: -> String + + private + + def class_name: -> String? + + def attributes: -> String + + def letter_inspect: -> String + + def terminal_inspect: -> String + + def children_inspect: -> String + end + end +end diff --git a/sig/lib/rambling/trie/invalid_operation.rbs b/sig/lib/rambling/trie/invalid_operation.rbs new file mode 100644 index 0000000..f35485b --- /dev/null +++ b/sig/lib/rambling/trie/invalid_operation.rbs @@ -0,0 +1,7 @@ +module Rambling + module Trie + class InvalidOperation < RuntimeError + def initialize: (String? message) -> void + end + end +end diff --git a/sig/lib/rambling/trie/nodes/compressed.rbs b/sig/lib/rambling/trie/nodes/compressed.rbs new file mode 100644 index 0000000..2452374 --- /dev/null +++ b/sig/lib/rambling/trie/nodes/compressed.rbs @@ -0,0 +1,21 @@ +module Rambling + module Trie + module Nodes + class Compressed < Node + def add: (Array[Symbol]) -> Node + + def compressed?: -> bool + + private + + def partial_word_chars?: (Array[String | Symbol]) -> bool + + def word_chars?: (Array[String | Symbol]) -> bool + + def closest_node: (Array[String | Symbol]) -> Node + + def children_match_prefix: (Array[String | Symbol]) -> Enumerator[String, void] + end + end + end +end diff --git a/sig/lib/rambling/trie/nodes/node.rbs b/sig/lib/rambling/trie/nodes/node.rbs new file mode 100644 index 0000000..add5a65 --- /dev/null +++ b/sig/lib/rambling/trie/nodes/node.rbs @@ -0,0 +1,47 @@ +module Rambling + module Trie + module Nodes + class Node + attr_reader letter: Symbol? + attr_accessor children_tree: Hash[Symbol, Node] + attr_accessor parent: Node? + + def children: -> Array[Node] + + def first_child: -> Node? + + def match_prefix: (String) { (String) -> void } -> Enumerator[String, void] + + def root?: -> bool + + def scan: (Array[String]) -> Node + + def terminal?: -> bool + + def terminal!: -> Node + + def letter=: (String | Symbol?) -> Symbol? + + def partial_word?: (Array[String]) -> bool + + def word?: (Array[String]) -> bool + + def []: (Symbol) -> Node + + def []=: (Symbol, Node) -> Node + + def key?: (Symbol) -> bool + + def delete: (Symbol) -> Node? + + alias has_key? key? + + private + + def missing: -> Node + + attr_accessor terminal: bool? + end + end + end +end diff --git a/sig/lib/rambling/trie/nodes/raw.rbs b/sig/lib/rambling/trie/nodes/raw.rbs new file mode 100644 index 0000000..8ca1b78 --- /dev/null +++ b/sig/lib/rambling/trie/nodes/raw.rbs @@ -0,0 +1,25 @@ +module Rambling + module Trie + module Nodes + class Raw < Node + def add: (Array[Symbol]) -> Node + + def compressed?: -> bool + + private + + def add_to_children_tree: (Array[Symbol]) -> Node + + def new_node: (Symbol) -> Node + + def partial_word_chars?: (Array[String | Symbol]) -> bool + + def word_chars?: (Array[String | Symbol]) -> bool + + def closest_node: (Array[String | Symbol]) -> Node + + def children_match_prefix: (Array[String | Symbol]) -> Enumerator[String, void] + end + end + end +end diff --git a/sig/lib/rambling/trie/readers/reader.rbs b/sig/lib/rambling/trie/readers/reader.rbs new file mode 100644 index 0000000..6e0e791 --- /dev/null +++ b/sig/lib/rambling/trie/readers/reader.rbs @@ -0,0 +1,9 @@ +module Rambling + module Trie + module Readers + class Reader + def each_word: (String) { (String) -> void } -> (Enumerator[String, void] | Reader) + end + end + end +end diff --git a/sig/lib/rambling/trie/serializers/file.rbs b/sig/lib/rambling/trie/serializers/file.rbs new file mode 100644 index 0000000..04a2caf --- /dev/null +++ b/sig/lib/rambling/trie/serializers/file.rbs @@ -0,0 +1,8 @@ +module Rambling + module Trie + module Serializers + class File < Serializer[String] + end + end + end +end diff --git a/sig/lib/rambling/trie/serializers/marshal.rbs b/sig/lib/rambling/trie/serializers/marshal.rbs new file mode 100644 index 0000000..6f9e5b3 --- /dev/null +++ b/sig/lib/rambling/trie/serializers/marshal.rbs @@ -0,0 +1,13 @@ +module Rambling + module Trie + module Serializers + class Marshal < Serializer[Nodes::Node] + @serializer: Serializer[String] + + private + + attr_reader serializer: Serializer[String] + end + end + end +end diff --git a/sig/lib/rambling/trie/serializers/serializer.rbs b/sig/lib/rambling/trie/serializers/serializer.rbs new file mode 100644 index 0000000..f05100b --- /dev/null +++ b/sig/lib/rambling/trie/serializers/serializer.rbs @@ -0,0 +1,10 @@ +module Rambling + module Trie + module Serializers + class Serializer[TContents] + def load: (String) -> TContents + def dump: (TContents, String) -> Numeric + end + end + end +end diff --git a/sig/lib/rambling/trie/serializers/yaml.rbs b/sig/lib/rambling/trie/serializers/yaml.rbs new file mode 100644 index 0000000..a647977 --- /dev/null +++ b/sig/lib/rambling/trie/serializers/yaml.rbs @@ -0,0 +1,13 @@ +module Rambling + module Trie + module Serializers + class Yaml < Serializer[Nodes::Node] + @serializer: Serializer[String] + + private + + attr_reader serializer: Serializer[String] + end + end + end +end diff --git a/sig/lib/rambling/trie/serializers/zip.rbs b/sig/lib/rambling/trie/serializers/zip.rbs new file mode 100644 index 0000000..51b25f3 --- /dev/null +++ b/sig/lib/rambling/trie/serializers/zip.rbs @@ -0,0 +1,19 @@ +module Rambling + module Trie + module Serializers + class Zip < Serializer[Nodes::Node] + @properties: Configuration::Properties + + private + + attr_reader properties: Configuration::Properties + + def serializers: -> Configuration::ProviderCollection[Serializer[untyped]] + + def tmp_path: -> String + + def path: (String) -> String + end + end + end +end diff --git a/sig/lib/rambling/trie/stringifyable.rbs b/sig/lib/rambling/trie/stringifyable.rbs new file mode 100644 index 0000000..cc1dda9 --- /dev/null +++ b/sig/lib/rambling/trie/stringifyable.rbs @@ -0,0 +1,9 @@ +module Rambling + module Trie + module Stringifyable + def as_word: -> String + + def to_s: -> String + end + end +end From e2c5d48213cc458b7d02f4f0f29249282a32e1f6 Mon Sep 17 00:00:00 2001 From: Edgar Gonzalez Date: Tue, 13 Jun 2023 22:42:39 -0400 Subject: [PATCH 03/23] Fix yardoc comments to match rbs types --- lib/rambling/trie/compressor.rb | 2 +- lib/rambling/trie/container.rb | 2 +- lib/rambling/trie/nodes/node.rb | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/rambling/trie/compressor.rb b/lib/rambling/trie/compressor.rb index 1314f92..539ecef 100644 --- a/lib/rambling/trie/compressor.rb +++ b/lib/rambling/trie/compressor.rb @@ -5,7 +5,7 @@ module Trie # Responsible for the compression process of a trie data structure. class Compressor # Compresses a {Nodes::Node Node} from a trie data structure. - # @param [Nodes::Raw] node the node to compress. + # @param [Nodes::Node] node the node to compress. # @return [Nodes::Compressed] node the compressed version of the node. def compress node if node.compressible? diff --git a/lib/rambling/trie/container.rb b/lib/rambling/trie/container.rb index b56edf4..562b6e3 100644 --- a/lib/rambling/trie/container.rb +++ b/lib/rambling/trie/container.rb @@ -98,7 +98,7 @@ def scan word = '' # Returns all words within a string that match a word contained in the trie. # @param [String] phrase the string to look for matching words in. - # @return [Enumerator] all the words in the given string that match a word in the trie. + # @return [Array] all the words in the given string that match a word in the trie. # @yield [String] each word found in phrase. def words_within phrase words_within_root(phrase).to_a diff --git a/lib/rambling/trie/nodes/node.rb b/lib/rambling/trie/nodes/node.rb index 4163e9d..d9ddbb1 100644 --- a/lib/rambling/trie/nodes/node.rb +++ b/lib/rambling/trie/nodes/node.rb @@ -147,7 +147,7 @@ def key? letter # Delete a given letter and its corresponding {Node Node} from # this {Node Node}'s children tree. # @param [Symbol] letter the letter to delete from the node's children tree. - # @return [Node] the node corresponding to the deleted letter. + # @return [Node, nil] the node corresponding to the deleted letter. # @see https://ruby-doc.org/core-2.7.0/Hash.html#method-i-delete Hash#delete def delete letter children_tree.delete letter From ffb631ac444680514d4b8e551c5e6cb0aa318982 Mon Sep 17 00:00:00 2001 From: Edgar Gonzalez Date: Thu, 8 Feb 2024 13:24:51 -0500 Subject: [PATCH 04/23] Add rbs step to lint --- .github/workflows/ruby.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/ruby.yml b/.github/workflows/ruby.yml index 2a0d4b4..3515175 100644 --- a/.github/workflows/ruby.yml +++ b/.github/workflows/ruby.yml @@ -23,6 +23,8 @@ jobs: bundler-cache: true - name: Run rubocop run: bundle exec rubocop + - name: Run rbs + run: bundle exec rbs validate lib/**/*.rb spec: runs-on: ubuntu-latest strategy: From 2f41d7e93bc1bfde2a7f5dd2f672c4b59e13ca19 Mon Sep 17 00:00:00 2001 From: Edgar Gonzalez Date: Thu, 8 Feb 2024 14:33:54 -0500 Subject: [PATCH 05/23] Add steep gem and corresponding config --- Gemfile | 1 + Steepfile | 29 +++++++++++++++++++++++++++++ 2 files changed, 30 insertions(+) create mode 100644 Steepfile diff --git a/Gemfile b/Gemfile index 73289ed..7f4f9ea 100644 --- a/Gemfile +++ b/Gemfile @@ -5,6 +5,7 @@ source 'https://rubygems.org' gemspec gem 'rbs' +gem 'steep' gem 'rubyzip' group :development do diff --git a/Steepfile b/Steepfile new file mode 100644 index 0000000..27e4f12 --- /dev/null +++ b/Steepfile @@ -0,0 +1,29 @@ +# D = Steep::Diagnostic +# +target :lib do + signature 'sig' + + check 'lib' # Directory name +# check 'Gemfile' # File name +# check 'app/models/**/*.rb' # Glob +# # ignore 'lib/templates/*.rb' +# +# # library 'pathname' # Standard libraries +# # library 'strong_json' # Gems +# +# # configure_code_diagnostics(D::Ruby.default) # `default` diagnostics setting (applies by default) +# # configure_code_diagnostics(D::Ruby.strict) # `strict` diagnostics setting +# # configure_code_diagnostics(D::Ruby.lenient) # `lenient` diagnostics setting +# # configure_code_diagnostics(D::Ruby.silent) # `silent` diagnostics setting +# # configure_code_diagnostics do |hash| # You can setup everything yourself +# # hash[D::Ruby::NoMethod] = :information +# # end +end + +# target :test do +# signature 'sig', 'sig-private' +# +# check 'test' +# +# # library 'pathname' # Standard libraries +# end From 9eb3bc326f68bca7bb921edd4b6b83728a593e43 Mon Sep 17 00:00:00 2001 From: Edgar Gonzalez Date: Thu, 8 Feb 2024 14:35:02 -0500 Subject: [PATCH 06/23] Add type defs for Nodes::Missing and Readers::PlainText --- sig/lib/rambling/trie/nodes/missing.rbs | 8 ++++++++ sig/lib/rambling/trie/readers/plain_text.rbs | 9 +++++++++ 2 files changed, 17 insertions(+) create mode 100644 sig/lib/rambling/trie/nodes/missing.rbs create mode 100644 sig/lib/rambling/trie/readers/plain_text.rbs diff --git a/sig/lib/rambling/trie/nodes/missing.rbs b/sig/lib/rambling/trie/nodes/missing.rbs new file mode 100644 index 0000000..15171cc --- /dev/null +++ b/sig/lib/rambling/trie/nodes/missing.rbs @@ -0,0 +1,8 @@ +module Rambling + module Trie + module Nodes + class Missing < Node + end + end + end +end \ No newline at end of file diff --git a/sig/lib/rambling/trie/readers/plain_text.rbs b/sig/lib/rambling/trie/readers/plain_text.rbs new file mode 100644 index 0000000..4653dcc --- /dev/null +++ b/sig/lib/rambling/trie/readers/plain_text.rbs @@ -0,0 +1,9 @@ +module Rambling + module Trie + module Readers + class PlainText < Reader + def each_word: (String) { (String?) -> void } -> (Enumerator[String?, void] | PlainText) + end + end + end +end \ No newline at end of file From ed556019b52a17d5c9a1a4d28b67a4a01c9992d2 Mon Sep 17 00:00:00 2001 From: Edgar Gonzalez Date: Thu, 8 Feb 2024 14:35:34 -0500 Subject: [PATCH 07/23] Add all missing initialize methods to type sigs and remove all "untyped"s --- lib/rambling/trie/nodes/node.rb | 2 ++ sig/lib/rambling/trie.rbs | 18 +++++++++--------- sig/lib/rambling/trie/compressor.rbs | 2 +- .../rambling/trie/configuration/properties.rbs | 8 ++++++-- .../trie/configuration/provider_collection.rbs | 4 +++- sig/lib/rambling/trie/container.rbs | 6 ++++-- sig/lib/rambling/trie/enumerable.rbs | 2 +- sig/lib/rambling/trie/nodes/compressed.rbs | 2 +- sig/lib/rambling/trie/nodes/node.rbs | 8 ++++++++ sig/lib/rambling/trie/nodes/raw.rbs | 2 +- sig/lib/rambling/trie/serializers/zip.rbs | 4 +++- 11 files changed, 39 insertions(+), 19 deletions(-) diff --git a/lib/rambling/trie/nodes/node.rb b/lib/rambling/trie/nodes/node.rb index d9ddbb1..d687012 100644 --- a/lib/rambling/trie/nodes/node.rb +++ b/lib/rambling/trie/nodes/node.rb @@ -52,6 +52,8 @@ def first_child # rubocop:disable Lint/UnreachableLoop children_tree.each_value { |child| return child } # rubocop:enable Lint/UnreachableLoop + + nil end # Indicates if the current node is the root node. diff --git a/sig/lib/rambling/trie.rbs b/sig/lib/rambling/trie.rbs index 1141c7e..23cdaba 100644 --- a/sig/lib/rambling/trie.rbs +++ b/sig/lib/rambling/trie.rbs @@ -4,24 +4,24 @@ module Rambling @properties: Configuration::Properties - def create: (String?, Readers::Reader?) { (Container) -> void } -> Container + def self.create: (String?, Readers::Reader?) { (Container) -> void } -> Container - def load: (String, Serializers::Serializer[untyped]?) -> Container + def self.load: (String, Serializers::Serializer[Nodes::Node]?) -> Container - def dump: (Container, String, Serializers::Serializer[untyped]?) -> void + def self.dump: (Container, String, Serializers::Serializer[Nodes::Node]?) -> void - def config: { (Configuration::Properties) -> void } -> Configuration::Properties + def self.config: { (Configuration::Properties) -> void } -> Configuration::Properties private - def properties: -> untyped + def self.properties: -> Configuration::Properties - def readers: -> untyped + def self.readers: -> Configuration::ProviderCollection[Readers::Reader] - def serializers: -> untyped + def self.serializers: -> Configuration::ProviderCollection[Serializers::Serializer[Nodes::Node]] - def compressor: -> untyped + def self.compressor: -> Compressor - def root_builder: -> ^() -> Nodes::Node + def self.root_builder: -> ^() -> Nodes::Node end end diff --git a/sig/lib/rambling/trie/compressor.rbs b/sig/lib/rambling/trie/compressor.rbs index 963fdd5..25664ee 100644 --- a/sig/lib/rambling/trie/compressor.rbs +++ b/sig/lib/rambling/trie/compressor.rbs @@ -13,7 +13,7 @@ module Rambling def compress_children: (Hash[Symbol, Nodes::Node]) -> Hash[Symbol, Nodes::Node] - def new_compressed_node: (Symbol?, Nodes::Node?, Hash[Symbol, Nodes::Node], bool?) -> untyped + def new_compressed_node: (Symbol?, Nodes::Node?, Hash[Symbol, Nodes::Node], bool?) -> Nodes::Compressed end end end diff --git a/sig/lib/rambling/trie/configuration/properties.rbs b/sig/lib/rambling/trie/configuration/properties.rbs index 75d04ec..29e0808 100644 --- a/sig/lib/rambling/trie/configuration/properties.rbs +++ b/sig/lib/rambling/trie/configuration/properties.rbs @@ -3,20 +3,24 @@ module Rambling module Configuration class Properties attr_reader readers: ProviderCollection[Readers::Reader] - attr_reader serializers: ProviderCollection[Serializers::Serializer[untyped]] + attr_reader serializers: ProviderCollection[Serializers::Serializer[Nodes::Node]] attr_accessor compressor: Compressor attr_accessor root_builder: ^() -> Nodes::Node attr_accessor tmp_path: String + def initialize: -> void + def reset: -> void private attr_writer readers: ProviderCollection[Readers::Reader] - attr_writer serializers: ProviderCollection[Serializers::Serializer[untyped]] + attr_writer serializers: ProviderCollection[Serializers::Serializer[Nodes::Node]] def reset_readers: -> void + def default_reader_providers: -> Hash[Symbol, Readers::Reader] + def reset_serializers: -> void end end diff --git a/sig/lib/rambling/trie/configuration/provider_collection.rbs b/sig/lib/rambling/trie/configuration/provider_collection.rbs index a8255ee..e17a547 100644 --- a/sig/lib/rambling/trie/configuration/provider_collection.rbs +++ b/sig/lib/rambling/trie/configuration/provider_collection.rbs @@ -7,6 +7,8 @@ module Rambling attr_reader name: Symbol attr_reader default: TProvider? + def initialize: (Symbol, Hash[Symbol, TProvider], ?TProvider?) -> void + def []: (Symbol) -> TProvider def add: (Symbol, TProvider) -> TProvider @@ -32,7 +34,7 @@ module Rambling def file_format: (String) -> Symbol - def contains?: (TProvider) -> bool + def contains?: (TProvider?) -> bool alias provider_instances values end diff --git a/sig/lib/rambling/trie/container.rbs b/sig/lib/rambling/trie/container.rbs index 25284a0..a47693d 100644 --- a/sig/lib/rambling/trie/container.rbs +++ b/sig/lib/rambling/trie/container.rbs @@ -5,6 +5,8 @@ module Rambling attr_reader root: Nodes::Node + def initialize: (Nodes::Node, Compressor) { (Container) -> void } -> void + def add: (String) -> Nodes::Node def concat: (Array[String]) -> Array[Nodes::Node] @@ -13,7 +15,7 @@ module Rambling def compress: -> Container - def each: -> (Enumerator[String, void] | Nodes::Node) + def each: -> (Enumerator[String, void] | Enumerable) def partial_word?: (String) -> bool @@ -53,7 +55,7 @@ module Rambling attr_reader compressor: Compressor attr_writer root: Nodes::Node - def words_within_root: (String) -> (Enumerator[String, void] | Numeric) + def words_within_root: (String) { (String) -> void } -> (Enumerator[String, void] | Numeric) def compress_root: -> Nodes::Compressed diff --git a/sig/lib/rambling/trie/enumerable.rbs b/sig/lib/rambling/trie/enumerable.rbs index 31938ca..ab1b5b0 100644 --- a/sig/lib/rambling/trie/enumerable.rbs +++ b/sig/lib/rambling/trie/enumerable.rbs @@ -1,7 +1,7 @@ module Rambling module Trie module Enumerable - include ::Enumerable[Nodes::Node] + include ::Enumerable[String] alias size count diff --git a/sig/lib/rambling/trie/nodes/compressed.rbs b/sig/lib/rambling/trie/nodes/compressed.rbs index 2452374..ceb06c7 100644 --- a/sig/lib/rambling/trie/nodes/compressed.rbs +++ b/sig/lib/rambling/trie/nodes/compressed.rbs @@ -14,7 +14,7 @@ module Rambling def closest_node: (Array[String | Symbol]) -> Node - def children_match_prefix: (Array[String | Symbol]) -> Enumerator[String, void] + def children_match_prefix: (Array[String | Symbol]) { (String) -> void } -> Enumerator[String, void]? end end end diff --git a/sig/lib/rambling/trie/nodes/node.rbs b/sig/lib/rambling/trie/nodes/node.rbs index add5a65..c3e68a5 100644 --- a/sig/lib/rambling/trie/nodes/node.rbs +++ b/sig/lib/rambling/trie/nodes/node.rbs @@ -2,10 +2,18 @@ module Rambling module Trie module Nodes class Node + include Compressible + include Enumerable + include Comparable + include Stringifyable + include Inspectable + attr_reader letter: Symbol? attr_accessor children_tree: Hash[Symbol, Node] attr_accessor parent: Node? + def initialize: (Symbol?, Node?, ?Hash[Symbol, Node]) -> void + def children: -> Array[Node] def first_child: -> Node? diff --git a/sig/lib/rambling/trie/nodes/raw.rbs b/sig/lib/rambling/trie/nodes/raw.rbs index 8ca1b78..8e3abc0 100644 --- a/sig/lib/rambling/trie/nodes/raw.rbs +++ b/sig/lib/rambling/trie/nodes/raw.rbs @@ -18,7 +18,7 @@ module Rambling def closest_node: (Array[String | Symbol]) -> Node - def children_match_prefix: (Array[String | Symbol]) -> Enumerator[String, void] + def children_match_prefix: (Array[String | Symbol]) { (String) -> void } -> Enumerator[String, void]? end end end diff --git a/sig/lib/rambling/trie/serializers/zip.rbs b/sig/lib/rambling/trie/serializers/zip.rbs index 51b25f3..083d0da 100644 --- a/sig/lib/rambling/trie/serializers/zip.rbs +++ b/sig/lib/rambling/trie/serializers/zip.rbs @@ -4,11 +4,13 @@ module Rambling class Zip < Serializer[Nodes::Node] @properties: Configuration::Properties + def initialize: (Configuration::Properties) -> void + private attr_reader properties: Configuration::Properties - def serializers: -> Configuration::ProviderCollection[Serializer[untyped]] + def serializers: -> Configuration::ProviderCollection[Serializer[Nodes::Node]] def tmp_path: -> String From 48c7c26a97438552137cd041ebb3efcf194ff022 Mon Sep 17 00:00:00 2001 From: Edgar Gonzalez Date: Thu, 8 Feb 2024 15:01:48 -0500 Subject: [PATCH 08/23] Add protected methods to node; fix Array[String] sigs --- lib/rambling/trie/container.rb | 2 ++ lib/rambling/trie/nodes/node.rb | 2 +- lib/rambling/trie/nodes/raw.rb | 2 +- sig/lib/rambling/trie/container.rbs | 2 +- sig/lib/rambling/trie/nodes/missing.rbs | 1 + sig/lib/rambling/trie/nodes/node.rbs | 15 ++++++++++++++- sig/lib/rambling/trie/nodes/raw.rbs | 8 ++++---- 7 files changed, 24 insertions(+), 8 deletions(-) diff --git a/lib/rambling/trie/container.rb b/lib/rambling/trie/container.rb index 562b6e3..b5d5320 100644 --- a/lib/rambling/trie/container.rb +++ b/lib/rambling/trie/container.rb @@ -207,6 +207,8 @@ def words_within_root phrase yield word end end + + nil end def compress_root diff --git a/lib/rambling/trie/nodes/node.rb b/lib/rambling/trie/nodes/node.rb index d687012..d0a495c 100644 --- a/lib/rambling/trie/nodes/node.rb +++ b/lib/rambling/trie/nodes/node.rb @@ -108,7 +108,7 @@ def scan chars end # Returns all words that match a prefix of any length within chars. - # @param [String] chars the chars to base the prefix on. + # @param [Array[String]] chars the chars to base the prefix on. # @return [Enumerator] all the words that match a prefix by chars. # @yield [String] each word found. def match_prefix chars diff --git a/lib/rambling/trie/nodes/raw.rb b/lib/rambling/trie/nodes/raw.rb index b9c6ca4..1442a3b 100644 --- a/lib/rambling/trie/nodes/raw.rb +++ b/lib/rambling/trie/nodes/raw.rb @@ -7,7 +7,7 @@ module Nodes class Raw < Rambling::Trie::Nodes::Node # Adds a word to the current raw (uncompressed) trie node. # @param [Array] chars the char array to add to the trie. - # @return [Raw] the added/modified node based on the word added. + # @return [Node] the added/modified node based on the word added. # @note This method clears the contents of the chars variable. def add chars if chars.empty? diff --git a/sig/lib/rambling/trie/container.rbs b/sig/lib/rambling/trie/container.rbs index a47693d..5d41b01 100644 --- a/sig/lib/rambling/trie/container.rbs +++ b/sig/lib/rambling/trie/container.rbs @@ -55,7 +55,7 @@ module Rambling attr_reader compressor: Compressor attr_writer root: Nodes::Node - def words_within_root: (String) { (String) -> void } -> (Enumerator[String, void] | Numeric) + def words_within_root: (String) { (String) -> void } -> (Enumerator[String, void]?) def compress_root: -> Nodes::Compressed diff --git a/sig/lib/rambling/trie/nodes/missing.rbs b/sig/lib/rambling/trie/nodes/missing.rbs index 15171cc..f84d9c4 100644 --- a/sig/lib/rambling/trie/nodes/missing.rbs +++ b/sig/lib/rambling/trie/nodes/missing.rbs @@ -2,6 +2,7 @@ module Rambling module Trie module Nodes class Missing < Node + def initialize: -> void end end end diff --git a/sig/lib/rambling/trie/nodes/node.rbs b/sig/lib/rambling/trie/nodes/node.rbs index c3e68a5..7979f01 100644 --- a/sig/lib/rambling/trie/nodes/node.rbs +++ b/sig/lib/rambling/trie/nodes/node.rbs @@ -14,11 +14,13 @@ module Rambling def initialize: (Symbol?, Node?, ?Hash[Symbol, Node]) -> void + def add: (Array[Symbol]) -> Node + def children: -> Array[Node] def first_child: -> Node? - def match_prefix: (String) { (String) -> void } -> Enumerator[String, void] + def match_prefix: (Array[String]) { (String) -> void } -> Enumerator[String, void]? def root?: -> bool @@ -44,10 +46,21 @@ module Rambling alias has_key? key? + private def missing: -> Node + def partial_word_chars?: (Array[String]) -> bool + + def word_chars?: (Array[String]) -> bool + + def closest_node: (Array[String]) -> Node + + def children_match_prefix: (Array[String]) { (String) -> void } -> Enumerator[String, void]? + + def compressed?: -> bool + attr_accessor terminal: bool? end end diff --git a/sig/lib/rambling/trie/nodes/raw.rbs b/sig/lib/rambling/trie/nodes/raw.rbs index 8e3abc0..556c0e0 100644 --- a/sig/lib/rambling/trie/nodes/raw.rbs +++ b/sig/lib/rambling/trie/nodes/raw.rbs @@ -12,13 +12,13 @@ module Rambling def new_node: (Symbol) -> Node - def partial_word_chars?: (Array[String | Symbol]) -> bool + def partial_word_chars?: (Array[String]) -> bool - def word_chars?: (Array[String | Symbol]) -> bool + def word_chars?: (Array[String]) -> bool - def closest_node: (Array[String | Symbol]) -> Node + def closest_node: (Array[String]) -> Node - def children_match_prefix: (Array[String | Symbol]) { (String) -> void } -> Enumerator[String, void]? + def children_match_prefix: (Array[String]) { (String) -> void } -> Enumerator[String, void]? end end end From 38a4a7ddfb2686e654d89b9aa54ad637f7efc1d1 Mon Sep 17 00:00:00 2001 From: Edgar Gonzalez Date: Thu, 8 Feb 2024 16:20:56 -0500 Subject: [PATCH 09/23] Add abstract methods so that it does not complain about missing methods --- sig/lib/rambling/trie/comparable.rbs | 10 ++++++++++ sig/lib/rambling/trie/compressible.rbs | 10 ++++++++++ sig/lib/rambling/trie/enumerable.rbs | 10 ++++++++++ sig/lib/rambling/trie/inspectable.rbs | 8 ++++++++ sig/lib/rambling/trie/nodes/node.rbs | 13 +++++++------ sig/lib/rambling/trie/stringifyable.rbs | 12 ++++++++++++ 6 files changed, 57 insertions(+), 6 deletions(-) diff --git a/sig/lib/rambling/trie/comparable.rbs b/sig/lib/rambling/trie/comparable.rbs index 0caa833..7b2a6e6 100644 --- a/sig/lib/rambling/trie/comparable.rbs +++ b/sig/lib/rambling/trie/comparable.rbs @@ -2,6 +2,16 @@ module Rambling module Trie module Comparable def ==: (Nodes::Node) -> bool + + private + + # abstract methods + + def letter: -> Symbol + + def terminal?: -> bool + + def children_tree: -> Hash[Symbol, Nodes::Node] end end end diff --git a/sig/lib/rambling/trie/compressible.rbs b/sig/lib/rambling/trie/compressible.rbs index aba910e..774335c 100644 --- a/sig/lib/rambling/trie/compressible.rbs +++ b/sig/lib/rambling/trie/compressible.rbs @@ -2,6 +2,16 @@ module Rambling module Trie module Compressible def compressible?: -> bool + + private + + # abstract methods + + def root?: -> bool + + def terminal?: -> bool + + def children_tree: -> Hash[Symbol, Nodes::Node] end end end diff --git a/sig/lib/rambling/trie/enumerable.rbs b/sig/lib/rambling/trie/enumerable.rbs index ab1b5b0..d2f8ad0 100644 --- a/sig/lib/rambling/trie/enumerable.rbs +++ b/sig/lib/rambling/trie/enumerable.rbs @@ -6,6 +6,16 @@ module Rambling alias size count def each: { (String) -> void } -> (Enumerator[String, void] | Enumerable) + + private + + # abstract methods + + def as_word: -> String + + def terminal?: -> bool + + def children_tree: -> Hash[Symbol, Nodes::Node] end end end diff --git a/sig/lib/rambling/trie/inspectable.rbs b/sig/lib/rambling/trie/inspectable.rbs index a4ceb09..600e2a2 100644 --- a/sig/lib/rambling/trie/inspectable.rbs +++ b/sig/lib/rambling/trie/inspectable.rbs @@ -14,6 +14,14 @@ module Rambling def terminal_inspect: -> String def children_inspect: -> String + + # abstract methods + + def letter: -> Symbol + + def terminal: -> bool? + + def children_tree: -> Hash[Symbol, Nodes::Node] end end end diff --git a/sig/lib/rambling/trie/nodes/node.rbs b/sig/lib/rambling/trie/nodes/node.rbs index 7979f01..b5d739d 100644 --- a/sig/lib/rambling/trie/nodes/node.rbs +++ b/sig/lib/rambling/trie/nodes/node.rbs @@ -12,7 +12,7 @@ module Rambling attr_accessor children_tree: Hash[Symbol, Node] attr_accessor parent: Node? - def initialize: (Symbol?, Node?, ?Hash[Symbol, Node]) -> void + def initialize: (?Symbol?, ?Node?, ?Hash[Symbol, Node]) -> void def add: (Array[Symbol]) -> Node @@ -32,6 +32,8 @@ module Rambling def letter=: (String | Symbol?) -> Symbol? + def compressed?: -> bool + def partial_word?: (Array[String]) -> bool def word?: (Array[String]) -> bool @@ -46,11 +48,14 @@ module Rambling alias has_key? key? - private def missing: -> Node + attr_accessor terminal: bool? + + # abstract methods + def partial_word_chars?: (Array[String]) -> bool def word_chars?: (Array[String]) -> bool @@ -58,10 +63,6 @@ module Rambling def closest_node: (Array[String]) -> Node def children_match_prefix: (Array[String]) { (String) -> void } -> Enumerator[String, void]? - - def compressed?: -> bool - - attr_accessor terminal: bool? end end end diff --git a/sig/lib/rambling/trie/stringifyable.rbs b/sig/lib/rambling/trie/stringifyable.rbs index cc1dda9..e012c9a 100644 --- a/sig/lib/rambling/trie/stringifyable.rbs +++ b/sig/lib/rambling/trie/stringifyable.rbs @@ -4,6 +4,18 @@ module Rambling def as_word: -> String def to_s: -> String + + private + + # abstract methods + + def letter: -> Symbol + + def terminal?: -> bool + + def parent: -> Nodes::Node? + + def children_tree: -> Hash[Symbol, Nodes::Node] end end end From 57723f422d2b70d9242c4c59afbf09ed72f72b96 Mon Sep 17 00:00:00 2001 From: Edgar Gonzalez Date: Thu, 8 Feb 2024 16:51:21 -0500 Subject: [PATCH 10/23] Optional block and assignee --- sig/lib/rambling/trie/configuration/provider_collection.rbs | 2 +- sig/lib/rambling/trie/container.rbs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/sig/lib/rambling/trie/configuration/provider_collection.rbs b/sig/lib/rambling/trie/configuration/provider_collection.rbs index e17a547..27a7f85 100644 --- a/sig/lib/rambling/trie/configuration/provider_collection.rbs +++ b/sig/lib/rambling/trie/configuration/provider_collection.rbs @@ -13,7 +13,7 @@ module Rambling def add: (Symbol, TProvider) -> TProvider - def default=: (TProvider) -> TProvider + def default=: (TProvider?) -> TProvider? def formats: -> Array[Symbol] diff --git a/sig/lib/rambling/trie/container.rbs b/sig/lib/rambling/trie/container.rbs index 5d41b01..677b951 100644 --- a/sig/lib/rambling/trie/container.rbs +++ b/sig/lib/rambling/trie/container.rbs @@ -55,7 +55,7 @@ module Rambling attr_reader compressor: Compressor attr_writer root: Nodes::Node - def words_within_root: (String) { (String) -> void } -> (Enumerator[String, void]?) + def words_within_root: (String) ?{ (String) -> void } -> (Enumerator[String, void]?) def compress_root: -> Nodes::Compressed From dd8f3c739514e339616d2a0a1ce0294a7194b29c Mon Sep 17 00:00:00 2001 From: Edgar Gonzalez Date: Thu, 8 Feb 2024 16:58:19 -0500 Subject: [PATCH 11/23] Handle nils in compressor --- lib/rambling/trie/compressor.rb | 2 ++ sig/lib/rambling/trie/compressor.rbs | 4 ++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/lib/rambling/trie/compressor.rb b/lib/rambling/trie/compressor.rb index 539ecef..c76e7b4 100644 --- a/lib/rambling/trie/compressor.rb +++ b/lib/rambling/trie/compressor.rb @@ -8,6 +8,8 @@ class Compressor # @param [Nodes::Node] node the node to compress. # @return [Nodes::Compressed] node the compressed version of the node. def compress node + return if node.nil? + if node.compressible? compress_child_and_merge node else diff --git a/sig/lib/rambling/trie/compressor.rbs b/sig/lib/rambling/trie/compressor.rbs index 25664ee..96181b9 100644 --- a/sig/lib/rambling/trie/compressor.rbs +++ b/sig/lib/rambling/trie/compressor.rbs @@ -1,13 +1,13 @@ module Rambling module Trie class Compressor - def compress: (Nodes::Node) -> Nodes::Compressed + def compress: (Nodes::Node?) -> Nodes::Compressed? private def compress_child_and_merge: (Nodes::Node) -> Nodes::Compressed - def merge: (Nodes::Node, Nodes::Node) -> Nodes::Compressed + def merge: (Nodes::Node, Nodes::Node?) -> Nodes::Compressed def compress_children_and_copy: (Nodes::Node) -> Nodes::Compressed From 18927532a7985e7b94f1b5730c4a4be956c4a0c4 Mon Sep 17 00:00:00 2001 From: Edgar Gonzalez Date: Fri, 9 Feb 2024 13:09:57 -0500 Subject: [PATCH 12/23] Add yaml and securerandom libraries to Steepfile --- Steepfile | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/Steepfile b/Steepfile index 27e4f12..b8aa0e9 100644 --- a/Steepfile +++ b/Steepfile @@ -3,13 +3,17 @@ target :lib do signature 'sig' - check 'lib' # Directory name -# check 'Gemfile' # File name -# check 'app/models/**/*.rb' # Glob -# # ignore 'lib/templates/*.rb' -# -# # library 'pathname' # Standard libraries -# # library 'strong_json' # Gems + check 'lib' + # check 'tasks' + + # check 'Gemfile' + # check 'Guardfile' + # check 'Rakefile' + # check 'Steepfile' + + # library 'rubyzip' + library 'yaml' + library 'securerandom' # # # configure_code_diagnostics(D::Ruby.default) # `default` diagnostics setting (applies by default) # # configure_code_diagnostics(D::Ruby.strict) # `strict` diagnostics setting From bfbdc150fe30afa1a1e625b9297ca1c94d50e65a Mon Sep 17 00:00:00 2001 From: Edgar Gonzalez Date: Fri, 9 Feb 2024 13:10:29 -0500 Subject: [PATCH 13/23] Add rubyzip types (rubyzip does not have them defined) --- sig/lib/zip/entry.rbs | 11 +++++++++++ sig/lib/zip/file.rbs | 11 +++++++++++ 2 files changed, 22 insertions(+) create mode 100644 sig/lib/zip/entry.rbs create mode 100644 sig/lib/zip/file.rbs diff --git a/sig/lib/zip/entry.rbs b/sig/lib/zip/entry.rbs new file mode 100644 index 0000000..1a4f54c --- /dev/null +++ b/sig/lib/zip/entry.rbs @@ -0,0 +1,11 @@ +module Zip + class Entry + include Enumerable[Entry] + + def name: -> String + + def extract: (String) -> void + + def each: ?{ (Entry) -> void } -> (Enumerator[Entry, void])? + end +end \ No newline at end of file diff --git a/sig/lib/zip/file.rbs b/sig/lib/zip/file.rbs new file mode 100644 index 0000000..bd38cfa --- /dev/null +++ b/sig/lib/zip/file.rbs @@ -0,0 +1,11 @@ +module Zip + class File + CREATE: bool + + def self.open: [TContent] (String, ?bool?) { (File) -> TContent } -> TContent + + def entries: -> Array[Entry] + + def add: (String, String) -> void + end +end \ No newline at end of file From 791604d62f879bc84ec9d203ce8ea95aa8c1d6e5 Mon Sep 17 00:00:00 2001 From: Edgar Gonzalez Date: Fri, 9 Feb 2024 13:11:51 -0500 Subject: [PATCH 14/23] Mark blocks as optional --- sig/lib/rambling/trie.rbs | 6 +++--- sig/lib/rambling/trie/container.rbs | 6 ++++-- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/sig/lib/rambling/trie.rbs b/sig/lib/rambling/trie.rbs index 23cdaba..ca013aa 100644 --- a/sig/lib/rambling/trie.rbs +++ b/sig/lib/rambling/trie.rbs @@ -4,13 +4,13 @@ module Rambling @properties: Configuration::Properties - def self.create: (String?, Readers::Reader?) { (Container) -> void } -> Container + def self.create: (String?, Readers::Reader?) ?{ (Container) -> void } -> Container - def self.load: (String, Serializers::Serializer[Nodes::Node]?) -> Container + def self.load: (String, Serializers::Serializer[Nodes::Node]?) ?{ (Container) -> void } -> Container def self.dump: (Container, String, Serializers::Serializer[Nodes::Node]?) -> void - def self.config: { (Configuration::Properties) -> void } -> Configuration::Properties + def self.config: ?{ (Configuration::Properties) -> void } -> Configuration::Properties private diff --git a/sig/lib/rambling/trie/container.rbs b/sig/lib/rambling/trie/container.rbs index 677b951..4f89a01 100644 --- a/sig/lib/rambling/trie/container.rbs +++ b/sig/lib/rambling/trie/container.rbs @@ -1,11 +1,13 @@ module Rambling module Trie class Container + include ::Enumerable[String] + @compressor: Compressor attr_reader root: Nodes::Node - def initialize: (Nodes::Node, Compressor) { (Container) -> void } -> void + def initialize: (Nodes::Node, Compressor) ?{ (Container) -> void } -> void def add: (String) -> Nodes::Node @@ -15,7 +17,7 @@ module Rambling def compress: -> Container - def each: -> (Enumerator[String, void] | Enumerable) + def each: { (String) -> void } -> (Enumerator[String, void] | Enumerable) def partial_word?: (String) -> bool From 06f89c31ee17b57662f295ca93a41f83d03b06b2 Mon Sep 17 00:00:00 2001 From: Edgar Gonzalez Date: Fri, 9 Feb 2024 13:12:12 -0500 Subject: [PATCH 15/23] Make TContents for providers nilable --- sig/lib/rambling/trie/configuration/provider_collection.rbs | 6 +++++- sig/lib/rambling/trie/serializers/serializer.rbs | 2 +- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/sig/lib/rambling/trie/configuration/provider_collection.rbs b/sig/lib/rambling/trie/configuration/provider_collection.rbs index 27a7f85..8d8b497 100644 --- a/sig/lib/rambling/trie/configuration/provider_collection.rbs +++ b/sig/lib/rambling/trie/configuration/provider_collection.rbs @@ -1,7 +1,11 @@ module Rambling module Trie module Configuration - class ProviderCollection[TProvider] + class ProviderCollection[TProvider < _Nilable] + interface _Nilable + def nil?: -> bool + end + @providers: Hash[Symbol, TProvider] attr_reader name: Symbol diff --git a/sig/lib/rambling/trie/serializers/serializer.rbs b/sig/lib/rambling/trie/serializers/serializer.rbs index f05100b..8cc0c38 100644 --- a/sig/lib/rambling/trie/serializers/serializer.rbs +++ b/sig/lib/rambling/trie/serializers/serializer.rbs @@ -2,7 +2,7 @@ module Rambling module Trie module Serializers class Serializer[TContents] - def load: (String) -> TContents + def load: (String) -> TContents? def dump: (TContents, String) -> Numeric end end From fe4aa749aad9c85f045d953356b8630bfaf76d31 Mon Sep 17 00:00:00 2001 From: Edgar Gonzalez Date: Fri, 9 Feb 2024 13:12:32 -0500 Subject: [PATCH 16/23] Always use Array[String] for chars --- sig/lib/rambling/trie/nodes/compressed.rbs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/sig/lib/rambling/trie/nodes/compressed.rbs b/sig/lib/rambling/trie/nodes/compressed.rbs index ceb06c7..d0e2269 100644 --- a/sig/lib/rambling/trie/nodes/compressed.rbs +++ b/sig/lib/rambling/trie/nodes/compressed.rbs @@ -8,13 +8,13 @@ module Rambling private - def partial_word_chars?: (Array[String | Symbol]) -> bool + def partial_word_chars?: (Array[String]) -> bool - def word_chars?: (Array[String | Symbol]) -> bool + def word_chars?: (Array[String]) -> bool - def closest_node: (Array[String | Symbol]) -> Node + def closest_node: (Array[String]) -> Node - def children_match_prefix: (Array[String | Symbol]) { (String) -> void } -> Enumerator[String, void]? + def children_match_prefix: (Array[String]) { (String) -> void } -> Enumerator[String, void]? end end end From 18220a50fcabe06306d9a9d4b6969547a73fb299 Mon Sep 17 00:00:00 2001 From: Edgar Gonzalez Date: Fri, 9 Feb 2024 13:13:27 -0500 Subject: [PATCH 17/23] Use steep check for ruby type lint --- .github/workflows/ruby.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ruby.yml b/.github/workflows/ruby.yml index 3515175..c3d88f1 100644 --- a/.github/workflows/ruby.yml +++ b/.github/workflows/ruby.yml @@ -23,8 +23,8 @@ jobs: bundler-cache: true - name: Run rubocop run: bundle exec rubocop - - name: Run rbs - run: bundle exec rbs validate lib/**/*.rb + - name: Run rbs + steep + run: bundle exec steep check spec: runs-on: ubuntu-latest strategy: From 512197e7715a7e6315f999397342a544d5bda85d Mon Sep 17 00:00:00 2001 From: Edgar Gonzalez Date: Mon, 19 Feb 2024 18:42:06 -0500 Subject: [PATCH 18/23] Add Container#push signature --- sig/lib/rambling/trie/container.rbs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/sig/lib/rambling/trie/container.rbs b/sig/lib/rambling/trie/container.rbs index 4f89a01..0d72066 100644 --- a/sig/lib/rambling/trie/container.rbs +++ b/sig/lib/rambling/trie/container.rbs @@ -21,6 +21,8 @@ module Rambling def partial_word?: (String) -> bool + def push: (*String) -> Array[Nodes::Node] + def word?: (String) -> bool def scan: (String) -> Array[String] From 42ab70f304fea5f9a4d961796382a28daafa8e0f Mon Sep 17 00:00:00 2001 From: Edgar Gonzalez Date: Mon, 19 Feb 2024 19:29:08 -0500 Subject: [PATCH 19/23] rubocop: Gemfile and Steepfile --- Gemfile | 4 ++-- Steepfile | 18 ++++++++++-------- 2 files changed, 12 insertions(+), 10 deletions(-) diff --git a/Gemfile b/Gemfile index 7f4f9ea..e3648cc 100644 --- a/Gemfile +++ b/Gemfile @@ -4,8 +4,6 @@ source 'https://rubygems.org' gemspec -gem 'rbs' -gem 'steep' gem 'rubyzip' group :development do @@ -14,9 +12,11 @@ group :development do gem 'memory_profiler' gem 'pry' gem 'rake' + gem 'rbs' gem 'rspec' gem 'ruby-prof' gem 'stackprof' + gem 'steep' gem 'yard' end diff --git a/Steepfile b/Steepfile index b8aa0e9..ca0e966 100644 --- a/Steepfile +++ b/Steepfile @@ -1,3 +1,5 @@ +# frozen_string_literal: true + # D = Steep::Diagnostic # target :lib do @@ -14,14 +16,14 @@ target :lib do # library 'rubyzip' library 'yaml' library 'securerandom' -# -# # configure_code_diagnostics(D::Ruby.default) # `default` diagnostics setting (applies by default) -# # configure_code_diagnostics(D::Ruby.strict) # `strict` diagnostics setting -# # configure_code_diagnostics(D::Ruby.lenient) # `lenient` diagnostics setting -# # configure_code_diagnostics(D::Ruby.silent) # `silent` diagnostics setting -# # configure_code_diagnostics do |hash| # You can setup everything yourself -# # hash[D::Ruby::NoMethod] = :information -# # end + + # configure_code_diagnostics(D::Ruby.default) # `default` diagnostics setting (applies by default) + # configure_code_diagnostics(D::Ruby.strict) # `strict` diagnostics setting + # configure_code_diagnostics(D::Ruby.lenient) # `lenient` diagnostics setting + # configure_code_diagnostics(D::Ruby.silent) # `silent` diagnostics setting + # configure_code_diagnostics do |hash| # You can setup everything yourself + # hash[D::Ruby::NoMethod] = :information + # end end # target :test do From e2f44456d569bfe9d123805cb1a808b5330e7e67 Mon Sep 17 00:00:00 2001 From: Edgar Gonzalez Date: Mon, 19 Feb 2024 20:56:56 -0500 Subject: [PATCH 20/23] Optional param signature for Rambling:Trie --- sig/lib/rambling/trie.rbs | 6 +++--- sig/lib/rambling/trie/serializers/serializer.rbs | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/sig/lib/rambling/trie.rbs b/sig/lib/rambling/trie.rbs index ca013aa..9451f7b 100644 --- a/sig/lib/rambling/trie.rbs +++ b/sig/lib/rambling/trie.rbs @@ -4,11 +4,11 @@ module Rambling @properties: Configuration::Properties - def self.create: (String?, Readers::Reader?) ?{ (Container) -> void } -> Container + def self.create: (?String?, ?Readers::Reader?) ?{ (Container) -> void } -> Container - def self.load: (String, Serializers::Serializer[Nodes::Node]?) ?{ (Container) -> void } -> Container + def self.load: (String, ?Serializers::Serializer[Nodes::Node]?) ?{ (Container) -> void } -> Container - def self.dump: (Container, String, Serializers::Serializer[Nodes::Node]?) -> void + def self.dump: (Container, String, ?Serializers::Serializer[Nodes::Node]?) -> void def self.config: ?{ (Configuration::Properties) -> void } -> Configuration::Properties diff --git a/sig/lib/rambling/trie/serializers/serializer.rbs b/sig/lib/rambling/trie/serializers/serializer.rbs index 8cc0c38..f05100b 100644 --- a/sig/lib/rambling/trie/serializers/serializer.rbs +++ b/sig/lib/rambling/trie/serializers/serializer.rbs @@ -2,7 +2,7 @@ module Rambling module Trie module Serializers class Serializer[TContents] - def load: (String) -> TContents? + def load: (String) -> TContents def dump: (TContents, String) -> Numeric end end From 090bdb4c9ae4dc3bf6152e1d558d6366f84858ab Mon Sep 17 00:00:00 2001 From: Edgar Gonzalez Date: Mon, 19 Feb 2024 20:54:57 -0500 Subject: [PATCH 21/23] Add EMPTY_ENUMERATOR constant; use for empty yields --- lib/rambling/trie/container.rb | 8 +++----- lib/rambling/trie/nodes/compressed.rb | 6 +++--- lib/rambling/trie/nodes/node.rb | 2 ++ lib/rambling/trie/nodes/raw.rb | 4 ++-- sig/lib/rambling/trie/container.rbs | 2 +- sig/lib/rambling/trie/nodes/compressed.rbs | 2 +- sig/lib/rambling/trie/nodes/node.rbs | 6 ++++-- sig/lib/rambling/trie/nodes/raw.rbs | 2 +- sig/lib/zip/entry.rbs | 2 +- 9 files changed, 18 insertions(+), 16 deletions(-) diff --git a/lib/rambling/trie/container.rb b/lib/rambling/trie/container.rb index b5d5320..c9b160d 100644 --- a/lib/rambling/trie/container.rb +++ b/lib/rambling/trie/container.rb @@ -202,17 +202,15 @@ def words_within_root phrase chars = phrase.chars 0.upto(chars.length - 1).each do |starting_index| - new_phrase = chars.slice starting_index..(chars.length - 1) + new_phrase = chars.slice starting_index..(chars.length - 1) #: Array[String] root.match_prefix new_phrase do |word| yield word end - end - - nil + end #: Enumerator[String, void] end def compress_root - compressor.compress root + compressor.compress root #: Nodes::Compressed end def char_symbols word diff --git a/lib/rambling/trie/nodes/compressed.rb b/lib/rambling/trie/nodes/compressed.rb index 5c901c2..eecc404 100644 --- a/lib/rambling/trie/nodes/compressed.rb +++ b/lib/rambling/trie/nodes/compressed.rb @@ -77,15 +77,15 @@ def closest_node chars def children_match_prefix chars return enum_for :children_match_prefix, chars unless block_given? - return if chars.empty? + return EMPTY_ENUMERATOR if chars.empty? child = children_tree[chars.first.to_sym] - return unless child + return EMPTY_ENUMERATOR unless child child_letter = child.letter.to_s letter = chars.slice!(0, child_letter.size).join - return unless child_letter == letter + return EMPTY_ENUMERATOR unless child_letter == letter child.match_prefix chars do |word| yield word diff --git a/lib/rambling/trie/nodes/node.rb b/lib/rambling/trie/nodes/node.rb index d0a495c..01dfa87 100644 --- a/lib/rambling/trie/nodes/node.rb +++ b/lib/rambling/trie/nodes/node.rb @@ -11,6 +11,8 @@ class Node include Rambling::Trie::Stringifyable include Rambling::Trie::Inspectable + EMPTY_ENUMERATOR = [].to_enum :each + # @overload letter # Letter(s) corresponding to the current node. # @overload letter=(letter) diff --git a/lib/rambling/trie/nodes/raw.rb b/lib/rambling/trie/nodes/raw.rb index 1442a3b..7f5b6ba 100644 --- a/lib/rambling/trie/nodes/raw.rb +++ b/lib/rambling/trie/nodes/raw.rb @@ -65,12 +65,12 @@ def closest_node chars def children_match_prefix chars return enum_for :children_match_prefix, chars unless block_given? - return if chars.empty? + return EMPTY_ENUMERATOR if chars.empty? letter = chars.shift.to_sym child = children_tree[letter] - return unless child + return EMPTY_ENUMERATOR unless child child.match_prefix chars do |word| yield word diff --git a/sig/lib/rambling/trie/container.rbs b/sig/lib/rambling/trie/container.rbs index 0d72066..f0627f9 100644 --- a/sig/lib/rambling/trie/container.rbs +++ b/sig/lib/rambling/trie/container.rbs @@ -59,7 +59,7 @@ module Rambling attr_reader compressor: Compressor attr_writer root: Nodes::Node - def words_within_root: (String) ?{ (String) -> void } -> (Enumerator[String, void]?) + def words_within_root: (String) ?{ (String) -> void } -> Enumerator[String, void] def compress_root: -> Nodes::Compressed diff --git a/sig/lib/rambling/trie/nodes/compressed.rbs b/sig/lib/rambling/trie/nodes/compressed.rbs index d0e2269..ef76a63 100644 --- a/sig/lib/rambling/trie/nodes/compressed.rbs +++ b/sig/lib/rambling/trie/nodes/compressed.rbs @@ -14,7 +14,7 @@ module Rambling def closest_node: (Array[String]) -> Node - def children_match_prefix: (Array[String]) { (String) -> void } -> Enumerator[String, void]? + def children_match_prefix: (Array[String]) { (String) -> void } -> Enumerator[String, void] end end end diff --git a/sig/lib/rambling/trie/nodes/node.rbs b/sig/lib/rambling/trie/nodes/node.rbs index b5d739d..771c0ef 100644 --- a/sig/lib/rambling/trie/nodes/node.rbs +++ b/sig/lib/rambling/trie/nodes/node.rbs @@ -2,6 +2,8 @@ module Rambling module Trie module Nodes class Node + EMPTY_ENUMERATOR: Enumerator[String, void] + include Compressible include Enumerable include Comparable @@ -20,7 +22,7 @@ module Rambling def first_child: -> Node? - def match_prefix: (Array[String]) { (String) -> void } -> Enumerator[String, void]? + def match_prefix: (Array[String]) { (String) -> void } -> Enumerator[String, void] def root?: -> bool @@ -62,7 +64,7 @@ module Rambling def closest_node: (Array[String]) -> Node - def children_match_prefix: (Array[String]) { (String) -> void } -> Enumerator[String, void]? + def children_match_prefix: (Array[String]) { (String) -> void } -> Enumerator[String, void] end end end diff --git a/sig/lib/rambling/trie/nodes/raw.rbs b/sig/lib/rambling/trie/nodes/raw.rbs index 556c0e0..a7440f4 100644 --- a/sig/lib/rambling/trie/nodes/raw.rbs +++ b/sig/lib/rambling/trie/nodes/raw.rbs @@ -18,7 +18,7 @@ module Rambling def closest_node: (Array[String]) -> Node - def children_match_prefix: (Array[String]) { (String) -> void } -> Enumerator[String, void]? + def children_match_prefix: (Array[String]) { (String) -> void } -> Enumerator[String, void] end end end diff --git a/sig/lib/zip/entry.rbs b/sig/lib/zip/entry.rbs index 1a4f54c..21f798c 100644 --- a/sig/lib/zip/entry.rbs +++ b/sig/lib/zip/entry.rbs @@ -6,6 +6,6 @@ module Zip def extract: (String) -> void - def each: ?{ (Entry) -> void } -> (Enumerator[Entry, void])? + def each: ?{ (Entry) -> void } -> (Enumerator[Entry, void]) end end \ No newline at end of file From 70eb2da3581ba6dcea2eb86a7bac20b3821e24fc Mon Sep 17 00:00:00 2001 From: Edgar Gonzalez Date: Mon, 19 Feb 2024 20:56:04 -0500 Subject: [PATCH 22/23] Add (x || raise) for nil unwrapping --- lib/rambling/trie.rb | 6 +++--- .../trie/configuration/provider_collection.rb | 4 +++- lib/rambling/trie/nodes/compressed.rb | 16 ++++++++-------- lib/rambling/trie/nodes/raw.rb | 10 +++++----- lib/rambling/trie/serializers/zip.rb | 6 +++++- 5 files changed, 24 insertions(+), 18 deletions(-) diff --git a/lib/rambling/trie.rb b/lib/rambling/trie.rb index 04c8fe2..e3b84a0 100644 --- a/lib/rambling/trie.rb +++ b/lib/rambling/trie.rb @@ -26,7 +26,7 @@ def create filepath = nil, reader = nil if filepath reader ||= readers.resolve filepath # noinspection RubyMismatchedArgumentType,RubyNilAnalysis - reader.each_word filepath do |word| + (reader || raise).each_word filepath do |word| container << word end end @@ -48,7 +48,7 @@ def create filepath = nil, reader = nil # discouraged. Only use the +.marshal+ format with trusted input. def load filepath, serializer = nil serializer ||= serializers.resolve filepath - root = serializer.load filepath + root = (serializer || raise).load filepath Rambling::Trie::Container.new root, compressor do |container| yield container if block_given? end @@ -66,7 +66,7 @@ def load filepath, serializer = nil def dump trie, filepath, serializer = nil serializer ||= serializers.resolve filepath # noinspection RubyNilAnalysis - serializer.dump trie.root, filepath + (serializer || raise).dump trie.root, filepath end # Provides configuration properties for the +Rambling::Trie+ gem. diff --git a/lib/rambling/trie/configuration/provider_collection.rb b/lib/rambling/trie/configuration/provider_collection.rb index 7e82743..059467e 100644 --- a/lib/rambling/trie/configuration/provider_collection.rb +++ b/lib/rambling/trie/configuration/provider_collection.rb @@ -104,7 +104,9 @@ def file_format filepath end def contains? provider - provider.nil? || (providers.any? && provider_instances.include?(provider)) + return true if provider.nil? + p = (provider || raise) + providers.any? && provider_instances.include?(p) end alias_method :provider_instances, :values diff --git a/lib/rambling/trie/nodes/compressed.rb b/lib/rambling/trie/nodes/compressed.rb index eecc404..d9fcc8c 100644 --- a/lib/rambling/trie/nodes/compressed.rb +++ b/lib/rambling/trie/nodes/compressed.rb @@ -23,13 +23,13 @@ def compressed? private def partial_word_chars? chars - child = children_tree[chars.first.to_sym] + child = children_tree[(chars.first || raise).to_sym] return false unless child child_letter = child.letter.to_s if chars.size >= child_letter.size - letter = chars.slice!(0, child_letter.size).join + letter = (chars.slice!(0, child_letter.size) || raise).join return child.partial_word? chars if child_letter == letter end @@ -39,7 +39,7 @@ def partial_word_chars? chars end def word_chars? chars - letter = chars.slice! 0 + letter = chars.slice!(0) || raise letter_sym = letter.to_sym child = children_tree[letter_sym] @@ -50,7 +50,7 @@ def word_chars? chars break if chars.empty? - letter << chars.slice!(0) + letter << (chars.slice!(0) || raise) letter_sym = letter.to_sym end @@ -58,13 +58,13 @@ def word_chars? chars end def closest_node chars - child = children_tree[chars.first.to_sym] + child = children_tree[(chars.first || raise).to_sym] return missing unless child child_letter = child.letter.to_s if chars.size >= child_letter.size - letter = chars.slice!(0, child_letter.size).join + letter = (chars.slice!(0, child_letter.size) || raise).join return child.scan chars if child_letter == letter end @@ -79,11 +79,11 @@ def children_match_prefix chars return EMPTY_ENUMERATOR if chars.empty? - child = children_tree[chars.first.to_sym] + child = children_tree[(chars.first || raise).to_sym] return EMPTY_ENUMERATOR unless child child_letter = child.letter.to_s - letter = chars.slice!(0, child_letter.size).join + letter = (chars.slice!(0, child_letter.size) || raise).join return EMPTY_ENUMERATOR unless child_letter == letter diff --git a/lib/rambling/trie/nodes/raw.rb b/lib/rambling/trie/nodes/raw.rb index 7f5b6ba..eec2916 100644 --- a/lib/rambling/trie/nodes/raw.rb +++ b/lib/rambling/trie/nodes/raw.rb @@ -26,7 +26,7 @@ def compressed? private def add_to_children_tree chars - letter = chars.pop + letter = chars.pop || raise child = children_tree[letter] || new_node(letter) child.add chars child @@ -39,7 +39,7 @@ def new_node letter end def partial_word_chars? chars = [] - letter = chars.shift.to_sym + letter = (chars.shift || raise).to_sym child = children_tree[letter] return false unless child @@ -47,7 +47,7 @@ def partial_word_chars? chars = [] end def word_chars? chars = [] - letter = chars.shift.to_sym + letter = (chars.shift || raise).to_sym child = children_tree[letter] return false unless child @@ -55,7 +55,7 @@ def word_chars? chars = [] end def closest_node chars - letter = chars.shift.to_sym + letter = (chars.shift || raise).to_sym child = children_tree[letter] return missing unless child @@ -67,7 +67,7 @@ def children_match_prefix chars return EMPTY_ENUMERATOR if chars.empty? - letter = chars.shift.to_sym + letter = (chars.shift || raise).to_sym child = children_tree[letter] return EMPTY_ENUMERATOR unless child diff --git a/lib/rambling/trie/serializers/zip.rb b/lib/rambling/trie/serializers/zip.rb index 809fbc9..740b63b 100644 --- a/lib/rambling/trie/serializers/zip.rb +++ b/lib/rambling/trie/serializers/zip.rb @@ -26,12 +26,14 @@ def load filepath ::Zip::File.open filepath do |zip| entry = zip.entries.first - return nil if entry.nil? + raise if entry.nil? entry_path = path entry.name entry.extract entry_path serializer = serializers.resolve entry.name + raise if serializer.nil? + serializer.load entry_path end end @@ -50,6 +52,8 @@ def dump contents, filepath entry_path = path filename serializer = serializers.resolve filename + + raise if serializer.nil? serializer.dump contents, entry_path zip.add filename, entry_path From 4f9678bd9d7460fa993d8e290b0b3ab98463f992 Mon Sep 17 00:00:00 2001 From: Edgar Gonzalez Date: Mon, 19 Feb 2024 21:41:34 -0500 Subject: [PATCH 23/23] emptyenum --- lib/rambling/trie/enumerable.rb | 2 ++ lib/rambling/trie/nodes/node.rb | 2 -- sig/lib/rambling/trie/enumerable.rbs | 2 ++ sig/lib/rambling/trie/nodes/node.rbs | 2 -- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/rambling/trie/enumerable.rb b/lib/rambling/trie/enumerable.rb index b3ca64f..7ffaee1 100644 --- a/lib/rambling/trie/enumerable.rb +++ b/lib/rambling/trie/enumerable.rb @@ -6,6 +6,8 @@ module Trie module Enumerable include ::Enumerable + EMPTY_ENUMERATOR = [].to_enum :each + # Returns number of words contained in the trie # @see https://ruby-doc.org/core-2.7.0/Enumerable.html#method-i-count Enumerable#count alias_method :size, :count diff --git a/lib/rambling/trie/nodes/node.rb b/lib/rambling/trie/nodes/node.rb index 01dfa87..d0a495c 100644 --- a/lib/rambling/trie/nodes/node.rb +++ b/lib/rambling/trie/nodes/node.rb @@ -11,8 +11,6 @@ class Node include Rambling::Trie::Stringifyable include Rambling::Trie::Inspectable - EMPTY_ENUMERATOR = [].to_enum :each - # @overload letter # Letter(s) corresponding to the current node. # @overload letter=(letter) diff --git a/sig/lib/rambling/trie/enumerable.rbs b/sig/lib/rambling/trie/enumerable.rbs index d2f8ad0..efec895 100644 --- a/sig/lib/rambling/trie/enumerable.rbs +++ b/sig/lib/rambling/trie/enumerable.rbs @@ -3,6 +3,8 @@ module Rambling module Enumerable include ::Enumerable[String] + EMPTY_ENUMERATOR: Enumerator[String, void] + alias size count def each: { (String) -> void } -> (Enumerator[String, void] | Enumerable) diff --git a/sig/lib/rambling/trie/nodes/node.rbs b/sig/lib/rambling/trie/nodes/node.rbs index 771c0ef..cab7efa 100644 --- a/sig/lib/rambling/trie/nodes/node.rbs +++ b/sig/lib/rambling/trie/nodes/node.rbs @@ -2,8 +2,6 @@ module Rambling module Trie module Nodes class Node - EMPTY_ENUMERATOR: Enumerator[String, void] - include Compressible include Enumerable include Comparable