oulipo 0.2.0 → 0.3.1

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/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- oulipo (0.2.0)
4
+ oulipo (0.3.0)
5
5
 
6
6
  GEM
7
7
  remote: http://rubygems.org/
data/README.md CHANGED
@@ -8,7 +8,7 @@ It's still young, and very much liable to change.
8
8
 
9
9
  The real [Oulipo](http://en.wikipedia.org/wiki/Oulipo) is a gathering of writers and mathmeticians who seek to create works using constrained writing techniques.
10
10
 
11
- Install with `gem install oulipo`.
11
+ Install with `gem install oulipo` and `require 'oulipo'` as needed.
12
12
 
13
13
  ## Lipograms and Pangrams
14
14
 
@@ -40,37 +40,6 @@ sentence = 'Big fjords vex quick waltz nymph.'
40
40
  Oulipo.pangram?(sentence) # => true
41
41
  ```
42
42
 
43
- ## N+7
44
-
45
- In N+7 (sometimes known as S+7), each noun in a text is replaced with the noun seven entries after it in a dictionary.
46
-
47
- ```ruby
48
- dictionary = Oulipo::WordList.load('big_list_of_nouns.txt')
49
-
50
- play = <<-SHAKESPEARE
51
-
52
- What, jealous Oberon! Fairies, skip hence:
53
- I have forsworn his bed and company.
54
-
55
- SHAKESPEARE
56
-
57
- Oulipo.n_plus(7, play, dictionary) # => "What, jealous Oberon! Fallacies, skulk hence:
58
- # I have forsworn his bedroom and compensation."
59
-
60
- ```
61
-
62
- Oulipo includes a handy `WordList` class for reading one-word-per-line dictionary files, but a dictionary can be any object that responds to `index(word)`, `length`, and `[index]`.
63
-
64
- ```ruby
65
- dictionary = %w{ iron gild mine gold ore paint cast lily }
66
-
67
- king_john = 'To gild refined gold, to paint the lily'
68
-
69
- Oulipo.n_plus(1, king_john, dictionary) # => 'To mine refined ore, to cast the iron'
70
- ```
71
-
72
- See also: Substitution.
73
-
74
43
  ## Univocalims
75
44
 
76
45
  A univocalism is a poem written using only one type of vowel.
@@ -132,8 +101,56 @@ Normal alliteration's a little harsh, so you can give it a threshold, too.
132
101
  phrase = 'quick queens quibble over quails'
133
102
 
134
103
  Oulipo.alliterativity(phrase) # => 0.8 (4/5 words start with 'q')
135
- Oulipo.alleration?(phrase, :threshold => 0.7) # => true
136
- Oulipo.alleration?(phrase, :threshold => 0.9) # => false
104
+ Oulipo.alliteration?(phrase, :threshold => 0.7) # => true
105
+ Oulipo.alliteration?(phrase, :threshold => 0.9) # => false
106
+ ```
107
+
108
+ ## N+7
109
+
110
+ In N+7 (sometimes known as S+7), each noun in a text is replaced with the noun seven entries after it in a dictionary.
111
+
112
+ ```ruby
113
+ dictionary = Oulipo::WordList.load('big_list_of_nouns.txt')
114
+
115
+ play = <<-SHAKESPEARE
116
+
117
+ What, jealous Oberon! Fairies, skip hence:
118
+ I have forsworn his bed and company.
119
+
120
+ SHAKESPEARE
121
+
122
+ Oulipo.n_plus(7, play, dictionary) # => "What, jealous Oberon! Fallacies, skulk hence:
123
+ # I have forsworn his bedroom and compensation."
124
+
125
+ ```
126
+
127
+ Oulipo includes a handy `WordList` class for reading one-word-per-line dictionary files, but a dictionary can be any object that responds to `index(word)`, `length`, and `[index]`.
128
+
129
+ ```ruby
130
+ dictionary = %w{ iron gild mine gold ore paint cast lily }
131
+
132
+ king_john = 'To gild refined gold, to paint the lily'
133
+
134
+ Oulipo.n_plus(1, king_john, dictionary) # => 'To mine refined ore, to cast the iron'
135
+ ```
136
+
137
+ ## Extending String
138
+
139
+ You can optionally extend `String`, if you need to.
140
+
141
+ ```ruby
142
+ require 'oulipo/string_em_up'
143
+
144
+ "Sator arepo tenet opera rotas".palindrome? # => true
145
+ "Waltz, bad nymph, for quick jigs vex!".pangram? # => true
146
+ 'To gild refined gold'.n_plus(7, nouns) # ... as above
147
+ ```
148
+
149
+ If you'd like to use the neat short-hand, but don't want to touch `String`, you might want to use an `EnhancedString`.
150
+
151
+ ```ruby
152
+ palindrome = Oulipo::EnhancedString.new("Sator arepo tenet opera rotas")
153
+ palindrome.lipogram? # => true
137
154
  ```
138
155
 
139
156
  ## Analysis
@@ -152,6 +169,8 @@ analysis = Oulipo::Analysis.new(line, word_sets)
152
169
 
153
170
  analysis.identified(:nouns) # => ['rose', 'name']
154
171
  analysis.identified(:adjectives) # => ['sweet']
172
+
173
+ analysis.deconstruction # => ["A ", ["rose", :nouns], " by any other ", ["name", :nouns], " would smell as ", ["sweet", :adjectives]]
155
174
  ```
156
175
 
157
176
  ## Substitution
@@ -167,4 +186,4 @@ substitutor.replace(:nouns).increment(1) # => "A bear by any other rose would sm
167
186
 
168
187
  ---
169
188
 
170
- - Pete Nicholls ([@Aupajo](http://twitter.com/Aupajo))
189
+ Pete Nicholls ([@Aupajo](http://twitter.com/Aupajo))
@@ -0,0 +1,5 @@
1
+ module Oulipo
2
+ class EnhancedString < String
3
+ include Oulipo::StringExtensions
4
+ end
5
+ end
@@ -0,0 +1,3 @@
1
+ class String
2
+ include Oulipo::StringExtensions
3
+ end
@@ -0,0 +1,86 @@
1
+ module Oulipo
2
+ module StringExtensions
3
+ ALPHABET = 'a'..'z'
4
+ VOWELS = %w{ a e i o u }
5
+
6
+ # Whether the string uses alliteration or not.
7
+ # Accepts a :threshold option for determining whether the string
8
+ # uses sufficient alliteration (see #aliterativity)
9
+ def alliteration?(options = {})
10
+ threshold = options.delete(:threshold) || 1
11
+ self.alliterativity >= threshold
12
+ end
13
+
14
+ # A score between 0 and 1 representing the level of alliteration
15
+ def alliterativity
16
+ words = self.downcase.gsub(/[^a-z\s]/, '').split
17
+ leading_letters = words.map(&:chr)
18
+
19
+ # { 'a' => 3, 'b' => 1, ... }
20
+ leading_letter_counts = leading_letters.inject({}) do |result, letter|
21
+ result[letter] ||= 0
22
+ result[letter] += 1
23
+ result
24
+ end
25
+
26
+ most_used_count = leading_letter_counts.max_by { |kv| kv.last }.pop
27
+ most_used_count.to_f / words.length
28
+ end
29
+
30
+ # The same letters backwards as forwards
31
+ def palindrome?
32
+ letter_sequence = self.downcase.gsub(/[^a-z]/, '')
33
+ letter_sequence.reverse == letter_sequence
34
+ end
35
+
36
+ # Replace the words in the word list with the word n places after it
37
+ def n_plus(places, word_list)
38
+ analysis = Analysis.new(self, :nouns => word_list)
39
+ substitutor = Substitutor.new(analysis)
40
+ substitutor.replace(:nouns).increment(places)
41
+ end
42
+
43
+ # Returns true if each word is one letter larger than the previous
44
+ def snowball?
45
+ words = self.split
46
+ self.chaterism? && words.first.length < words.last.length
47
+ end
48
+
49
+ # Returns true if only one vowel is used
50
+ def univocalism?
51
+ present_letters = self.downcase.split('').uniq
52
+ (VOWELS - present_letters).length == 4
53
+ end
54
+
55
+ # Returns true if the string is a sequence of words in each of which is one letter larger than the
56
+ # previous, or each word in the sequence is one letter less than the previous
57
+ def chaterism?
58
+ words = self.gsub(/[^a-z\s]/i, '').split
59
+
60
+ # Find the direction we're traveling
61
+ flen, llen = words.first.length, words.last.length
62
+ direction = flen > llen ? :downto : :upto
63
+
64
+ # Compare the pattern of word lengths against a range-turned-array of expected word lengths
65
+ words.map(&:length) == flen.send(direction, llen).to_a
66
+ end
67
+
68
+ # Returns an array of letters that are absent
69
+ def absent_letters
70
+ present_letters = self.downcase.split('').uniq
71
+ missing_letters = ALPHABET.to_a - present_letters
72
+ missing_letters.empty? ? nil : missing_letters
73
+ end
74
+
75
+ # Returns true if all letters of the alphabet are used
76
+ def pangram?
77
+ self.absent_letters.nil?
78
+ end
79
+
80
+ # Returns true if not all of the letters of the alphabet are used
81
+ def lipogram?
82
+ !self.pangram?
83
+ end
84
+
85
+ end
86
+ end
data/lib/oulipo.rb CHANGED
@@ -1,79 +1,21 @@
1
1
  require 'oulipo/word_list'
2
+ require 'oulipo/string_extensions'
3
+ require 'oulipo/enhanced_string'
2
4
  require 'oulipo/analysis'
3
5
  require 'oulipo/substitutor'
4
6
 
5
7
  module Oulipo
6
- ALPHABET = 'a'..'z'
7
- VOWELS = %w{ a e i o u }
8
8
 
9
- def self.absent_letters(work)
10
- present_letters = work.downcase.split('').uniq
11
- missing_letters = ALPHABET.to_a - present_letters
12
- missing_letters.empty? ? nil : missing_letters
13
- end
14
-
15
- # A pangram uses all letters
16
- def self.pangram?(work)
17
- self.absent_letters(work).nil?
18
- end
19
-
20
- # A lipogram has missing letters
21
- def self.lipogram?(work)
22
- !self.pangram?(work)
23
- end
24
-
25
- # In a chaterism, each successive word is larger than the last or vice versa
26
- def self.chaterism?(poem)
27
- # Discard the punctuation, split into words
28
- words = poem.gsub(/[^a-z\s]/i, '').split
29
-
30
- # Find the direction we're traveling
31
- flen, llen = words.first.length, words.last.length
32
- direction = flen > llen ? :downto : :upto
33
-
34
- # "The tree sings".map(&:length) # => [3, 4, 5]
35
- # [3, 4, 5] == 3.upto(5).to_a # => true
36
- words.map(&:length) == flen.send(direction, llen).to_a
37
- end
38
-
39
- def self.univocalism?(poem)
40
- present_letters = poem.downcase.split('').uniq
41
- (VOWELS - present_letters).length == 4
42
- end
43
-
44
- def self.snowball?(poem)
45
- words = poem.split
46
- self.chaterism?(poem) && words.first.length < words.last.length
47
- end
48
-
49
- def self.palindrome?(phrase)
50
- sequence = phrase.downcase.gsub(/[^a-z]/, '')
51
- sequence.reverse == sequence
52
- end
53
-
54
- def self.alliteration?(phrase, options = {})
55
- threshold = options.delete(:threshold) || 1
56
- self.alliterativity(phrase) >= threshold
57
- end
58
-
59
- # Calculate an alliteration score
60
- def self.alliterativity(phrase)
61
- words = phrase.downcase.gsub(/[^a-z\s]/, '').split
62
- leading_letters = words.map(&:chr)
63
-
64
- leading_letter_counts = leading_letters.inject({}) do |result, letter|
65
- result[letter] ||= 0
66
- result[letter] += 1
67
- result
68
- end
69
-
70
- most_used_count = leading_letter_counts.max_by { |kv| kv.last }.pop
71
- most_used_count.to_f / words.length
9
+ [:absent_letters, :pangram?, :lipogram?, :chaterism?,
10
+ :univocalism?, :snowball?, :palindrome?, :alliteration?,
11
+ :alliterativity].each do |method|
12
+ define_singleton_method(method.to_sym) do |*args|
13
+ EnhancedString.new(args.shift).send(method.to_sym, *args)
14
+ end
72
15
  end
73
16
 
17
+ # Replace the word nth places ahead in the word_list
74
18
  def self.n_plus(places, text, word_list)
75
- analysis = Analysis.new(text, :nouns => word_list)
76
- substitutor = Substitutor.new(analysis)
77
- substitutor.replace(:nouns).increment(places)
19
+ EnhancedString.new(text).n_plus(places, word_list)
78
20
  end
79
21
  end
data/oulipo.gemspec CHANGED
@@ -3,7 +3,7 @@ $:.push File.expand_path('../lib', __FILE__)
3
3
 
4
4
  Gem::Specification.new do |s|
5
5
  s.name = "oulipo"
6
- s.version = "0.2.0"
6
+ s.version = "0.3.1"
7
7
  s.date = Time.now.strftime('%Y-%m-%d')
8
8
  s.homepage = "http://github.com/Aupajo/oulipo"
9
9
  s.email = "pete@metanation.com"
@@ -1,26 +1,28 @@
1
1
  require 'spec_helper'
2
+ require 'oulipo/string_em_up'
2
3
 
3
4
  describe "alliteration" do
4
5
 
5
- let(:performer) { Oulipo }
6
-
7
6
  let(:pure_alliteration) { 'spec step succeeds speedily' }
8
7
  let(:mostly_alliterative) { 'quick queens quibble over quails' }
9
8
 
10
9
  it "detects pure alliteration" do
11
- performer.alliteration?(pure_alliteration).should == true
10
+ pure_alliteration.should be_alliteration
12
11
  end
13
-
12
+
14
13
  it "tells us the alliterativity of a phrase" do
15
- performer.alliterativity(pure_alliteration).should == 1.0
16
- performer.alliterativity(mostly_alliterative).should == 0.8
14
+ pure_alliteration.alliterativity.should == 1.0
15
+ mostly_alliterative.alliterativity.should == 0.8
17
16
  end
18
-
17
+
19
18
  it "detects alliteration with a threshold" do
20
- performer.alliteration?(mostly_alliterative).should == false
21
- performer.alliteration?(mostly_alliterative, :threshold => 0.7).should == true
22
- performer.alliteration?(mostly_alliterative, :threshold => 0.8).should == true
23
- performer.alliteration?(mostly_alliterative, :threshold => 0.9).should == false
19
+ mostly_alliterative.should_not be_alliteration
20
+ mostly_alliterative.should be_alliteration(:threshold => 0.7)
21
+ mostly_alliterative.should be_alliteration(:threshold => 0.8)
22
+ mostly_alliterative.should_not be_alliteration(:threshold => 0.9)
24
23
  end
25
24
 
25
+ it "is accessible via Oulipo" do
26
+ Oulipo.should forward_to_enhanced_string(:alliterativity, :alliteration?)
27
+ end
26
28
  end
@@ -1,14 +1,13 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe Oulipo::Analysis do
4
- include Oulipo
5
4
 
6
5
  let(:folksong) { "O'er the moor and among the heather" }
7
6
 
8
7
  let(:word_lists) { { :nouns => %w{ moor heather },
9
8
  :prepositions => %w{ among } } }
10
9
 
11
- let(:analysis) { Analysis.new(folksong, word_lists) }
10
+ let(:analysis) { Oulipo::Analysis.new(folksong, word_lists) }
12
11
 
13
12
  it "can identify words" do
14
13
  analysis.identified.sort.should == %w{ among heather moor }
@@ -1,10 +1,8 @@
1
1
  require 'spec_helper'
2
+ require 'oulipo/string_em_up'
2
3
 
3
4
  describe "chaterisms" do
4
5
 
5
- # For easy switching
6
- let(:performer) { Oulipo }
7
-
8
6
  let(:snowball_poem) do
9
7
  <<-POEM
10
8
  The
@@ -33,15 +31,18 @@ describe "chaterisms" do
33
31
  }
34
32
 
35
33
  it "can detect both diminishing and growing chaterisms" do
36
- performer.chaterism?(snowball_poem).should == true
37
- performer.chaterism?(diminishing_poem).should == true
38
- performer.chaterism?(regular_poem).should == false
34
+ snowball_poem.should be_chaterism
35
+ diminishing_poem.should be_chaterism
36
+ regular_poem.should_not be_chaterism
39
37
  end
40
38
 
41
39
  it "detects a snowball poem" do
42
- performer.snowball?(snowball_poem).should == true
43
- performer.snowball?(diminishing_poem).should == false
44
- performer.snowball?(regular_poem).should == false
40
+ snowball_poem.should be_snowball
41
+ diminishing_poem.should_not be_snowball
42
+ regular_poem.should_not be_snowball
45
43
  end
46
44
 
45
+ it "is accessible via Oulipo" do
46
+ Oulipo.should forward_to_enhanced_string(:chaterism?, :snowball?)
47
+ end
47
48
  end
@@ -1,24 +1,26 @@
1
1
  require 'spec_helper'
2
+ require 'oulipo/string_em_up'
2
3
 
3
4
  describe "lipograms and pangrams" do
4
5
 
5
- # Easy to switch class, if refactored
6
- let(:performer) { Oulipo }
7
-
8
6
  let(:pangram) { 'The quick brown fox jumps over a lazy god' }
9
7
  let(:lipogram) { 'The quick grey fox jumps over lazy gods' }
10
8
 
11
9
  it "shows absent letters" do
12
- performer.absent_letters(pangram).should == nil
13
- performer.absent_letters(lipogram).should == %w{ b n w }
10
+ pangram.absent_letters.should be_nil
11
+ lipogram.absent_letters.should == %w{ b n w }
14
12
  end
15
13
 
16
14
  it "can tell a pangram from a lipogram" do
17
- performer.lipogram?(lipogram).should == true
18
- performer.lipogram?(pangram).should == false
15
+ lipogram.should be_lipogram
16
+ pangram.should_not be_lipogram
19
17
 
20
- performer.pangram?(pangram).should == true
21
- performer.pangram?(lipogram).should == false
18
+ lipogram.should_not be_pangram
19
+ pangram.should be_pangram
20
+ end
21
+
22
+ it "is accessible via Oulipo" do
23
+ Oulipo.should forward_to_enhanced_string(:lipogram?, :pangram?)
22
24
  end
23
25
 
24
26
  end
@@ -2,11 +2,13 @@ require 'spec_helper'
2
2
 
3
3
  describe "palindromes" do
4
4
 
5
- let(:performer) { Oulipo }
6
-
7
5
  it "detects palindromes" do
8
- performer.palindrome?('Mr. Owl ate my metal worm').should == true
9
- performer.palindrome?('Carelessness is a dish best served drunk').should == false
6
+ 'Mr. Owl ate my metal worm'.should be_palindrome
7
+ 'Carelessness is a dish best served drunk'.should_not be_palindrome
8
+ end
9
+
10
+ it "is accessible via Oulipo" do
11
+ Oulipo.should forward_to_enhanced_string(:palindrome?)
10
12
  end
11
13
 
12
14
  end
data/spec/spec_helper.rb CHANGED
@@ -2,4 +2,16 @@ require 'bundler'
2
2
  Bundler.setup(:default, :test)
3
3
 
4
4
  $:.unshift File.join(File.dirname(__FILE__), '..', 'lib')
5
- require 'oulipo'
5
+ require 'oulipo'
6
+
7
+ RSpec::Matchers.define :forward_to_enhanced_string do |*forwarded_methods|
8
+ match do |oulipo|
9
+ stubs = forwarded_methods.inject({}) { |stubs, method| stubs.merge(method => :forwarded) }
10
+ enhanced_string = mock(:enhanced_string, stubs)
11
+ Oulipo::EnhancedString.should_receive(:new).with('a phrase').at_least(:once).and_return(enhanced_string)
12
+
13
+ forwarded_methods.each do |method|
14
+ oulipo.send(method, 'a phrase').should == :forwarded
15
+ end
16
+ end
17
+ end
@@ -1,4 +1,5 @@
1
1
  require 'spec_helper'
2
+ require 'oulipo/string_em_up'
2
3
 
3
4
  describe "substitution" do
4
5
 
@@ -10,8 +11,6 @@ describe "substitution" do
10
11
  Oulipo::Substitutor.new analysis_with(*args)
11
12
  end
12
13
 
13
- let(:performer) { Oulipo }
14
-
15
14
  let(:phrase) { 'The bear ate the badger' }
16
15
  let(:noun_list) { %w{ badger bat bear } }
17
16
  let(:substitutor) { substitutor_with(phrase, :nouns => noun_list) }
@@ -25,11 +24,17 @@ describe "substitution" do
25
24
  it "raises an error if increment is called before replace" do
26
25
  lambda { substitutor.increment(3) }.should raise_error
27
26
  end
28
-
27
+
29
28
  it "can be accessed from Oulipo with n_plus" do
30
- performer.n_plus(1, phrase, noun_list).should == 'The badger ate the bat'
31
- performer.n_plus(2, phrase, noun_list).should == 'The bat ate the bear'
32
- performer.n_plus(6, phrase, noun_list).should == 'The bear ate the badger'
29
+ Oulipo.n_plus(1, phrase, noun_list).should == 'The badger ate the bat'
30
+ Oulipo.n_plus(2, phrase, noun_list).should == 'The bat ate the bear'
31
+ Oulipo.n_plus(6, phrase, noun_list).should == 'The bear ate the badger'
32
+ end
33
+
34
+ it "can be accessed from a string with n_plus" do
35
+ phrase.n_plus(1, noun_list).should == 'The badger ate the bat'
36
+ phrase.n_plus(2, noun_list).should == 'The bat ate the bear'
37
+ phrase.n_plus(6, noun_list).should == 'The bear ate the badger'
33
38
  end
34
39
 
35
40
  it "handles unused nouns" do
@@ -1,9 +1,8 @@
1
1
  require 'spec_helper'
2
+ require 'oulipo/string_em_up'
2
3
 
3
4
  describe "univocalisms" do
4
5
 
5
- let(:performer) { Oulipo }
6
-
7
6
  let(:univocalism) {
8
7
  <<-POEM
9
8
  No cool monsoons blow soft on Oxford dons,
@@ -23,8 +22,11 @@ describe "univocalisms" do
23
22
  }
24
23
 
25
24
  it "detects a univocalism" do
26
- performer.univocalism?(univocalism).should == true
27
- performer.univocalism?(regular_poem).should == false
25
+ univocalism.should be_univocalism
26
+ regular_poem.should_not be_univocalism
28
27
  end
29
28
 
29
+ it "is accessible via Oulipo" do
30
+ Oulipo.should forward_to_enhanced_string(:univocalism?)
31
+ end
30
32
  end
metadata CHANGED
@@ -1,28 +1,22 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: oulipo
3
- version: !ruby/object:Gem::Version
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.3.1
4
5
  prerelease:
5
- version: 0.2.0
6
6
  platform: ruby
7
- authors:
7
+ authors:
8
8
  - Pete Nicholls
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
-
13
- date: 2011-07-29 00:00:00 +12:00
14
- default_executable:
12
+ date: 2011-08-01 00:00:00.000000000 Z
15
13
  dependencies: []
16
-
17
14
  description: Oulipo gives you tools to write constrained stories and poems with Ruby.
18
15
  email: pete@metanation.com
19
16
  executables: []
20
-
21
17
  extensions: []
22
-
23
18
  extra_rdoc_files: []
24
-
25
- files:
19
+ files:
26
20
  - Gemfile
27
21
  - Gemfile.lock
28
22
  - LICENSE
@@ -30,6 +24,9 @@ files:
30
24
  - Rakefile
31
25
  - lib/oulipo.rb
32
26
  - lib/oulipo/analysis.rb
27
+ - lib/oulipo/enhanced_string.rb
28
+ - lib/oulipo/string_em_up.rb
29
+ - lib/oulipo/string_extensions.rb
33
30
  - lib/oulipo/substitutor.rb
34
31
  - lib/oulipo/word_list.rb
35
32
  - oulipo.gemspec
@@ -43,35 +40,31 @@ files:
43
40
  - spec/substitution_spec.rb
44
41
  - spec/univocalisms_spec.rb
45
42
  - spec/word_list_spec.rb
46
- has_rdoc: true
47
43
  homepage: http://github.com/Aupajo/oulipo
48
44
  licenses: []
49
-
50
45
  post_install_message:
51
46
  rdoc_options: []
52
-
53
- require_paths:
47
+ require_paths:
54
48
  - lib
55
- required_ruby_version: !ruby/object:Gem::Requirement
49
+ required_ruby_version: !ruby/object:Gem::Requirement
56
50
  none: false
57
- requirements:
58
- - - ">="
59
- - !ruby/object:Gem::Version
60
- version: "0"
61
- required_rubygems_version: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ! '>='
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ required_rubygems_version: !ruby/object:Gem::Requirement
62
56
  none: false
63
- requirements:
64
- - - ">="
65
- - !ruby/object:Gem::Version
66
- version: "0"
57
+ requirements:
58
+ - - ! '>='
59
+ - !ruby/object:Gem::Version
60
+ version: '0'
67
61
  requirements: []
68
-
69
62
  rubyforge_project:
70
- rubygems_version: 1.6.2
63
+ rubygems_version: 1.8.6
71
64
  signing_key:
72
65
  specification_version: 3
73
66
  summary: Constrained writing with Ruby.
74
- test_files:
67
+ test_files:
75
68
  - spec/alliteration_spec.rb
76
69
  - spec/analysis_spec.rb
77
70
  - spec/chaterisms_spec.rb