greek_abc 0.4.3 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: c477315c6d8488763ae6aaf9cda25496efe69c3626c4d9b5303f2a37ca20732d
4
- data.tar.gz: 021a7e8589ff196694b3f3d28f4afb0773d3aad16cc6c068aab009d3118b18c1
3
+ metadata.gz: 4a8d90028ace5d4eba870e2928c93d3451a4f3f815ddb64fe1f4660aa6c9026d
4
+ data.tar.gz: e35ab039f0086b309fbd09c80e7c70299e3b12866f6cd9cf32c8964821e5f3db
5
5
  SHA512:
6
- metadata.gz: dd7a8f8b82cb8c66884ad6f176378de9a7b225fa627c895d6ebf046c76b910233734b12380c200ea0e8da8f5bfad93c21c88cb7746b0e79cb8809c9d377abe81
7
- data.tar.gz: b833cdc98f6e919739566830a22a537dc757be60569a97017488a1e1931c04b279b793a34bdd73b390e88d037418e296e67e498c4c2a4d210d2f265249a63096
6
+ metadata.gz: 7aaf58156345da497974c0440f7b8ce9f789ebe2e35e24d610ff4beaf8ae7998ee2e98f49471f8fe13fed2a2d2bd34e395ef3a7467dfdb75b9938388929a56a3
7
+ data.tar.gz: 53bc55871d72b93762821a878d0755577279a9119b599331cc90f2f622abd43b9649cfbd11526b244475577003c2f9a2e54921b08260efae7197792045ae7682
data/.rubocop.yml ADDED
@@ -0,0 +1,2 @@
1
+ AllCops:
2
+ TargetRubyVersion: 3.0
data/.yardopts ADDED
@@ -0,0 +1,3 @@
1
+ --private
2
+ -r README.md
3
+ --exclude lib/greek_abc/version.rb
data/Gemfile CHANGED
@@ -1,4 +1,6 @@
1
- source "https://rubygems.org"
1
+ source 'https://rubygems.org'
2
2
 
3
3
  # Specify your gem's dependencies in greek_abc.gemspec
4
4
  gemspec
5
+
6
+ gem 'steep', '~> 1.3'
data/Gemfile.lock CHANGED
@@ -1,35 +1,134 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- greek_abc (0.4.2)
4
+ greek_abc (2.0.0)
5
5
 
6
6
  GEM
7
7
  remote: https://rubygems.org/
8
8
  specs:
9
- diff-lcs (1.3)
10
- rake (10.5.0)
11
- rspec (3.8.0)
12
- rspec-core (~> 3.8.0)
13
- rspec-expectations (~> 3.8.0)
14
- rspec-mocks (~> 3.8.0)
15
- rspec-core (3.8.0)
16
- rspec-support (~> 3.8.0)
17
- rspec-expectations (3.8.3)
9
+ activesupport (7.0.4.2)
10
+ concurrent-ruby (~> 1.0, >= 1.0.2)
11
+ i18n (>= 1.6, < 2)
12
+ minitest (>= 5.1)
13
+ tzinfo (~> 2.0)
14
+ ast (2.4.2)
15
+ backport (1.2.0)
16
+ benchmark (0.2.1)
17
+ concurrent-ruby (1.2.0)
18
+ csv (3.2.6)
19
+ diff-lcs (1.5.0)
20
+ e2mmap (0.1.0)
21
+ ffi (1.15.5)
22
+ fileutils (1.7.0)
23
+ i18n (1.12.0)
24
+ concurrent-ruby (~> 1.0)
25
+ jaro_winkler (1.5.4)
26
+ json (2.6.3)
27
+ kramdown (2.4.0)
28
+ rexml
29
+ kramdown-parser-gfm (1.1.0)
30
+ kramdown (~> 2.0)
31
+ language_server-protocol (3.17.0.3)
32
+ listen (3.8.0)
33
+ rb-fsevent (~> 0.10, >= 0.10.3)
34
+ rb-inotify (~> 0.9, >= 0.9.10)
35
+ logger (1.5.3)
36
+ minitest (5.17.0)
37
+ nokogiri (1.14.1-arm64-darwin)
38
+ racc (~> 1.4)
39
+ parallel (1.22.1)
40
+ parser (3.2.1.0)
41
+ ast (~> 2.4.1)
42
+ racc (1.6.2)
43
+ rainbow (3.1.1)
44
+ rake (13.0.6)
45
+ rb-fsevent (0.11.2)
46
+ rb-inotify (0.10.1)
47
+ ffi (~> 1.0)
48
+ rbs (2.8.4)
49
+ regexp_parser (2.7.0)
50
+ reverse_markdown (2.1.1)
51
+ nokogiri
52
+ rexml (3.2.5)
53
+ rspec (3.12.0)
54
+ rspec-core (~> 3.12.0)
55
+ rspec-expectations (~> 3.12.0)
56
+ rspec-mocks (~> 3.12.0)
57
+ rspec-core (3.12.1)
58
+ rspec-support (~> 3.12.0)
59
+ rspec-expectations (3.12.2)
18
60
  diff-lcs (>= 1.2.0, < 2.0)
