greek_abc 0.4.4 → 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: b973dc3b8421c069276ca083dea0a79bcdbc69318117310abeb9bfc24d2c1c09
4
- data.tar.gz: 40d12e3fd955623a80b06cb1914a5c71f518d91ca6c474fe904efed4c05c50f2
3
+ metadata.gz: 4a8d90028ace5d4eba870e2928c93d3451a4f3f815ddb64fe1f4660aa6c9026d
4
+ data.tar.gz: e35ab039f0086b309fbd09c80e7c70299e3b12866f6cd9cf32c8964821e5f3db
5
5
  SHA512:
6
- metadata.gz: 04b6db4b8100025c96ecf4cffafc00ae74840a9059d842b68604af450ab1a0cc29ef90dfa3db954d24898388eae90fdc15bf943a6e3125ec8b0f43b4b1f05482
7
- data.tar.gz: 8b8b6c1b5156502e7165ca1fcb1288a75c99d3fe6bd5cbea7bae04cd64814b4b836deb2f6499701313f6dad4336548cbe3fc12a568fc1217c7fc9e716346b07c
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
@@ -2,3 +2,5 @@ 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,63 +1,83 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- greek_abc (0.4.3)
4
+ greek_abc (2.0.0)
5
5
 
6
6
  GEM
7
7
  remote: https://rubygems.org/
8
8
  specs:
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)
9
14
  ast (2.4.2)
10
15
  backport (1.2.0)
11
- benchmark (0.2.0)
16
+ benchmark (0.2.1)
17
+ concurrent-ruby (1.2.0)
18
+ csv (3.2.6)
12
19
  diff-lcs (1.5.0)
13
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)
14
25
  jaro_winkler (1.5.4)
15
- json (2.6.2)
26
+ json (2.6.3)
16
27
  kramdown (2.4.0)
17
28
  rexml
18
29
  kramdown-parser-gfm (1.1.0)
19
30
  kramdown (~> 2.0)
20
- mini_portile2 (2.8.0)
21
- nokogiri (1.13.8)
22
- mini_portile2 (~> 2.8.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)
23
38
  racc (~> 1.4)
24
39
  parallel (1.22.1)
25
- parser (3.1.2.1)
40
+ parser (3.2.1.0)
26
41
  ast (~> 2.4.1)
27
- racc (1.6.0)
42
+ racc (1.6.2)
28
43
  rainbow (3.1.1)
29
44
  rake (13.0.6)
30
- regexp_parser (2.5.0)
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)
31
50
  reverse_markdown (2.1.1)
32
51
  nokogiri
33
52
  rexml (3.2.5)
34
- rspec (3.11.0)
35
- rspec-core (~> 3.11.0)
36
- rspec-expectations (~> 3.11.0)
37
- rspec-mocks (~> 3.11.0)
38
- rspec-core (3.11.0)
39
- rspec-support (~> 3.11.0)
40
- rspec-expectations (3.11.0)
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)
41
60
  diff-lcs (>= 1.2.0, < 2.0)
42
- rspec-support (~> 3.11.0)
43
- rspec-mocks (3.11.1)
61
+ rspec-support (~> 3.12.0)
62
+ rspec-mocks (3.12.3)
44
63
  diff-lcs (>= 1.2.0, < 2.0)
45
- rspec-support (~> 3.11.0)
46
- rspec-support (3.11.0)
47
- rubocop (1.34.1)
64
+ rspec-support (~> 3.12.0)
65
+ rspec-support (3.12.0)
66
+ rubocop (1.45.1)
48
67
  json (~> 2.3)
49
68
  parallel (~> 1.10)
50
- parser (>= 3.1.2.1)
69
+ parser (>= 3.2.0.0)
51
70
  rainbow (>= 2.2.2, < 4.0)
52
71
  regexp_parser (>= 1.8, < 3.0)
53
72
  rexml (>= 3.2.5, < 4.0)
54
- rubocop-ast (>= 1.20.0, < 2.0)
73
+ rubocop-ast (>= 1.24.1, < 2.0)
55
74
  ruby-progressbar (~> 1.7)
