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.
- checksums.yaml +7 -0
- data/.gitignore +11 -0
- data/.rspec +3 -0
- data/.travis.yml +5 -0
- data/Gemfile +6 -0
- data/Gemfile.lock +35 -0
- data/LICENSE.txt +21 -0
- data/README.md +3 -0
- data/Rakefile +9 -0
- data/bin/console +14 -0
- data/bin/setup +8 -0
- data/data/words.txt +274926 -0
- data/lib/client.rb +17 -0
- data/lib/word_generator.rb +24 -0
- data/lib/word_generator/configuration.rb +13 -0
- data/lib/word_generator/generator.rb +38 -0
- data/lib/word_generator/tasks/words.rake +6 -0
- data/lib/word_generator/version.rb +3 -0
- data/lib/word_generator/word.rb +10 -0
- data/lib/word_generator/word_list.rb +27 -0
- data/word_generator.gemspec +38 -0
- metadata +107 -0
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,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,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: []
|