19
- rspec-support (~> 3.8.0)
20
- rspec-mocks (3.8.0)
61
+ rspec-support (~> 3.12.0)
62
+ rspec-mocks (3.12.3)
21
63
  diff-lcs (>= 1.2.0, < 2.0)
22
- rspec-support (~> 3.8.0)
23
- rspec-support (3.8.0)
64
+ rspec-support (~> 3.12.0)
65
+ rspec-support (3.12.0)
66
+ rubocop (1.45.1)
67
+ json (~> 2.3)
68
+ parallel (~> 1.10)
69
+ parser (>= 3.2.0.0)
70
+ rainbow (>= 2.2.2, < 4.0)
71
+ regexp_parser (>= 1.8, < 3.0)
72
+ rexml (>= 3.2.5, < 4.0)
73
+ rubocop-ast (>= 1.24.1, < 2.0)
74
+ ruby-progressbar (~> 1.7)
75
+ unicode-display_width (>= 2.4.0, < 3.0)
76
+ rubocop-ast (1.24.1)
77
+ parser (>= 3.1.1.0)
78
+ ruby-progressbar (1.11.0)
79
+ securerandom (0.2.2)
80
+ solargraph (0.48.0)
81
+ backport (~> 1.2)
82
+ benchmark
83
+ bundler (>= 1.17.2)
84
+ diff-lcs (~> 1.4)
85
+ e2mmap
86
+ jaro_winkler (~> 1.5)
87
+ kramdown (~> 2.3)
88
+ kramdown-parser-gfm (~> 1.1)
89
+ parser (~> 3.0)
90
+ reverse_markdown (>= 1.0.5, < 3)
91
+ rubocop (>= 0.52)
92
+ thor (~> 1.0)
93
+ tilt (~> 2.0)
94
+ yard (~> 0.9, >= 0.9.24)
95
+ steep (1.3.0)
96
+ activesupport (>= 5.1)
97
+ csv (>= 3.0.9)
98
+ fileutils (>= 1.1.0)
99
+ json (>= 2.1.0)
100
+ language_server-protocol (>= 3.15, < 4.0)
101
+ listen (~> 3.0)
102
+ logger (>= 1.3.0)
103
+ parallel (>= 1.0.0)
104
+ parser (>= 3.1)
105
+ rainbow (>= 2.2.2, < 4.0)
106
+ rbs (>= 2.8.0)
107
+ securerandom (>= 0.1)
108
+ strscan (>= 1.0.0)
109
+ terminal-table (>= 2, < 4)
110
+ strscan (3.0.6)
111
+ terminal-table (3.0.2)
112
+ unicode-display_width (>= 1.1.1, < 3)
113
+ thor (1.2.1)
114
+ tilt (2.0.11)
115
+ tzinfo (2.0.6)
116
+ concurrent-ruby (~> 1.0)
117
+ unicode-display_width (2.4.2)
118
+ webrick (1.7.0)
119
+ yard (0.9.28)
120
+ webrick (~> 1.7.0)
24
121
 
25
122
  PLATFORMS
26
- ruby
123
+ arm64-darwin-22
27
124
 
28
125
  DEPENDENCIES
29
- bundler (~> 2.0)
126
+ bundler
30
127
  greek_abc!
31
- rake (~> 10.0)
32
- rspec (~> 3.0)
128
+ rake
129
+ rspec
130
+ solargraph
131
+ steep (~> 1.3)
33
132
 
34
133
  BUNDLED WITH