56
- unicode-display_width (>= 1.4.0, < 3.0)
57
- rubocop-ast (1.21.0)
75
+ unicode-display_width (>= 2.4.0, < 3.0)
76
+ rubocop-ast (1.24.1)
58
77
  parser (>= 3.1.1.0)
59
78
  ruby-progressbar (1.11.0)
60
- solargraph (0.45.0)
79
+ securerandom (0.2.2)
80
+ solargraph (0.48.0)
61
81
  backport (~> 1.2)
62
82
  benchmark
63
83
  bundler (>= 1.17.2)
@@ -72,22 +92,43 @@ GEM
72
92
  thor (~> 1.0)
73
93
  tilt (~> 2.0)
74
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)
75
113
  thor (1.2.1)
76
114
  tilt (2.0.11)
77
- unicode-display_width (2.2.0)
115
+ tzinfo (2.0.6)
116
+ concurrent-ruby (~> 1.0)
117
+ unicode-display_width (2.4.2)
78
118
  webrick (1.7.0)
79
119
  yard (0.9.28)
80
120
  webrick (~> 1.7.0)
81
121
 
82
122
  PLATFORMS
83
- ruby
123
+ arm64-darwin-22
84
124
 
85
125
  DEPENDENCIES
86
- bundler (~> 2.3)
126
+ bundler
87
127
  greek_abc!
88
- rake (~> 13.0)
89
- rspec (~> 3.11)
90
- solargraph (~> 0.45.0)
128
+ rake
129
+ rspec
130
+ solargraph
131
+ steep (~> 1.3)
91
132
 
92
133
  BUNDLED WITH
93
- 2.3.19
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/Steepfile ADDED
@@ -0,0 +1,4 @@
1
+ target :lib do
2
+ check 'lib'
3
+ signature 'sig'
4
+ end
data/greek_abc.gemspec CHANGED
@@ -12,30 +12,25 @@ Gem::Specification.new do |spec|
12
12
  spec.homepage = 'https://github.com/vladyio/greek_abc'
13
13
  spec.license = 'MIT'
14
14
 
15
- # Prevent pushing this gem to RubyGems.org. To allow pushes either set the 'allowed_push_host'
16
- # to allow pushing to a single host or delete this section to allow pushing to any host.
17
- if spec.respond_to?(:metadata)
18
- 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'
19
19
 
20
- spec.metadata['homepage_uri'] = spec.homepage
21
- spec.metadata['source_code_uri'] = 'https://github.com/vladyio/greek_abc'
22
- spec.metadata['changelog_uri'] = 'https://github.com/vladyio/greek_abc/blob/master/CHANGELOG.md'
23
- else
24
- raise 'RubyGems 2.0 or newer is required to protect against ' \
25
- 'public gem pushes.'
26
- end
20
+ spec.metadata['steep_types'] = 'sig'
21
+
22
+ spec.required_ruby_version = '>= 2.7.0'
27
23
 
28
24
  # Specify which files should be added to the gem when it is released.
29
25
  # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
30
26
  spec.files = Dir.chdir(File.expand_path(__dir__)) do
31
27
  `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
32
28
  end
33
- spec.bindir = 'exe'
34
- spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
29
+ spec.bindir = 'bin'
35
30
  spec.require_paths = ['lib']
36
31
 
37
- spec.add_development_dependency 'bundler', '~> 2.3'
38
- spec.add_development_dependency 'rake', '~> 13.0'
39
- spec.add_development_dependency 'rspec', '~> 3.11'
40
- spec.add_development_dependency 'solargraph', '~> 0.45.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,60 +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.to_sym
21
- value = lookup.values.first
22
-
23
- raise LetterLookupError, "Letter does not have parameter `#{parameter}`" unless letter_parameter?(parameter)
24
-
25
- result = @letters.find do |letter|
26
- case parameter
27
- when :name
28
- letter if letter.send(parameter).downcase == value.downcase
29
- else
30
- letter if letter.send(parameter) == value
31
- end
32
- end
33
-
34
- raise LetterNotFoundError, "Letter with `#{parameter}: #{value}` not found" unless result
35
-
36
- 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)
37
35
  end
