greek_abc 0.4.3 → 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: 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