35
- 2.0.1
134
+ 2.4.6
data/README.md CHANGED
@@ -4,14 +4,21 @@
4
4
 
5
5
  <img src=".logo.png" width="200px" align="right">
6
6
 
7
- Gem for Greek alphabet manipulations
7
+ Greek alphabet as a gem, nothing extra.
8
+
9
+ Well [documented](https://rubydoc.info/github/vladyio/greek_abc/master), covered with [tests](/spec)
10
+ and [RBS](/sig).
8
11
 
9
12
  ## Installation
10
13
 
14
+ > [Legacy v0.4.4](https://github.com/vladyio/greek_abc/tree/v0.4.4)
15
+
16
+ > Ruby `>= 2.7` is recommended
17
+
11
18
  Add this line to your application's Gemfile:
12
19
 
13
20
  ```ruby
14
- gem 'greek_abc'
21
+ gem 'greek_abc', '~> 2.0.0'
15
22
  ```
16
23
 
17
24
  And then execute:
@@ -24,77 +31,57 @@ Or install it yourself as:
24
31
 
25
32
  ## Usage
26
33
 
27
- Add `require 'greek_abc'` to your script.
28
-
29
- #### Single letters
34
+ **🔤 Get an array of all letters**
30
35
 
31
36
  ```ruby
32
- GreekABC::Alphabet.alpha # => #<GreekABC::Letter:0x0000557ef0e4fda8 @position=1, @name="Alpha", @lower="α", @upper="Α">
33
-
34
- GreekABC::Alphabet.omega # => #<GreekABC::Letter:0x0000557ef0e37a78 @position=24, @name="Omega", @lower="ω", @upper="Ω">
37
+ GreekABC::Alphabet.new.letters
35
38
  ```
36
39
 
37
- #### Lookup
40
+ **🔎 Look up a letter by attributes**
38
41
 
39
42
  ```ruby
40
- abc = GreekABC::Alphabet.new
41
-
42
- psi = abc.find_letter_by(name: 'Psi') # => <..@lower="ψ", @name="Psi", @position=23, @upper="Ψ">
43
- eta = abc.find_letter_by(position: 7) # => <..@lower="η", @name="Eta", @position=7, @upper="Η">
44
-
45
- puts psi # => Letter #23 'Psi', lowercase 'ψ', uppercase 'Ψ'
43
+ GreekABC::Alphabet.new.find_letter(name: 'lambda')
44
+ GreekABC::Alphabet.new.find_letter(position: 5)
46
45
  ```
47
46
 
48
- #### `Letter` methods
47
+ **🫳🏻 Easily reach for the letter attributes**
49
48
 
50
49
  ```ruby
51
- abc = GreekABC::Alphabet.new
50
+ l = GreekABC::Alphabet.new.find_letter(name: 'lambda')
52
51
 
53
- omega = abc.find_letter_by(name: 'Omega').lower # => "ω"
54
- omega = abc.find_letter_by(name: 'Omega').upper # => "Ω"
55
- omega = abc.find_letter_by(name: 'Omega').position # => 24
56
-
57
- alpha = abc.find_letter_by(position: 1).name # => "Alpha"
52
+ puts [l.name, l.position, l.lower]
58
53
  ```
59
54
 
60
- #### Get all letters
55
+ **#️⃣ Get the ABC as a hash:**
61
56
 
62
57
  ```ruby
63
58
  abc = GreekABC::Alphabet.new
64
- puts abc.letters
59
+ puts abc.to_h # => {"Alpha"=>{:position=>1, :lower=>"α", :upper=>"Α" ...
65
60
  ```
66
61
 
67
- Also get letters as a hash:
62
+ **🖨️ Print print print!**
68
63
 
69
64
  ```ruby
70
- abc = GreekABC::Alphabet.new
71
- puts abc.to_h # => {"Alpha"=>{:position=>1, :lower=>"α", :upper=>"Α"}
72
- ```
65
+ puts GreekABC::Alphabet.new.letters
73
66
 
74
- #### Basic sets of letters
75
-
76
- - Hash with letters and their names
77
-
78
- ```ruby
79
- abc = GreekABC::ALPHABET # => {"Alpha"=>"α", "Beta"=>"β", ...}
80
- ```
81
-
82
- - Lowercase letters
83
-
84
- ```ruby
85
- abc = GreekABC::LOWERS # => ["α", "β", ...]
86
- ```
87
-
88
- - Uppercase letters
89
-
90
- ```ruby
91
- abc = GreekABC::UPPERS # => ["Α", "Β", ...]
67
+ # ...
68
+ # Letter #16 'Pi', lowercase 'π', uppercase 'Π'
69
+ # Letter #17 'Rho', lowercase 'ρ', uppercase 'Ρ'
70
+ # Letter #18 'Sigma', lowercase 'σ / ς', uppercase 'Σ'
71
+ # ...
92
72
  ```
93
73
 
94
- - Lowercase and uppercase together
74
+ **✨Alternative✨ lowercase Sigma support**
95
75
 
96
76
  ```ruby
97
- abc = GreekABC::LOWERS_AND_UPPERS
77
+ GreekABC::Alphabet.new.find_letter(name: :sigma)
78
+
79
+ # <GreekABC::Letter:0x00000001078e4c90
80
+ # @lower="σ",
81
+ # @lower_alt="ς", <== cool, right?
82
+ # @name="Sigma",
83
+ # @position=18,
84
+ # @upper="Σ">
98
85
  ```
99
86
 
100
87
  ## Development
data/Rakefile CHANGED
@@ -1,6 +1,6 @@
1
- require "bundler/gem_tasks"
2
- require "rspec/core/rake_task"
1
+ require 'bundler/gem_tasks'
2
+ require 'rspec/core/rake_task'
3
3
 
4
4
  RSpec::Core::RakeTask.new(:spec)
5
5
 
6
- task :default => :spec
6
+ task default: :spec
data/Steepfile ADDED
@@ -0,0 +1,4 @@
1
+ target :lib do
2
+ check 'lib'
3
+ signature 'sig'
4
+ end
data/bin/console CHANGED
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
- require "bundler/setup"
4
- require "greek_abc"
3
+ require 'bundler/setup'
4
+ require 'greek_abc'
5
5
 
6
- require "irb"
6
+ require 'irb'
7
7
  IRB.start(__FILE__)
data/greek_abc.gemspec CHANGED
@@ -1,41 +1,36 @@
1
-
2
- lib = File.expand_path("../lib", __FILE__)
1
+ lib = File.expand_path('lib', __dir__)
3
2
  $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
- require "greek_abc/version"
3
+ require 'greek_abc/version'
5
4
 
6
5
  Gem::Specification.new do |spec|
7
- spec.name = "greek_abc"
6
+ spec.name = 'greek_abc'
8
7
  spec.version = GreekABC::VERSION
9
- spec.authors = ["Vladislav Andreev"]
10
- spec.email = ["me@vld.by"]
8
+ spec.authors = ['Vladislav Andreev']
9
+ spec.email = ['andreev@vlad.social']
11
10
 
12
- spec.summary = %q{Greek alphabet manipulation gem}
13
- spec.homepage = "https://github.com/vladyio/greek_abc"
14
- spec.license = "MIT"
11
+ spec.summary = 'Greek alphabet manipulation gem'
12
+ spec.homepage = 'https://github.com/vladyio/greek_abc'
13
+ spec.license = 'MIT'
15
14
 
16
- # Prevent pushing this gem to RubyGems.org. To allow pushes either set the 'allowed_push_host'
17
- # to allow pushing to a single host or delete this section to allow pushing to any host.
18
- if spec.respond_to?(:metadata)
19
- spec.metadata["allowed_push_host"] = "https://rubygems.org/"
15
+ spec.metadata['allowed_push_host'] = 'https://rubygems.org/'
16
+ spec.metadata['homepage_uri'] = spec.homepage
17
+ spec.metadata['source_code_uri'] = 'https://github.com/vladyio/greek_abc'
18
+ spec.metadata['changelog_uri'] = 'https://github.com/vladyio/greek_abc/blob/master/CHANGELOG.md'
20
19
 
21
- spec.metadata["homepage_uri"] = spec.homepage
22
- spec.metadata["source_code_uri"] = "https://github.com/vladyio/greek_abc"
23
- spec.metadata["changelog_uri"] = "https://github.com/vladyio/greek_abc/blob/master/CHANGELOG.md"
24
- else
25
- raise "RubyGems 2.0 or newer is required to protect against " \
26
- "public gem pushes."
27
- end
20
+ spec.metadata['steep_types'] = 'sig'
21
+
22
+ spec.required_ruby_version = '>= 2.7.0'
28
23
 
29
24
  # Specify which files should be added to the gem when it is released.
30
25
  # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
31
- spec.files = Dir.chdir(File.expand_path('..', __FILE__)) do
26
+ spec.files = Dir.chdir(File.expand_path(__dir__)) do
32
27
  `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
33
28
  end
34
- spec.bindir = "exe"
35
- spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
36
- spec.require_paths = ["lib"]
29
+ spec.bindir = 'bin'
30
+ spec.require_paths = ['lib']
37
31
 
38
- spec.add_development_dependency "bundler", "~> 2.0"
39
- spec.add_development_dependency "rake", "~> 10.0"
40
- spec.add_development_dependency "rspec", "~> 3.0"
32
+ spec.add_development_dependency 'bundler'
33
+ spec.add_development_dependency 'rake'
34
+ spec.add_development_dependency 'rspec'
35
+ spec.add_development_dependency 'solargraph'
41
36
  end
@@ -1,59 +1,56 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module GreekABC
4
+ #
5
+ # Alphabet representation
6
+ #
7
+ # @!attribute [r] letters
8
+ # @return [Array<Letter>] an array of all letters of the alphabet
2
9
  class Alphabet
3
- attr_accessor :letters
4
-
5
- ALPHABET.map.with_index(1) do |(name, letter), index|
6
- define_singleton_method(:"#{name.downcase}") do
7
- Letter.new(position: index, name: name, lower: letter,
8
- upper: letter.upcase)
9
- end
10
- end
10
+ attr_reader :letters
11
11
 
12
+ # Initialize an Alphabet object, a collection of all letters
13
+ #
14
+ # @return [Array<Letter>]
12
15
  def initialize
13
- @letters = ALPHABET.map.with_index(1) do |(name, letter), index|
16
+ @letters = ALPHABET.map.with_index(1) do |(name, letter_variant), index|
17
+ # @type var letter_variant: String | Array[untyped]
18
+ letter = letter_variant[0]
19
+ letter_alt = letter_variant[1]
20
+
14
21
  Letter.new(position: index, name: name, lower: letter,
15
- upper: letter.upcase)
22
+ lower_alt: letter_alt, upper: letter.upcase)
16
23
  end
17
24
  end
18
25
 
19
- def find_letter_by(**lookup)
20
- parameter = lookup.keys.first
21
- value = lookup.values.first
22
-
23
- unless letter_parameter?(parameter)
24
- raise LetterLookupError, "Letter does not have parameter `#{parameter}`"
25
- end
26
-
27
- result = @letters.find do |letter|
28
- letter if letter.send(parameter.to_sym) == value
29
- end
30
-
31
- unless result
32
- raise LetterNotFoundError, "Letter with `#{parameter}: #{value}` not found"
33
- end
34
-
35
- result
26
+ # Finds a letter by given lookup parameteres
27
+ # @example
28
+ # GreekABC::Alphabet.new.find_letter(name: 'Lambda') # => #<GreekABC::Letter:...
29
+ # @param [Hash{Symbol => String, Integer, nil}] lookup_params
30
+ # A hash, with some {Letter} attribute as a key and desired lookup value
31
+ # @return [Letter]
32
+ # @see LetterLookup#find_letter
33
+ def find_letter(**lookup_params)
34
+ LetterLookup.new(letters).find_letter(**lookup_params)
36
35
  end
37
36
 
37
+ # Hash representation of an alphabet
38
+ # @return [Hash{String => String, Integer}]
38
39
  def to_h
39
- @letters.each_with_object({}) do |letter, hash|
40
+ letters.each_with_object({}) do |letter, hash|
40
41
  hash[letter.name.to_s] = {
41
42
  position: letter.position,
42
43
  lower: letter.lower,
44
+ lower_alt: letter.lower_alt,
43
45
  upper: letter.upper
44
46
  }
45
47
  end
46
48
  end
47
49
 
50
+ # String representation of an alphabet
51
+ # @return [String]
48
52
  def to_s
49
- @letters
50
- end
51
-
52
- private
53
-
54
- def letter_parameter?(parameter)
55
- parameters = %i[name position lower upper]
56
- parameters.include?(parameter)
53
+ letters
57
54
  end
58
55
  end
59
56
  end
@@ -1,4 +1,9 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module GreekABC
4
+ #
5
+ # Hash of full letter names and their lowercase representation variant(s)
6
+ #
2
7
  ALPHABET = {
3
8
  'Alpha' => 'α',
4
9
  'Beta' => 'β',
@@ -17,7 +22,7 @@ module GreekABC
17
22
  'Omicron' => 'ο',
18
23
  'Pi' => 'π',
19
24
  'Rho' => 'ρ',
20
- 'Sigma' => 'σ',
25
+ 'Sigma' => %w[σ ς],
21
26
  'Tau' => 'τ',
22
27
  'Upsilon' => 'υ',
23
28
  'Phi' => 'φ',
@@ -25,8 +30,4 @@ module GreekABC
25
30
  'Psi' => 'ψ',
26
31
  'Omega' => 'ω'
27
32
  }.freeze
28
-
29
- LOWERS = ALPHABET.values.freeze
30
- UPPERS = LOWERS.map(&:upcase).freeze
31
- LOWERS_AND_UPPERS = (LOWERS + UPPERS).freeze
32
33
  end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ module GreekABC
4
+ class GreekABCError < StandardError; end
5
+
6
+ # Raised when the lookup parameter is not a valid {Letter} attribute
7
+ class LetterLookupParamsError < GreekABCError
8
+ def initialize(wrong_parameter)
9
+ super("`#{wrong_parameter}` is not an existing letter attribute")
10
+ end
11
+ end
12
+
13
+ # Raised when the passed parameter and value didn't match any {Letter}
14
+ class LetterNotFoundError < GreekABCError
15
+ def initialize(parameter, value)
16
+ super("Letter with `#{parameter}: #{value}` was not found")
17
+ end
18
+ end
19
+ end
@@ -1,16 +1,47 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module GreekABC
4
+ #
5
+ # Represents a letter object
6
+ #
7
+ # @!attribute [r] position
8
+ # @return [Integer] letter position in the alphabet
9
+ # @!attribute [r] name
10
+ # @return [String] letter name
11
+ # @!attribute [r] lower
12
+ # @return [String] lowercase representation
13
+ # @!attribute [r] lower_alt
14
+ # @return [String, nil] lowercase alternative represenation, if exists
15
+ # @!attribute [r] upper
16
+ # @return [String] uppercase representation
2
17
  class Letter
3
- attr_reader :position, :name, :lower, :upper
18
+ attr_reader :position, :name, :lower, :lower_alt, :upper
4
19
 
5
- def initialize(position:, name:, lower:, upper:)
20
+ # Initialize a new letter
21
+ #
22
+ # @param [Integer] position (see {position})
23
+ # @param [String] name (see {name})
24
+ # @param [String] lower (see {lower})
25
+ # @param [String] upper (see {upper})
26
+ # @param [String, nil] lower_alt (see {lower_alt})
27
+ # @return [Letter]
28
+ #
29
+ def initialize(position:, name:, lower:, upper:, lower_alt: nil)
6
30
  @position = position
7
31
  @name = name
8
32
  @lower = lower
33
+ @lower_alt = lower_alt
9
34
  @upper = upper
10
35
  end
11
36
 
37
+ #
38
+ # String representation of a {Letter} object
39
+ # @return [String]
12
40
  def to_s
13
- "Letter ##{@position} '#{@name}', lowercase '#{@lower}', uppercase '#{@upper}'"
41
+ lower_alt = " / #{@lower_alt}" if @lower_alt
42
+
43
+ "Letter ##{@position} '#{@name}', lowercase '#{@lower}" \
44
+ "#{lower_alt}', uppercase '#{@upper}'"
14
45
  end
15
46
  end
16
47
  end
@@ -0,0 +1,55 @@
1
+ # frozen_string_literal: true
2
+
3
+ module GreekABC
4
+ #
5
+ # Letter lookup utility class
6
+ # @!attribute [r] letters
7
+ # @return [Array<Letter>]
8
+ class LetterLookup
9
+ # @dynamic letters
10
+ attr_reader :letters
11
+
12
+ # All available letter attributes.
13
+ # @see #letter_parameter?
14
+ LOOKUP_PARAMETERS = %i[name position lower lower_alt upper].freeze
15
+
16
+ # @param [Array<Letters>] letters
17
+ # An array of letters generated by GreekABC::Alphabet.new.letters
18
+ def initialize(letters)
19
+ @letters = letters
20
+ end
21
+
22
+ # Finds a letter by given lookup parameteres
23
+ # @example
24
+ # letters = GreekABC::Alphabet.new.letters
25
+ # GreekABC::LetterLookup.new(letters).find_letter(name: 'Lambda') # => #<GreekABC::Letter:...
26
+ # @param [Hash{Symbol => String, Integer}] lookup_params
27
+ # A hash, with some {Letter} attribute as a key and desired lookup value
28
+ # @return [Letter]
29
+ # @raise [LetterLookupParamsError] if passed parameter is not an existing
30
+ # letter attribute
31
+ # @raise [LetterNotFoundError] if a letter with given parameters does not exist
32
+ # @see Alphabet#find_letter
33
+ def find_letter(**lookup_params) # rubocop:disable Metrics/AbcSize
34
+ # @type var lookup_params: Hash[Symbol | untyped, String | Integer | nil]
35
+ parameter = lookup_params.keys.first.to_sym
36
+ value = lookup_params.values.first
37
+
38
+ raise LetterLookupParamsError, parameter unless letter_parameter?(parameter)
39
+
40
+ result = letters.find do |letter|
41
+ letter if letter.send(parameter).to_s.downcase == value.to_s.downcase
42
+ end
43
+
44
+ raise LetterNotFoundError.new(parameter, value) unless result
45
+
46
+ result
47
+ end
48
+
49
+ private
50
+
51
+ def letter_parameter?(parameter)
52
+ LOOKUP_PARAMETERS.include?(parameter)
53
+ end
54
+ end
55
+ end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module GreekABC
2
- VERSION = "0.4.3"
4
+ VERSION = '2.0.0'
3
5
  end
data/lib/greek_abc.rb CHANGED
@@ -1,11 +1,11 @@
1
- require 'greek_abc/version'
1
+ # frozen_string_literal: true
2
2
 
3
+ require 'greek_abc/version'
3
4
  require 'greek_abc/constants'
5
+ require 'greek_abc/errors'
4
6
  require 'greek_abc/letter'
7
+ require 'greek_abc/letter_lookup'
5
8
  require 'greek_abc/alphabet'
6
9
 
7
10
  module GreekABC
8
- class GreekABCError < StandardError; end
9
- class LetterLookupError < GreekABCError; end
10
- class LetterNotFoundError < GreekABCError; end
11
11
  end
data/sig/greek_abc.rbs ADDED
@@ -0,0 +1,62 @@
1
+ module GreekABC
2
+ ALPHABET: Hash[String, String | Array[String]]
3
+
4
+ VERSION: String
5
+ end
6
+
7
+ module GreekABC
8
+ class Alphabet
9
+ attr_accessor letters: Array[GreekABC::Letter]
10
+
11
+ def initialize: () -> void
12
+
13
+ def find_letter: (**untyped lookup_params) -> GreekABC::Letter
14
+
15
+ def to_h: () -> Hash[String, String | Integer]
16
+ def to_s: () -> untyped
17
+ end
18
+ end
19
+
20
+ module GreekABC
21
+ class GreekABCError < StandardError
22
+ end
23
+
24
+ class LetterLookupParamsError < GreekABCError
25
+ def initialize: (Symbol wrong_parameter) -> void
26
+ end
27
+
28
+ class LetterNotFoundError < GreekABCError
29
+ def initialize: (Symbol parameter, String | Integer | nil value) -> void
30
+ end
31
+ end
32
+
33
+ module GreekABC
34
+ class Letter
35
+ attr_reader position: Integer
36
+ attr_reader name: String
37
+ attr_reader lower: String
38
+ attr_reader lower_alt: String?
39
+ attr_reader upper: String
40
+
41
+ def initialize: (position: Integer, name: String, lower: String,
42
+ upper: String, ?lower_alt: String?) -> void
43
+
44
+ def to_s: () -> String
45
+ end
46
+ end
47
+
48
+ module GreekABC
49
+ class LetterLookup
50
+ attr_reader letters: Array[GreekABC::Letter]
51
+
52
+ LOOKUP_PARAMETERS: Array[Symbol]
53
+
54
+ def initialize: (Array[GreekABC::Letter] letters) -> untyped
55
+
56
+ def find_letter: (**untyped lookup_params) -> GreekABC::Letter
57
+
58
+ private
59
+
60
+ def letter_parameter?: (Symbol parameter) -> bool
61
+ end
62
+ end
metadata CHANGED
@@ -1,60 +1,74 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: greek_abc
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.3
4
+ version: 2.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Vladislav Andreev
8
- autorequire:
9
- bindir: exe
8
+ autorequire:
9
+ bindir: bin
10
10
  cert_chain: []
11
- date: 2019-05-05 00:00:00.000000000 Z
11
+ date: 2023-02-15 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - "~>"
17
+ - - ">="
18
18
  - !ruby/object:Gem::Version
19
- version: '2.0'
19
+ version: '0'
20
20
  type: :development
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - "~>"
24
+ - - ">="
25
25
  - !ruby/object:Gem::Version
26
- version: '2.0'
26
+ version: '0'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: rake
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - "~>"
31
+ - - ">="
32
32
  - !ruby/object:Gem::Version
33
- version: '10.0'
33
+ version: '0'
34
34
  type: :development
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - "~>"
38
+ - - ">="
39
39
  - !ruby/object:Gem::Version
40
- version: '10.0'
40
+ version: '0'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: rspec
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - "~>"
45
+ - - ">="
46
46
  - !ruby/object:Gem::Version
47
- version: '3.0'
47
+ version: '0'
48
48
  type: :development
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
- - - "~>"
52
+ - - ">="
53
53
  - !ruby/object:Gem::Version
54
- version: '3.0'
55
- description:
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: solargraph
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ description:
56
70
  email:
57
- - me@vld.by
71
+ - andreev@vlad.social
58
72
  executables: []
59
73
  extensions: []
60
74
  extra_rdoc_files: []
@@ -62,21 +76,26 @@ files:
62
76
  - ".gitignore"
63
77
  - ".logo.png"
64
78
  - ".rspec"
65
- - ".travis.yml"
79
+ - ".rubocop.yml"
80
+ - ".yardopts"
66
81
  - CHANGELOG.md
67
82
  - Gemfile
68
83
  - Gemfile.lock
69
84
  - LICENSE.txt
70
85
  - README.md
71
86
  - Rakefile
87
+ - Steepfile
72
88
  - bin/console
73
89
  - bin/setup
74
90
  - greek_abc.gemspec
75
91
  - lib/greek_abc.rb
76
92
  - lib/greek_abc/alphabet.rb
77
93
  - lib/greek_abc/constants.rb
94
+ - lib/greek_abc/errors.rb
78
95
  - lib/greek_abc/letter.rb
96
+ - lib/greek_abc/letter_lookup.rb
79
97
  - lib/greek_abc/version.rb
98
+ - sig/greek_abc.rbs
80
99
  homepage: https://github.com/vladyio/greek_abc
81
100
  licenses:
82
101
  - MIT
@@ -85,7 +104,8 @@ metadata:
85
104
  homepage_uri: https://github.com/vladyio/greek_abc
86
105
  source_code_uri: https://github.com/vladyio/greek_abc
87
106
  changelog_uri: https://github.com/vladyio/greek_abc/blob/master/CHANGELOG.md
88
- post_install_message:
107
+ steep_types: sig
108
+ post_install_message:
89
109
  rdoc_options: []
90
110
  require_paths:
91
111
  - lib
@@ -93,15 +113,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
93
113
  requirements:
94
114
  - - ">="
95
115
  - !ruby/object:Gem::Version
96
- version: '0'
116
+ version: 2.7.0
97
117
  required_rubygems_version: !ruby/object:Gem::Requirement
98
118
  requirements:
99
119
  - - ">="
100
120
  - !ruby/object:Gem::Version
101
121
  version: '0'
102
122
  requirements: []
103
- rubygems_version: 3.0.3
104
- signing_key:
123
+ rubygems_version: 3.4.6
124
+ signing_key:
105
125
  specification_version: 4
106
126
  summary: Greek alphabet manipulation gem
107
127
  test_files: []
data/.travis.yml DELETED
@@ -1,7 +0,0 @@
1
- ---
2
- sudo: false
3
- language: ruby
4
- cache: bundler
5
- rvm:
6
- - 2.6.2
7
- before_install: gem install bundler -v 2.0.1