can_has_fixtures 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
data/HISTORY ADDED
@@ -0,0 +1,4 @@
1
+ can_has_fixtures Release History
2
+
3
+ Version 0.1.0 (16 March 2008)
4
+ * Initial release.
data/LICENSE ADDED
@@ -0,0 +1,25 @@
1
+ Copyright (c) 2008 Ben Burkert <ben@benburkert.com>
2
+ All rights reserved.
3
+
4
+ Redistribution and use in source and binary forms, with or without
5
+ modification, are permitted provided that the following conditions are met:
6
+
7
+ * Redistributions of source code must retain the above copyright notice,
8
+ this list of conditions and the following disclaimer.
9
+ * Redistributions in binary form must reproduce the above copyright notice,
10
+ this list of conditions and the following disclaimer in the documentation
11
+ and/or other materials provided with the distribution.
12
+ * Neither the name of this project nor the names of its contributors may be
13
+ used to endorse or promote products derived from this software without
14
+ specific prior written permission.
15
+
16
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
17
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18
+ WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19
+ DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
20
+ ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21
+ (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22
+ LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
23
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25
+ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
data/README ADDED
@@ -0,0 +1,78 @@
1
+ = can_has_fixtures
2
+
3
+ Easily create fixtures.
4
+
5
+ Author:: Ben Burkert (mailto:ben@benburkert.com)
6
+ Version:: 0.1.0
7
+ Copyright:: Copyright (c) 2008 Ben Burkert. All rights reserved.
8
+ License:: New BSD License (http://opensource.org/licenses/bsd-license.php)
9
+ Website:: http://canhasgems.rubyforge.org/can_has_fixtures/
10
+ Repository:: git://github.com/benburkert/can_has_fixtures.git
11
+
12
+ == Dependencies
13
+
14
+ == Basic Usage
15
+
16
+ can_has_fixtures works with any ORM that provides a +create+ method that accepts an attribute
17
+ hash on the model classes.
18
+
19
+ can_has_fixtures works best with RSpec, but can be used from irb as well:
20
+
21
+ require 'can_has_fixtures'
22
+
23
+ First create a fixture for the model, in this case it's Post:
24
+
25
+ Post.fixture {{
26
+ :title => 3.random.words * ' ',
27
+ :created_at => Time.now,
28
+ :body => 5.random.paragraphs * '\n',
29
+ :author => User.gen
30
+ }}
31
+
32
+ If the a nested fixture is used (author, in this case), make sure to create add the fixture:
33
+
34
+ User.fixture {{
35
+ :first_name => Random.word,
36
+ :last_name => Random.word,
37
+ :user_name => Random.word,
38
+ :email => Random.email,
39
+ :password => Random.word
40
+ }}
41
+
42
+ Finally, call model class' +gen+ method to create the fixture:
43
+
44
+ @post = Post.gen
45
+
46
+ Fixtures can also be named by supplying the +fixture+ method a paramater:
47
+
48
+ Post.fixture(:short_post) {{
49
+ :title => 3.random.words * ' ',
50
+ :created_at => Time.now,
51
+ :body => Random.sentence,
52
+ :author => User.gen
53
+ }}
54
+
55
+ @post = Post.gen(:short_post)
56
+
57
+ can_has_fixtures is great for specing models. By using the model's class for the describe target,
58
+ simply call +fixture+ within the body of the spec:
59
+
60
+ describe Post do
61
+ fixture {{
62
+ :title => 3.random.words * ' ',
63
+ :created_at => Time.now,
64
+ :body => Random.sentence
65
+ }}
66
+
67
+ before(:each) do
68
+ @post = Post.gen
69
+ end
70
+
71
+ it "should not be valid without a body" do
72
+ @post.body = nil
73
+ @post.save
74
+
75
+ @post.should_not be_valid
76
+ end
77
+ end
78
+
data/Rakefile ADDED
@@ -0,0 +1,76 @@
1
+ # -*- ruby -*-
2
+
3
+ require "rake"
4
+ require "rake/clean"
5
+ require "rake/gempackagetask"
6
+ require 'rake/rdoctask'
7
+ require "spec"
8
+ require "spec/rake/spectask"
9
+
10
+ DIR = File.dirname(__FILE__)
11
+ NAME = 'can_has_fixtures'
12
+ SUMMARY =<<-EOS
13
+ Library for generating fixtures.
14
+ EOS
15
+
16
+ require "lib/can_has_fixtures/version"
17
+
18
+ spec = Gem::Specification.new do |s|
19
+ s.name = NAME
20
+ s.summary = SUMMARY
21
+
22
+ s.version = CanHasFixtures::VERSION
23
+ s.platform = Gem::Platform::RUBY
24
+
25
+ s.require_path = "lib"
26
+ s.files = %w(Rakefile LICENSE HISTORY README) + Dir["lib/**/*"]
27
+ end
28
+
29
+ Rake::GemPackageTask.new(spec) do |package|
30
+ package.gem_spec = spec
31
+ package.need_zip = true
32
+ package.need_tar = true
33
+ end
34
+
35
+ ##############################################################################
36
+ # Documentation
37
+ ##############################################################################
38
+ task :doc => "doc:rerdoc"
39
+ namespace :doc do
40
+
41
+ Rake::RDocTask.new do |rdoc|
42
+ files = ['README', 'LICENSE', 'HISTORY',
43
+ 'lib/**/*.rb', 'doc/**/*.rdoc', 'spec/**/*.rb']
44
+ rdoc.rdoc_files.add(files)
45
+ rdoc.main = 'README'
46
+ rdoc.title = 'I CAN HAS "CAN HAS FIXTURES?" DOCS? '
47
+ rdoc.template = 'tools/allison-2.0.3/lib/allison'
48
+ rdoc.rdoc_dir = 'doc/can_has_fixtures/rdoc'
49
+ rdoc.options << '--line-numbers' << '--inline-source'
50
+ end
51
+
52
+ desc "rdoc to rubyforge"
53
+ task :rubyforge => :doc do
54
+ sh %{chmod -R 755 doc}
55
+ sh %{/usr/bin/scp -r -p doc/can_has_fixtures/rdoc/* benburkert@rubyforge.org:/var/www/gforge-projects/canhasgems/can_has_fixtures}
56
+ end
57
+ end
58
+
59
+ ##############################################################################
60
+ # rSpec & rcov
61
+ ##############################################################################
62
+ desc "Run all specs"
63
+ Spec::Rake::SpecTask.new("specs") do |t|
64
+ t.spec_opts = ["--format", "specdoc", "--colour"]
65
+ t.spec_files = Dir["spec/**/*_spec.rb"].sort
66
+ end
67
+
68
+ ##############################################################################
69
+ # release
70
+ ##############################################################################
71
+ task :release => [:specs, "doc:rubyforge", :package] do
72
+ sh %{rubyforge add_release canhasgems can_has_fixtures "#{CanHasFixtures::VERSION}" pkg/#{NAME}-#{CanHasFixtures::VERSION}.gem}
73
+ %w[zip tgz].each do |ext|
74
+ sh %{rubyforge add_file canhasgems can_has_fixtures #{CanHasFixtures::VERSION} pkg/can_has_fixtures-#{CanHasFixtures::VERSION}.#{ext}}
75
+ end
76
+ end
@@ -0,0 +1,49 @@
1
+ class Class # :nodoc:
2
+ include FixturizeMixin
3
+
4
+ def cattr_reader(*syms)
5
+ syms.flatten.each do |sym|
6
+ next if sym.is_a?(Hash)
7
+ class_eval(<<-EOS, __FILE__, __LINE__)
8
+ unless defined? @@#{sym}
9
+ @@#{sym} = nil
10
+ end
11
+
12
+ def self.#{sym}
13
+ @@#{sym}
14
+ end
15
+
16
+ def #{sym}
17
+ @@#{sym}
18
+ end
19
+ EOS
20
+ end
21
+ end
22
+
23
+ def cattr_writer(*syms)
24
+ options = syms.last.is_a?(Hash) ? syms.pop : {}
25
+ syms.flatten.each do |sym|
26
+ class_eval(<<-EOS, __FILE__, __LINE__)
27
+ unless defined? @@#{sym}
28
+ @@#{sym} = nil
29
+ end
30
+
31
+ def self.#{sym}=(obj)
32
+ @@#{sym} = obj
33
+ end
34
+
35
+ #{"
36
+
37
+ def #{sym}=(obj)
38
+ @@#{sym} = obj
39
+ end
40
+ " unless options[:instance_writer] == false }
41
+ EOS
42
+ end
43
+ end
44
+
45
+ def cattr_accessor(*syms)
46
+ cattr_reader(*syms)
47
+ cattr_writer(*syms)
48
+ end
49
+ end
@@ -0,0 +1,5 @@
1
+ class Fixnum
2
+ def random
3
+ Random.chain(self)
4
+ end
5
+ end
@@ -0,0 +1,2 @@
1
+ require "can_has_fixtures/core_ext/class"
2
+ require "can_has_fixtures/core_ext/fixnum"
@@ -0,0 +1,75 @@
1
+ module FixturizeMixin
2
+ def self.included(base)
3
+ unless method_defined? :method_missing
4
+ def method_missing(meth, *args, &block); super; end
5
+ end
6
+
7
+ base.class_eval do
8
+ alias_method :method_missing_without_fixture_check, :method_missing
9
+ alias_method :method_missing, :method_missing_with_fixture_check
10
+ end
11
+ end
12
+
13
+ def method_missing_with_fixture_check(meth, *args, &block)
14
+ if meth.to_s == "fixture"
15
+ if respond_to?(:description_args)
16
+ fixturize_description_args(*args, &block)
17
+ else
18
+ fixturize!
19
+ fixture(*args, &block)
20
+ end
21
+ else
22
+ method_missing_without_fixture_check(meth, *args, &block)
23
+ end
24
+ end
25
+
26
+ def fixturize_description_args(*args, &block)
27
+ klass = description_args.first
28
+
29
+ case klass
30
+ when Class then fixturize!(klass) unless klass.respond_to?(:fixture)
31
+ end
32
+
33
+ klass.fixture(args.first || :default, &block)
34
+ end
35
+
36
+ def fixturize!(klass = self)
37
+ klass.cattr_accessor :fixture_procs
38
+
39
+ klass.fixture_procs = {}
40
+
41
+ class << klass
42
+ def fixture(identifier = :default, &block)
43
+ case identifier
44
+ when Class then add_fixture(identifier.to_s.snake_case.to_sym, &block)
45
+ when String then add_fixture(identifier.snake_case.to_sym, &block)
46
+ when Symbol then add_fixture(identifier, &block)
47
+ end
48
+ end
49
+
50
+ def add_fixture(sym, &block)
51
+ fixture_procs[sym] = fixture_procs[sym] ? fixture_procs[sym] << block : [block]
52
+ end
53
+
54
+ def generate(*args, &block)
55
+ args, attributes = args_and_options(*args)
56
+ identifier = args.first || :default
57
+
58
+ attr_procs = fixture_procs[identifier.to_s.snake_case.to_sym]
59
+
60
+ raise "#{identifier} fixture was not found" if attr_procs.nil? || attr_procs.empty?
61
+
62
+ proc = attr_procs[rand(attr_procs.size)]
63
+
64
+ values = proc.call(*args)
65
+
66
+ case values
67
+ when Hash then create(values.merge(attributes))
68
+ else raise "#{identifier.to_s.camel_case} fixture's attributes were not recognized"
69
+ end
70
+ end
71
+
72
+ alias_method :gen, :generate
73
+ end
74
+ end
75
+ end
@@ -0,0 +1,51 @@
1
+ class Random
2
+ WORDS_PER_SENTENCE = 3..20
3
+ SENTENCES_PER_PARAGRAPH = 3..8
4
+
5
+ attr_accessor :count
6
+
7
+ def self.chain(target)
8
+ Random.new(target)
9
+ end
10
+
11
+ def initialize(count = 1)
12
+ @count = count
13
+ end
14
+
15
+ def dictionary
16
+ @@dictionary ||= File.read("/usr/share/dict/words").split
17
+ end
18
+
19
+ def word
20
+ dictionary[rand(dictionary.size)]
21
+ end
22
+
23
+ def words
24
+ (1..count).collect { word }
25
+ end
26
+
27
+ def sentence(punctuate = true)
28
+ (1..WORDS_PER_SENTENCE.to_a[rand(WORDS_PER_SENTENCE.to_a.size)]).collect{ word }.join(' ') + (punctuate ? '.' : '')
29
+ end
30
+
31
+
32
+ def sentences(punctuate = true)
33
+ (1..count).collect { sentence(punctuate) }
34
+ end
35
+
36
+ def paragraph(end_with_newline = true)
37
+ (1..SENTENCES_PER_PARAGRAPH.to_a[rand(SENTENCES_PER_PARAGRAPH.to_a.size)]).collect{ sentence }.join(' ') + (end_with_newline ? '\n' : '')
38
+ end
39
+
40
+ def paragraphs(end_with_newline = true)
41
+ (1..count).collect { paragraph(end_with_newline) }
42
+ end
43
+
44
+ def email
45
+ "#{word}@#{word}.#{%w[com net org biz info gov][rand(6)]}"
46
+ end
47
+
48
+ def emails
49
+ (1..count).collect { email }
50
+ end
51
+ end
@@ -0,0 +1,16 @@
1
+ class Object
2
+ def args_and_options(*args)
3
+ options = Hash === args.last ? args.pop : {}
4
+ return args, options
5
+ end
6
+ end
7
+
8
+ class String
9
+ def snake_case
10
+ gsub(/\B[A-Z]/, '_\&').downcase
11
+ end
12
+
13
+ def camel_case
14
+ split('_').map{|e| e.capitalize}.join
15
+ end
16
+ end
@@ -0,0 +1,3 @@
1
+ module CanHasFixtures
2
+ VERSION = "0.1.0"
3
+ end
@@ -0,0 +1,41 @@
1
+ require "can_has_fixtures/util"
2
+ require "can_has_fixtures/fixturize_mixin"
3
+ require "can_has_fixtures/core_ext"
4
+
5
+ require "can_has_fixtures/random"
6
+
7
+ module CanHasFixtures
8
+
9
+ module ClassMethods
10
+ attr_accessor :fixture_procs
11
+ end
12
+
13
+ def self.included(base)
14
+ base.extend(ClassMethods)
15
+
16
+ unless method_defined? :method_missing
17
+ def method_missing(meth, *args, &block); super; end
18
+ end
19
+
20
+ base.class_eval do
21
+ alias_method :method_missing_without_fixture_check, :method_missing
22
+ alias_method :method_missing, :method_missing_missing_with_fixture_check
23
+ end
24
+ end
25
+
26
+ def method_missing_missing_with_fixture_check(meth, *args, &block)
27
+ if meth.to_s == "fixture"
28
+ fixturize_description($1.to_sym, *args, &block)
29
+ else
30
+ method_missing_without_fixture_check(meth, *args, &block)
31
+ end
32
+ end
33
+
34
+ def fixture(*args, &block)
35
+ p "here"
36
+ end
37
+
38
+ def fixturize_description
39
+ p description_args
40
+ end
41
+ end
metadata ADDED
@@ -0,0 +1,66 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: can_has_fixtures
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors: []
7
+
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+
12
+ date: 2008-03-17 00:00:00 -05:00
13
+ default_executable:
14
+ dependencies: []
15
+
16
+ description:
17
+ email:
18
+ executables: []
19
+
20
+ extensions: []
21
+
22
+ extra_rdoc_files: []
23
+
24
+ files:
25
+ - Rakefile
26
+ - LICENSE
27
+ - HISTORY
28
+ - README
29
+ - lib/can_has_fixtures
30
+ - lib/can_has_fixtures/core_ext
31
+ - lib/can_has_fixtures/core_ext/class.rb
32
+ - lib/can_has_fixtures/core_ext/fixnum.rb
33
+ - lib/can_has_fixtures/core_ext.rb
34
+ - lib/can_has_fixtures/fixturize_mixin.rb
35
+ - lib/can_has_fixtures/random.rb
36
+ - lib/can_has_fixtures/util.rb
37
+ - lib/can_has_fixtures/version.rb
38
+ - lib/can_has_fixtures.rb
39
+ has_rdoc: false
40
+ homepage:
41
+ post_install_message:
42
+ rdoc_options: []
43
+
44
+ require_paths:
45
+ - lib
46
+ required_ruby_version: !ruby/object:Gem::Requirement
47
+ requirements:
48
+ - - ">="
49
+ - !ruby/object:Gem::Version
50
+ version: "0"
51
+ version:
52
+ required_rubygems_version: !ruby/object:Gem::Requirement
53
+ requirements:
54
+ - - ">="
55
+ - !ruby/object:Gem::Version
56
+ version: "0"
57
+ version:
58
+ requirements: []
59
+
60
+ rubyforge_project:
61
+ rubygems_version: 1.0.1
62
+ signing_key:
63
+ specification_version: 2
64
+ summary: Library for generating fixtures.
65
+ test_files: []
66
+