word_generator 1.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.
data/lib/client.rb ADDED
@@ -0,0 +1,17 @@
1
+ require "bundler/setup"
2
+ require "word_generator"
3
+
4
+ while true do
5
+ puts "Enter Letters to generate words:"
6
+
7
+ letter_list = gets.chomp
8
+ generator = WordGenerator::Generator.new(letter_list)
9
+
10
+ word_list = (3..letter_list.size).each_with_object({}) do |word_length, result|
11
+ result[word_length] = generator.generate(word_length)
12
+ end
13
+
14
+ word_list.each do |key, val|
15
+ puts "#{key} letters ---> #{val.join(", ")}"
16
+ end
17
+ end
@@ -0,0 +1,24 @@
1
+ require "word_generator/version"
2
+ require "word_generator/configuration"
3
+ require "word_generator/word"
4
+ require "word_generator/word_list"
5
+ require "word_generator/generator"
6
+
7
+ module WordGenerator
8
+ class << self
9
+ attr_accessor :configuration
10
+ end
11
+
12
+ def self.configuration
13
+ @configuration ||= Configuration.new
14
+ end
15
+
16
+ def self.reset
17
+ @configuration = Configuration.new
18
+ end
19
+
20
+ def self.configure
21
+ yield(configuration)
22
+ end
23
+ end
24
+
@@ -0,0 +1,13 @@
1
+ module WordGenerator
2
+ class Configuration
3
+ MAX_WORD_LENGTH = 9
4
+ DATA_SOURCE = :file
5
+
6
+ attr_accessor :max_word_length, :data_source
7
+
8
+ def initialize
9
+ @max_word_length = MAX_WORD_LENGTH
10
+ @data_source = DATA_SOURCE
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,38 @@
1
+ module WordGenerator
2
+ class Generator
3
+ class WordLengthTooLongError < StandardError; end
4
+
5
+ attr_reader :letters
6
+
7
+ def initialize(letters)
8
+ @letters = parse_letters(letters)
9
+ end
10
+
11
+ def generate(word_length)
12
+ max_word_length = WordGenerator.configuration.max_word_length
13
+ if word_length > max_word_length
14
+ raise WordLengthTooLongError, "Word length cannot be longer than #{max_word_length}"
15
+ end
16
+
17
+ possible_words(word_length).select { |word| WordList.contains?(word) }
18
+ end
19
+
20
+ private
21
+
22
+ def parse_letters(letters)
23
+ letters_string =
24
+ if letters.is_a?(String)
25
+ letters
26
+ elsif letters.is_a?(Array)
27
+ letters.join
28
+ else
29
+ raise ArgumentError.new("String or Array of letters should be provided")
30
+ end
31
+ letters_string.gsub(/[^a-z]/i, "").split("")
32
+ end
33
+
34
+ def possible_words(word_length)
35
+ @letters.permutation(word_length).to_a.map(&:join).uniq.sort
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,6 @@
1
+ namespace :words do
2
+ desc "Creates a table containing English words"
3
+ task :create do
4
+ raise NotImplementedError
5
+ end
6
+ end
@@ -0,0 +1,3 @@
1
+ module WordGenerator
2
+ VERSION = "1.0.0"
3
+ end
@@ -0,0 +1,10 @@
1
+ module WordGenerator
2
+ class Word
3
+ attr_reader :text
4
+
5
+ def initialize(text)
6
+ @text = text
7
+ end
8
+ end
9
+ end
10
+
@@ -0,0 +1,27 @@
1
+ module WordGenerator
2
+ class WordList
3
+ VALID_WORD_REGEX = /^\b[a-zA-Z0-9_]+\b$/
4
+ FILE_PATH = "data/words.txt".freeze
5
+
6
+ def self.contains?(word)
7
+ data_source = WordGenerator.configuration.data_source
8
+ !list(data_source: data_source)[word].nil?
9
+ end
10
+
11
+ def self.list(data_source: :file)
12
+ return [] unless data_source == :file
13
+ @list_of_words ||= read_words_from_file
14
+ end
15
+
16
+ private
17
+
18
+ def self.read_words_from_file
19
+ path = File.expand_path("../#{FILE_PATH}", File.dirname(__dir__))
20
+
21
+ File.foreach(path).with_object({}) do |line, result|
22
+ word = line.chomp!
23
+ result[word] = 1 if VALID_WORD_REGEX.match?(word)
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,38 @@
1
+
2
+ lib = File.expand_path("../lib", __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require "word_generator/version"
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "word_generator"
8
+ spec.version = WordGenerator::VERSION
9
+ spec.authors = ["bkdir"]
10
+ spec.email = ["direkburak1@gmail.com"]
11
+
12
+ spec.summary = %q{Word Generator}
13
+ spec.description = %q{Given letters, generates possible english words.}
14
+ spec.homepage = "https://github.com/bkdir/word_generator"
15
+ spec.license = "MIT"
16
+
17
+ # Prevent pushing this gem to RubyGems.org. To allow pushes either set the 'allowed_push_host'
18
+ # to allow pushing to a single host or delete this section to allow pushing to any host.
19
+ if spec.respond_to?(:metadata)
20
+ spec.metadata["allowed_push_host"] = "https://rubygems.org"
21
+ else
22
+ raise "RubyGems 2.0 or newer is required to protect against " \
23
+ "public gem pushes."
24
+ end
25
+
26
+ # Specify which files should be added to the gem when it is released.
27
+ # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
28
+ spec.files = Dir.chdir(File.expand_path('..', __FILE__)) do
29
+ `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
30
+ end
31
+ spec.bindir = "exe"
32
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
33
+ spec.require_paths = ["lib"]
34
+
35
+ spec.add_development_dependency "bundler", "~> 1.16"
36
+ spec.add_development_dependency "rake", "~> 10.0"
37
+ spec.add_development_dependency "rspec", "~> 3.8.0"
38
+ end
metadata ADDED
@@ -0,0 +1,107 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: word_generator
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - bkdir
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2018-09-09 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.16'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.16'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '10.0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '10.0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rspec
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: 3.8.0
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: 3.8.0
55
+ description: Given letters, generates possible english words.
56
+ email:
57
+ - direkburak1@gmail.com
58
+ executables: []
59
+ extensions: []
60
+ extra_rdoc_files: []
61
+ files:
62
+ - ".gitignore"
63
+ - ".rspec"
64
+ - ".travis.yml"
65
+ - Gemfile
66
+ - Gemfile.lock
67
+ - LICENSE.txt
68
+ - README.md
69
+ - Rakefile
70
+ - bin/console
71
+ - bin/setup
72
+ - data/words.txt
73
+ - lib/client.rb
74
+ - lib/word_generator.rb
75
+ - lib/word_generator/configuration.rb
76
+ - lib/word_generator/generator.rb
77
+ - lib/word_generator/tasks/words.rake
78
+ - lib/word_generator/version.rb
79
+ - lib/word_generator/word.rb
80
+ - lib/word_generator/word_list.rb
81
+ - word_generator.gemspec
82
+ homepage: https://github.com/bkdir/word_generator
83
+ licenses:
84
+ - MIT
85
+ metadata:
86
+ allowed_push_host: https://rubygems.org
87
+ post_install_message:
88
+ rdoc_options: []
89
+ require_paths:
90
+ - lib
91
+ required_ruby_version: !ruby/object:Gem::Requirement
92
+ requirements:
93
+ - - ">="
94
+ - !ruby/object:Gem::Version
95
+ version: '0'
96
+ required_rubygems_version: !ruby/object:Gem::Requirement
97
+ requirements:
98
+ - - ">="
99
+ - !ruby/object:Gem::Version
100
+ version: '0'
101
+ requirements: []
102
+ rubyforge_project:
103
+ rubygems_version: 2.7.3
104
+ signing_key:
105
+ specification_version: 4
106
+ summary: Word Generator
107
+ test_files: []