38
36
 
37
+ # Hash representation of an alphabet
38
+ # @return [Hash{String => String, Integer}]
39
39
  def to_h
40
- @letters.each_with_object({}) do |letter, hash|
40
+ letters.each_with_object({}) do |letter, hash|
41
41
  hash[letter.name.to_s] = {
42
42
  position: letter.position,
43
43
  lower: letter.lower,
44
+ lower_alt: letter.lower_alt,
44
45
  upper: letter.upper
45
46
  }
46
47
  end
47
48
  end
48
49
 
50
+ # String representation of an alphabet
51
+ # @return [String]
49
52
  def to_s
50
- @letters
51
- end
52
-
53
- private
54
-
55
- def letter_parameter?(parameter)
56
- parameters = %i[name position lower upper]
57
- parameters.include?(parameter)
53
+ letters
58
54
  end
59
55
  end
60
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.4'.freeze
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,71 +1,71 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: greek_abc
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.4
4
+ version: 2.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Vladislav Andreev
8
8
  autorequire:
9
- bindir: exe
9
+ bindir: bin
10
10
  cert_chain: []
11
- date: 2022-08-10 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.3'
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.3'
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: '13.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: '13.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.11'
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.11'
54
+ version: '0'
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: solargraph
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
- - - "~>"
59
+ - - ">="
60
60
  - !ruby/object:Gem::Version
61
- version: 0.45.0
61
+ version: '0'
62
62
  type: :development
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
- - - "~>"
66
+ - - ">="
67
67
  - !ruby/object:Gem::Version
68
- version: 0.45.0
68
+ version: '0'
69
69
  description:
70
70
  email:
71
71
  - andreev@vlad.social
@@ -76,20 +76,26 @@ files:
76
76
  - ".gitignore"
77
77
  - ".logo.png"
78
78
  - ".rspec"
79
+ - ".rubocop.yml"
80
+ - ".yardopts"
79
81
  - CHANGELOG.md
80
82
  - Gemfile
81
83
  - Gemfile.lock
82
84
  - LICENSE.txt
83
85
  - README.md
84
86
  - Rakefile
87
+ - Steepfile
85
88
  - bin/console
86
89
  - bin/setup
87
90
  - greek_abc.gemspec
88
91
  - lib/greek_abc.rb
89
92
  - lib/greek_abc/alphabet.rb
90
93
  - lib/greek_abc/constants.rb
94
+ - lib/greek_abc/errors.rb
91
95
  - lib/greek_abc/letter.rb
96
+ - lib/greek_abc/letter_lookup.rb
92
97
  - lib/greek_abc/version.rb
98
+ - sig/greek_abc.rbs
93
99
  homepage: https://github.com/vladyio/greek_abc
94
100
  licenses:
95
101
  - MIT
@@ -98,6 +104,7 @@ metadata:
98
104
  homepage_uri: https://github.com/vladyio/greek_abc
99
105
  source_code_uri: https://github.com/vladyio/greek_abc
100
106
  changelog_uri: https://github.com/vladyio/greek_abc/blob/master/CHANGELOG.md
107
+ steep_types: sig
101
108
  post_install_message:
102
109
  rdoc_options: []
103
110
  require_paths:
@@ -106,14 +113,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
106
113
  requirements:
107
114
  - - ">="
108
115
  - !ruby/object:Gem::Version
109
- version: '0'
116
+ version: 2.7.0
110
117
  required_rubygems_version: !ruby/object:Gem::Requirement
111
118
  requirements:
112
119
  - - ">="
113
120
  - !ruby/object:Gem::Version
114
121
  version: '0'
115
122
  requirements: []
116
- rubygems_version: 3.3.7
123
+ rubygems_version: 3.4.6
117
124
  signing_key:
118
125
  specification_version: 4
119
126
  summary: Greek alphabet manipulation gem