random_phrase 0.0.2 → 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.rvmrc +51 -0
- data/lib/random_phrase.rb +31 -6
- data/lib/random_phrase/config/words +21 -1
- data/lib/random_phrase/dictionary.rb +34 -10
- data/lib/random_phrase/version.rb +1 -1
- data/random_phrase.gemspec +5 -3
- data/spec/lib/dictionary_spec.rb +46 -8
- data/spec/lib/random_phrase_spec.rb +59 -1
- metadata +42 -13
- data/lib/random_phrase/core_ext/array.rb +0 -5
- data/spec/lib/core_ext/array_spec.rb +0 -15
data/.rvmrc
ADDED
@@ -0,0 +1,51 @@
|
|
1
|
+
#!/usr/bin/env bash
|
2
|
+
|
3
|
+
# This is an RVM Project .rvmrc file, used to automatically load the ruby
|
4
|
+
# development environment upon cd'ing into the directory.
|
5
|
+
# For more info, see: http://beginrescueend.com/
|
6
|
+
|
7
|
+
ruby_gemset_name="ruby-1.9.2-p180@random_phrase"
|
8
|
+
ruby_name="ruby-1.9.2-p180"
|
9
|
+
|
10
|
+
echo "RVM: Using ${ruby_gemset_name} for this project."
|
11
|
+
# Ensure we have the right ruby installed to use this project.
|
12
|
+
if rvm list strings | grep -q "${ruby_name}" ; then
|
13
|
+
|
14
|
+
# Load or create the specified environment
|
15
|
+
# We attempt to load the desired environment directly from the environment
|
16
|
+
# file. This is very fast and efficient compared to running through the entire
|
17
|
+
# CLI and selector. If you want feedback on which environment was used then
|
18
|
+
# insert the word 'use' after --create as this triggers verbose mode.
|
19
|
+
if [[ -d "${rvm_path:-$HOME/.rvm}/environments" \
|
20
|
+
&& -s "${rvm_path:-$HOME/.rvm}/environments/${ruby_gemset_name}" ]] ; then
|
21
|
+
\. "${rvm_path:-$HOME/.rvm}/environments/${ruby_gemset_name}"
|
22
|
+
else
|
23
|
+
# If the environment file has not yet been created, use the RVM CLI to select.
|
24
|
+
if ! rvm --create "${ruby_gemset_name}"
|
25
|
+
then
|
26
|
+
echo "RVM: Failed to create environment '$environment_id'."
|
27
|
+
fi
|
28
|
+
|
29
|
+
fi
|
30
|
+
|
31
|
+
# Ensure that Bundler is installed, install it if it is not.
|
32
|
+
bundler_installed=`gem list bundler | grep bundler`
|
33
|
+
if [ -z "$bundler_installed" ]; then
|
34
|
+
gem install bundler
|
35
|
+
fi
|
36
|
+
|
37
|
+
# Bundle while reducing excess noise.
|
38
|
+
# We generate bin stubs so that we don't need to use
|
39
|
+
# 'bundle exec' before gem executables. You should add
|
40
|
+
# './bin' to your path so that you can run 'rake', 'cucumber'
|
41
|
+
# etc from the Gemfile with ease.
|
42
|
+
# See http://yehudakatz.com/2011/05/30/gem-versioning-and-bundler-doing-it-right/
|
43
|
+
echo "RVM: Ensuring your bundle is up to date."
|
44
|
+
bundle install | grep -v 'Using' | grep -v 'complete' | sed '/^$/d'
|
45
|
+
|
46
|
+
else
|
47
|
+
|
48
|
+
# Notify the user to install the desired interpreter before proceeding.
|
49
|
+
echo "RVM: ${ruby_name} was not found, please run 'rvm install ${ruby_name}' and then cd back into the project directory."
|
50
|
+
|
51
|
+
fi
|
data/lib/random_phrase.rb
CHANGED
@@ -1,15 +1,40 @@
|
|
1
1
|
require "random_phrase/version"
|
2
2
|
require "random_phrase/dictionary"
|
3
|
-
require "random_phrase/core_ext/array"
|
4
3
|
|
5
4
|
module RandomPhrase
|
6
5
|
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
6
|
+
class << self
|
7
|
+
def dictionary=(dictionary)
|
8
|
+
@@dictionary = dictionary
|
9
|
+
end
|
10
|
+
|
11
|
+
def dictionary
|
12
|
+
@@dictionary ||= RandomPhrase::Dictionary.new
|
13
|
+
end
|
14
|
+
|
15
|
+
def phrase(*args)
|
16
|
+
options = args.extract_options!
|
17
|
+
word_patterns = []
|
18
|
+
|
19
|
+
unless args.empty?
|
20
|
+
if args.first.respond_to?(:times)
|
21
|
+
word_count = args.first
|
22
|
+
elsif args.first.kind_of?(Regexp)
|
23
|
+
word_patterns = args.first.source.split(/(?:\s|\\\\s)/)
|
24
|
+
word_count = word_patterns.count
|
25
|
+
elsif args.first.respond_to?(:to_s)
|
26
|
+
word_count = args.first.to_s.split(/\s/).count
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
word_count ||= 1
|
31
|
+
phrase = []
|
32
|
+
word_count.times do |i|
|
33
|
+
options.merge!(:pattern => Regexp.compile(word_patterns[i])) unless word_patterns.empty?
|
34
|
+
phrase << dictionary.words(options).sample
|
35
|
+
end
|
36
|
+
phrase.join(" ")
|
11
37
|
end
|
12
|
-
phrase.join(" ")
|
13
38
|
end
|
14
39
|
|
15
40
|
end
|
@@ -1,14 +1,38 @@
|
|
1
|
-
|
2
|
-
def self.load
|
3
|
-
if File.exists?("config/words")
|
4
|
-
File.read("config/words").split
|
5
|
-
else
|
6
|
-
"flowing hill".split
|
7
|
-
end
|
8
|
-
end
|
1
|
+
require "active_support/core_ext/array/extract_options"
|
9
2
|
|
10
|
-
|
11
|
-
|
3
|
+
class RandomPhrase::Dictionary
|
4
|
+
attr_accessor :loader
|
5
|
+
|
6
|
+
module DefaultLoader
|
7
|
+
def self.load
|
8
|
+
if File.exists?("config/words")
|
9
|
+
File.read("config/words").split
|
10
|
+
else
|
11
|
+
"flowing river down brightly sparkling in the sun may I dip my toes".split
|
12
|
+
end
|
13
|
+
end
|
12
14
|
end
|
13
15
|
|
16
|
+
def initialize(loader = nil)
|
17
|
+
loader = Proc.new {loader} unless loader.nil? || loader.kind_of?(Proc)
|
18
|
+
self.loader = loader ||= Proc.new { DefaultLoader.load }
|
19
|
+
end
|
20
|
+
|
21
|
+
|
22
|
+
def words(*args)
|
23
|
+
options = args.extract_options!
|
24
|
+
|
25
|
+
@dictionary ||= loader.call().group_by {|word| word.length}
|
26
|
+
result = @dictionary.values.flatten
|
27
|
+
if options.key?(:length)
|
28
|
+
result = @dictionary.fetch(options[:length], [])
|
29
|
+
end
|
30
|
+
|
31
|
+
if options.key?(:pattern)
|
32
|
+
result = result.select { |w| w =~ Regexp.try_convert(options[:pattern]) }
|
33
|
+
end
|
34
|
+
|
35
|
+
result.flatten
|
36
|
+
end
|
37
|
+
|
14
38
|
end
|
data/random_phrase.gemspec
CHANGED
@@ -9,7 +9,7 @@ Gem::Specification.new do |s|
|
|
9
9
|
s.email = ["yosem.sweet@suite101.com"]
|
10
10
|
s.homepage = "https://github.com/yosemsweet/random_phrase"
|
11
11
|
s.summary = %q{Generate a simple random phrase}
|
12
|
-
s.description = %q{This gem provides random phrase
|
12
|
+
s.description = %q{This gem provides the ability to generate a random phrase from a customizable word list via word length and regexp matching.}
|
13
13
|
|
14
14
|
s.rubyforge_project = "random_phrase"
|
15
15
|
|
@@ -19,6 +19,8 @@ Gem::Specification.new do |s|
|
|
19
19
|
s.require_paths = ["lib"]
|
20
20
|
|
21
21
|
# specify any dependencies here; for example:
|
22
|
-
|
23
|
-
|
22
|
+
s.add_dependency "activesupport", "~>3"
|
23
|
+
s.add_development_dependency "require_all"
|
24
|
+
s.add_development_dependency "ruby-debug19"
|
25
|
+
s.add_development_dependency "rspec", "~>2"
|
24
26
|
end
|
data/spec/lib/dictionary_spec.rb
CHANGED
@@ -1,20 +1,58 @@
|
|
1
1
|
require "spec_helper"
|
2
2
|
|
3
3
|
describe RandomPhrase::Dictionary do
|
4
|
-
context "
|
5
|
-
|
6
|
-
|
7
|
-
|
4
|
+
context "class methods" do
|
5
|
+
|
6
|
+
context "::new" do
|
7
|
+
it "returns a dictionary object" do
|
8
|
+
RandomPhrase::Dictionary.new.should be_kind_of(RandomPhrase::Dictionary)
|
9
|
+
end
|
10
|
+
|
11
|
+
it "can be passed a block that defines the implementation of #load" do
|
12
|
+
load_static = Proc.new { ["a","b","c","d"]}
|
13
|
+
RandomPhrase::Dictionary.new(load_static).words.should == ["a","b","c","d"]
|
8
14
|
end
|
9
15
|
end
|
10
|
-
|
11
|
-
|
16
|
+
end
|
17
|
+
|
18
|
+
context "object methods" do
|
19
|
+
context "#words" do
|
12
20
|
it "should respond to words" do
|
13
|
-
RandomPhrase::Dictionary.should respond_to(:words)
|
21
|
+
RandomPhrase::Dictionary.new.should respond_to(:words)
|
14
22
|
end
|
15
23
|
|
16
24
|
it "should return an array" do
|
17
|
-
RandomPhrase::Dictionary.words.should be_kind_of(Array)
|
25
|
+
RandomPhrase::Dictionary.new.words.should be_kind_of(Array)
|
26
|
+
end
|
27
|
+
|
28
|
+
it "should accept optional arguments" do
|
29
|
+
RandomPhrase::Dictionary.new.words.should be_kind_of(Array)
|
30
|
+
RandomPhrase::Dictionary.new.words(:length => 3).should be_kind_of(Array)
|
31
|
+
RandomPhrase::Dictionary.new.words(:length => 3, :pattern => /abc/).should be_kind_of(Array)
|
32
|
+
end
|
33
|
+
|
34
|
+
context "passing in length" do
|
35
|
+
it "should return only words with length characters" do
|
36
|
+
dictionary = RandomPhrase::Dictionary.new(Proc.new {["a", "a"*2, "a"*3, "a"*4, "a"]})
|
37
|
+
dictionary.words(:length => 1).each { |w| w.length.should == 1}
|
38
|
+
dictionary.words(:length => 2).each { |w| w.length.should == 2}
|
39
|
+
dictionary.words(:length => 3).each { |w| w.length.should == 3}
|
40
|
+
dictionary.words(:length => 4).each { |w| w.length.should == 4}
|
41
|
+
|
42
|
+
dictionary.words(:length => 1).length.should == 2
|
43
|
+
dictionary.words(:length => 2).length.should == 1
|
44
|
+
dictionary.words(:length => 3).length.should == 1
|
45
|
+
dictionary.words(:length => 4).length.should == 1
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
context "passing in pattern" do
|
50
|
+
it "should return only words matching the pattern" do
|
51
|
+
dictionary = RandomPhrase::Dictionary.new(Proc.new {["a", "a"*2, "a"*3, "a"*4, "b"]})
|
52
|
+
dictionary.words(:pattern => /b/).each { |w| w.should =~ /b/}
|
53
|
+
dictionary.words(:pattern => /a/).each { |w| w.should =~ /a/}
|
54
|
+
dictionary.words(:pattern => /a{3}/).each { |w| w.should =~ /a{3}/}
|
55
|
+
end
|
18
56
|
end
|
19
57
|
end
|
20
58
|
end
|
@@ -1,7 +1,25 @@
|
|
1
1
|
require "spec_helper"
|
2
2
|
|
3
3
|
describe RandomPhrase do
|
4
|
-
|
4
|
+
|
5
|
+
context "::dictionary" do
|
6
|
+
it "should have a dictionary accessor attribute" do
|
7
|
+
RandomPhrase.should respond_to(:dictionary=)
|
8
|
+
RandomPhrase.should respond_to(:dictionary)
|
9
|
+
end
|
10
|
+
|
11
|
+
it "should only return words from its dictionary" do
|
12
|
+
dictionary = RandomPhrase::Dictionary.new(Proc.new {["a", "b", "c"]})
|
13
|
+
RandomPhrase.dictionary= dictionary
|
14
|
+
RandomPhrase.phrase().split.each { |word| dictionary.words.should include(word) }
|
15
|
+
end
|
16
|
+
|
17
|
+
after(:all) do
|
18
|
+
RandomPhrase.dictionary= nil
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
context "::phrase" do
|
5
23
|
it "should respond to phrase an optional word count" do
|
6
24
|
RandomPhrase.should respond_to(:phrase)
|
7
25
|
RandomPhrase.should respond_to(:phrase).with(1)
|
@@ -24,5 +42,45 @@ describe RandomPhrase do
|
|
24
42
|
it "should return different phrases on successive calls" do
|
25
43
|
RandomPhrase.phrase.should_not == RandomPhrase.phrase
|
26
44
|
end
|
45
|
+
|
46
|
+
context "with options" do
|
47
|
+
context ":length =>" do
|
48
|
+
it "should only return words of the specified length" do
|
49
|
+
RandomPhrase.dictionary= RandomPhrase::Dictionary.new(Proc.new {["aaa", "bbbb", "cc", "ddd", "ee"]})
|
50
|
+
RandomPhrase.phrase(2, :length => 3).split.each {|word| word.length.should == 3}
|
51
|
+
end
|
52
|
+
after(:all) do
|
53
|
+
RandomPhrase.dictionary= nil
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
context ":pattern =>" do
|
58
|
+
before(:all) do
|
59
|
+
RandomPhrase.dictionary= nil
|
60
|
+
end
|
61
|
+
|
62
|
+
context "single word patterns" do
|
63
|
+
it "should return a phrase matching the pattern" do
|
64
|
+
RandomPhrase.dictionary= RandomPhrase::Dictionary.new(Proc.new {["aed", "bed", "cat", "a", "foeder"]})
|
65
|
+
pattern = /[a-zA-Z]+ed/
|
66
|
+
phrase = RandomPhrase.phrase(pattern)
|
67
|
+
pattern.match(phrase).should_not be_nil
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
context "multi-word patterns" do
|
72
|
+
it "should return a phrase matching the pattern" do
|
73
|
+
RandomPhrase.dictionary= RandomPhrase::Dictionary.new(Proc.new {["aed", "bed", "cat", "a", "foeder"]})
|
74
|
+
pattern = /\w+ [a-zA-Z]+ed/
|
75
|
+
phrase = RandomPhrase.phrase(pattern)
|
76
|
+
pattern.match(phrase).should_not be_nil
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
after(:all) do
|
81
|
+
RandomPhrase.dictionary= nil
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
27
85
|
end
|
28
86
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: random_phrase
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 0.1.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,12 +9,22 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2011-
|
13
|
-
default_executable:
|
12
|
+
date: 2011-10-28 00:00:00.000000000Z
|
14
13
|
dependencies:
|
15
14
|
- !ruby/object:Gem::Dependency
|
16
|
-
name:
|
17
|
-
requirement: &
|
15
|
+
name: activesupport
|
16
|
+
requirement: &2161656640 !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ~>
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '3'
|
22
|
+
type: :runtime
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: *2161656640
|
25
|
+
- !ruby/object:Gem::Dependency
|
26
|
+
name: require_all
|
27
|
+
requirement: &2161656220 !ruby/object:Gem::Requirement
|
18
28
|
none: false
|
19
29
|
requirements:
|
20
30
|
- - ! '>='
|
@@ -22,9 +32,31 @@ dependencies:
|
|
22
32
|
version: '0'
|
23
33
|
type: :development
|
24
34
|
prerelease: false
|
25
|
-
version_requirements: *
|
26
|
-
|
27
|
-
|
35
|
+
version_requirements: *2161656220
|
36
|
+
- !ruby/object:Gem::Dependency
|
37
|
+
name: ruby-debug19
|
38
|
+
requirement: &2161655760 !ruby/object:Gem::Requirement
|
39
|
+
none: false
|
40
|
+
requirements:
|
41
|
+
- - ! '>='
|
42
|
+
- !ruby/object:Gem::Version
|
43
|
+
version: '0'
|
44
|
+
type: :development
|
45
|
+
prerelease: false
|
46
|
+
version_requirements: *2161655760
|
47
|
+
- !ruby/object:Gem::Dependency
|
48
|
+
name: rspec
|
49
|
+
requirement: &2161655260 !ruby/object:Gem::Requirement
|
50
|
+
none: false
|
51
|
+
requirements:
|
52
|
+
- - ~>
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '2'
|
55
|
+
type: :development
|
56
|
+
prerelease: false
|
57
|
+
version_requirements: *2161655260
|
58
|
+
description: This gem provides the ability to generate a random phrase from a customizable
|
59
|
+
word list via word length and regexp matching.
|
28
60
|
email:
|
29
61
|
- yosem.sweet@suite101.com
|
30
62
|
executables: []
|
@@ -32,19 +64,17 @@ extensions: []
|
|
32
64
|
extra_rdoc_files: []
|
33
65
|
files:
|
34
66
|
- .gitignore
|
67
|
+
- .rvmrc
|
35
68
|
- Gemfile
|
36
69
|
- Rakefile
|
37
70
|
- lib/random_phrase.rb
|
38
71
|
- lib/random_phrase/config/words
|
39
|
-
- lib/random_phrase/core_ext/array.rb
|
40
72
|
- lib/random_phrase/dictionary.rb
|
41
73
|
- lib/random_phrase/version.rb
|
42
74
|
- random_phrase.gemspec
|
43
|
-
- spec/lib/core_ext/array_spec.rb
|
44
75
|
- spec/lib/dictionary_spec.rb
|
45
76
|
- spec/lib/random_phrase_spec.rb
|
46
77
|
- spec/spec_helper.rb
|
47
|
-
has_rdoc: true
|
48
78
|
homepage: https://github.com/yosemsweet/random_phrase
|
49
79
|
licenses: []
|
50
80
|
post_install_message:
|
@@ -65,12 +95,11 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
65
95
|
version: '0'
|
66
96
|
requirements: []
|
67
97
|
rubyforge_project: random_phrase
|
68
|
-
rubygems_version: 1.
|
98
|
+
rubygems_version: 1.8.10
|
69
99
|
signing_key:
|
70
100
|
specification_version: 3
|
71
101
|
summary: Generate a simple random phrase
|
72
102
|
test_files:
|
73
|
-
- spec/lib/core_ext/array_spec.rb
|
74
103
|
- spec/lib/dictionary_spec.rb
|
75
104
|
- spec/lib/random_phrase_spec.rb
|
76
105
|
- spec/spec_helper.rb
|
@@ -1,15 +0,0 @@
|
|
1
|
-
require "spec_helper"
|
2
|
-
|
3
|
-
describe Array do
|
4
|
-
context "#pick" do
|
5
|
-
it "should respond to pick" do
|
6
|
-
[].should respond_to(:pick)
|
7
|
-
end
|
8
|
-
|
9
|
-
it "should return a random element" do
|
10
|
-
a = [1,2,3,4,5,6,7,8,9,10]
|
11
|
-
a.pick.should_not == a.pick
|
12
|
-
a.find_index(a.pick).should_not be_nil
|
13
|
-
end
|
14
|
-
end
|
15
|
-
end
|