greek_abc 0.4.4 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 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