blueprints 0.6.2 → 0.6.3

Sign up to get free protection for your applications and to get access to all the features.
data/Rakefile CHANGED
@@ -19,3 +19,53 @@ Rake::RDocTask.new do |rd|
19
19
  rd.main = "README.rdoc"
20
20
  rd.rdoc_files.include("README.rdoc", "lib/**/*.rb")
21
21
  end
22
+
23
+ namespace :db do
24
+ desc "Create database structure"
25
+ task :prepare do
26
+ require 'rubygems'
27
+ require 'active_record'
28
+
29
+ Dir.chdir File.dirname(__FILE__)
30
+
31
+ ActiveRecord::Base.logger = Logger.new("debug.log")
32
+
33
+ databases = YAML::load(IO.read("spec/active_record/fixtures/database.yml"))
34
+ db_info = databases[ENV["DB"] || "test"]
35
+ ActiveRecord::Base.establish_connection(db_info)
36
+
37
+ load("spec/active_record/fixtures/schema.rb")
38
+ end
39
+ end
40
+
41
+ desc "Convert rspec specs to test/unit tests"
42
+ task :rspec_to_test do
43
+ Dir.chdir File.dirname(__FILE__)
44
+ data = IO.read('spec/active_record/blueprints_spec.rb')
45
+
46
+ data.gsub!("require File.dirname(__FILE__) + '/spec_helper'", "require File.dirname(__FILE__) + '/test_helper'")
47
+ data.gsub!("describe Blueprints do", 'class BlueprintsTest < ActiveSupport::TestCase')
48
+
49
+ # lambda {
50
+ # hornsby_clear :undo => :just_orange
51
+ # }.should raise_error(ArgumentError)
52
+ data.gsub!(/(\s+)lambda \{\n(.*)\n(\s+)\}.should raise_error\((.*)\)/, "\\1assert_raise(\\4) do\n\\2\n\\3end")
53
+ # should =~ => assert_similar
54
+ data.gsub!(/^(\s+)(.*)\.should\s*=~\s*(.*)/, '\1assert_similar(\2, \3)')
55
+
56
+ # .should_not => assert(!())
57
+ data.gsub!(/^(\s+)(.*)\.should_not(.*)/, '\1assert(!(\2\3))')
58
+ # .should => assert()
59
+ data.gsub!(/^(\s+)(.*)\.should(.*)/, '\1assert(\2\3)')
60
+ # be_nil => .nil?
61
+ data.gsub!(/ be_([^\(\)]*)/, '.\1?')
62
+ # have(2).items => .size == 2
63
+ data.gsub!(/ have\((\d+)\)\.items/, '.size == \1')
64
+
65
+ data.gsub!(/^(\s+)describe/, '\1context')
66
+ data.gsub!(/^(\s+)it (["'])(should )?/, '\1should \2')
67
+ data.gsub!(/^(\s+)before.*do/, '\1setup do')
68
+ data.gsub!(/^(\s+)after.*do/, '\1teardown do')
69
+
70
+ File.open('test/blueprints_test.rb', 'w') {|f| f.write(data)}
71
+ end
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.6.2
1
+ 0.6.3
data/blueprints.gemspec CHANGED
@@ -5,7 +5,7 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{blueprints}
8
- s.version = "0.6.2"
8
+ s.version = "0.6.3"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Andrius Chamentauskas"]
@@ -39,8 +39,6 @@ Gem::Specification.new do |s|
39
39
  "lib/blueprints/namespace.rb",
40
40
  "lib/blueprints/plan.rb",
41
41
  "lib/blueprints/root_namespace.rb",
42
- "script/load_schema",
43
- "script/rspec_to_test",
44
42
  "spec/active_record/blueprint.rb",
45
43
  "spec/active_record/blueprints_spec.rb",
46
44
  "spec/active_record/fixtures/database.yml.example",
data/lib/blueprints.rb CHANGED
@@ -1,4 +1,7 @@
1
1
  require 'active_support'
2
+ require 'active_support/core_ext'
3
+ require 'set'
4
+
2
5
  files = %w{
3
6
  context buildable namespace root_namespace plan file_context helper errors
4
7
  database_backends/abstract database_backends/active_record database_backends/none
@@ -1,6 +1,6 @@
1
1
  module Blueprints
2
2
  class Buildable
3
- class Dependency < Struct.new(:name)
3
+ class Dependency < Struct.new(:name) # :nodoc:
4
4
  alias :to_sym :name
5
5
 
6
6
  def iv_name
@@ -11,6 +11,10 @@ module Blueprints
11
11
  attr_reader :name
12
12
  attr_accessor :namespace
13
13
 
14
+ # Initializes new Buildable object by name.
15
+ # Name can be Symbol, String or Hash. If Hash is passed, then first key is assumed name, and value(s) of that key
16
+ # are assumed as dependencies. Raises error class of name parameter is not what is expected.
17
+ # Warns if name has already been taken.
14
18
  def initialize(name)
15
19
  @name, parents = parse_name(name)
16
20
  depends_on(*parents)
@@ -26,6 +30,10 @@ module Blueprints
26
30
  end
27
31
 
28
32
  # Builds dependencies of blueprint and then blueprint itself.
33
+ #
34
+ # +build_once+ - pass false if you want to build despite the fact that it was already built.
35
+ #
36
+ # +options+ - list of options to be accessible in the body of a blueprint. Defaults to empty Hash.
29
37
  def build(build_once = true, options = {})
30
38
  each_namespace {|namespace| namespace.build_parents }
31
39
  build_parents
@@ -39,6 +47,8 @@ module Blueprints
39
47
  end
40
48
  end
41
49
 
50
+ # If value is passed then it sets attributes for this buildable object.
51
+ # Otherwise returns attributes (defaulting to empty Hash)
42
52
  def attributes(value = nil)
43
53
  if value
44
54
  raise value.inspect + @name if @name == ''
@@ -3,6 +3,7 @@ module Blueprints
3
3
  class Context
4
4
  attr_accessor :options, :attributes
5
5
 
6
+ # Method that allows building one blueprint inside of another. Simply delegates to root namespace.
6
7
  def build(*names)
7
8
  Namespace.root.build(*names)
8
9
  end
@@ -1,6 +1,5 @@
1
- extend_class = defined?(RSpec) ? RSpec::Core::Configuration : Spec::Runner::Configuration
2
-
3
- extend_class.class_eval do
1
+ # Module that gets included into RSpec Configuration class to provide enable_blueprints method.
2
+ module Blueprints::RspecMixin
4
3
  # Enables blueprints in rspec. Is automatically added if <tt>Spec</tt> is defined at loading time or <tt>script/spec</tt>
5
4
  # is used. You might need to require it manually in certain case (eg. running specs from metrics).
6
5
  # Accepts options hash. For supported options please check Blueprints.load.
@@ -16,3 +15,21 @@ extend_class.class_eval do
16
15
  end
17
16
  end
18
17
  end
18
+
19
+ if defined?(RSpec)
20
+ module RSpec #:nodoc:
21
+ module Core #:nodoc:
22
+ class Configuration
23
+ include Blueprints::RspecMixin
24
+ end
25
+ end
26
+ end
27
+ else
28
+ module Spec #:nodoc:
29
+ module Runner #:nodoc:
30
+ class Configuration
31
+ include Blueprints::RspecMixin
32
+ end
33
+ end
34
+ end
35
+ end
@@ -20,6 +20,11 @@ module Blueprints
20
20
  Namespace.root.build(names, self, false)
21
21
  end
22
22
 
23
+ # Returns attributes that are used to build blueprint. To set what attributes are used you need to call attributes
24
+ # method when defining blueprint like this:
25
+ # blueprint :apple do
26
+ # Fruit.build attributes
27
+ # end.attributes(:name => 'apple')
23
28
  def build_attributes(name)
24
29
  Namespace.root[name].attributes
25
30
  end
@@ -6,16 +6,19 @@ module Blueprints
6
6
  attr_reader :children
7
7
  delegate :empty?, :size, :to => :@children
8
8
 
9
+ # Creates namespace by name. See Buildable#new.
9
10
  def initialize(name)
10
11
  super(name)
11
12
  @children = {}
12
13
  end
13
14
 
15
+ # Adds child to namespaces children. Child should be instance of Buildable.
14
16
  def add_child(child)
15
17
  @children[child.name] = child
16
18
  child.namespace = self
17
19
  end
18
20
 
21
+ # Finds child by relative name. Raises PlanNotFoundError if child can't be found.
19
22
  def [](path)
20
23
  child_name, path = path.to_s.split('.', 2)
21
24
  child = @children[child_name.to_sym] or raise PlanNotFoundError, child_name
@@ -26,6 +29,7 @@ module Blueprints
26
29
  end
27
30
  end
28
31
 
32
+ # Builds all children and sets instance variable named by name of namespace with the results.
29
33
  def build_self(build_once = true)
30
34
  Namespace.root.add_variable(path, @children.collect {|p| p.last.build }.uniq)
31
35
  end
@@ -394,14 +394,14 @@ describe Blueprints do
394
394
 
395
395
  it "should warn when blueprint with same name exists" do
396
396
  STDERR.expects(:puts).with("**WARNING** Overwriting existing blueprint: 'overwritten'")
397
- STDERR.expects(:puts).with(regexp_matches(/^blueprints_spec\.rb:\d+:in `new'$/))
397
+ STDERR.expects(:puts).with(regexp_matches(/blueprints_(spec|test)\.rb:\d+:in `new'/))
398
398
  Blueprints::Plan.new(:overwritten)
399
399
  Blueprints::Plan.new(:overwritten)
400
400
  end
401
401
 
402
402
  it "should warn when building with options and blueprint is already built" do
403
403
  STDERR.expects(:puts).with("**WARNING** Building with options, but blueprint was already built: 'big_cherry'")
404
- STDERR.expects(:puts).with(regexp_matches(/^blueprints_spec\.rb:\d+$/))
404
+ STDERR.expects(:puts).with(regexp_matches(/blueprints_(spec|test)\.rb:\d+/))
405
405
  build :big_cherry => {:species => 'some species'}
406
406
  end
407
407
 
@@ -264,6 +264,11 @@ class BlueprintsTest < ActiveSupport::TestCase
264
264
  fruits = Fruit.blueprint([{:species => 'fruit1'}, {:species => 'fruit2'}])
265
265
  assert(fruits.collect(&:species) == %w{fruit1 fruit2})
266
266
  end
267
+
268
+ should "allow to build oak without attributes" do
269
+ build :oak_without_attributes
270
+ assert(@oak_without_attributes.instance_of?(Tree))
271
+ end
267
272
  end
268
273
 
269
274
  context "with pitted namespace" do
@@ -360,6 +365,11 @@ class BlueprintsTest < ActiveSupport::TestCase
360
365
  assert(@small_acorn == @acorn)
361
366
  end
362
367
 
368
+ should "not reset options after call to build" do
369
+ build :small_acorn => {:option => 'value'}
370
+ assert(@small_acorn_options == {:option => 'value'})
371
+ end
372
+
363
373
  should "allow to use shortcut to extend blueprint" do
364
374
  build :huge_acorn
365
375
  assert(@huge_acorn.average_diameter == 100)
@@ -369,6 +379,11 @@ class BlueprintsTest < ActiveSupport::TestCase
369
379
  build :huge_acorn
370
380
  assert(@huge_acorn.tree.size == 'huge')
371
381
  end
382
+
383
+ should "allow to pass options when building extended blueprint" do
384
+ build :huge_acorn => {:average_diameter => 200}
385
+ assert(@huge_acorn.average_diameter == 200)
386
+ end
372
387
  end
373
388
 
374
389
  should "allow to build! without checking if it was already built" do
@@ -378,13 +393,15 @@ class BlueprintsTest < ActiveSupport::TestCase
378
393
  end
379
394
 
380
395
  should "warn when blueprint with same name exists" do
381
- $stderr.expects(:puts).with("**WARNING** Overwriting existing blueprint: 'overwritten'")
396
+ STDERR.expects(:puts).with("**WARNING** Overwriting existing blueprint: 'overwritten'")
397
+ STDERR.expects(:puts).with(regexp_matches(/blueprints_(spec|test)\.rb:\d+:in `new'/))
382
398
  Blueprints::Plan.new(:overwritten)
383
399
  Blueprints::Plan.new(:overwritten)
384
400
  end
385
401
 
386
402
  should "warn when building with options and blueprint is already built" do
387
403
  STDERR.expects(:puts).with("**WARNING** Building with options, but blueprint was already built: 'big_cherry'")
404
+ STDERR.expects(:puts).with(regexp_matches(/blueprints_(spec|test)\.rb:\d+/))
388
405
  build :big_cherry => {:species => 'some species'}
389
406
  end
390
407
 
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: blueprints
3
3
  version: !ruby/object:Gem::Version
4
- hash: 3
4
+ hash: 1
5
5
  prerelease: false
6
6
  segments:
7
7
  - 0
8
8
  - 6
9
- - 2
10
- version: 0.6.2
9
+ - 3
10
+ version: 0.6.3
11
11
  platform: ruby
12
12
  authors:
13
13
  - Andrius Chamentauskas
@@ -51,8 +51,6 @@ files:
51
51
  - lib/blueprints/namespace.rb
52
52
  - lib/blueprints/plan.rb
53
53
  - lib/blueprints/root_namespace.rb
54
- - script/load_schema
55
- - script/rspec_to_test
56
54
  - spec/active_record/blueprint.rb
57
55
  - spec/active_record/blueprints_spec.rb
58
56
  - spec/active_record/fixtures/database.yml.example
data/script/load_schema DELETED
@@ -1,14 +0,0 @@
1
- #!/usr/bin/env ruby
2
-
3
- require 'rubygems'
4
- require 'active_record'
5
-
6
- Dir.chdir File.join(File.dirname(__FILE__), '..')
7
-
8
- ActiveRecord::Base.logger = Logger.new("debug.log")
9
-
10
- databases = YAML::load(IO.read("spec/active_record/fixtures/database.yml"))
11
- db_info = databases[ENV["DB"] || "test"]
12
- ActiveRecord::Base.establish_connection(db_info)
13
-
14
- load("spec/active_record/fixtures/schema.rb")
data/script/rspec_to_test DELETED
@@ -1,29 +0,0 @@
1
- #!/usr/bin/env ruby
2
- Dir.chdir File.join(File.dirname(__FILE__), '..')
3
- data = IO.read('spec/active_record/blueprints_spec.rb')
4
-
5
- data.gsub!("require File.dirname(__FILE__) + '/spec_helper'", "require File.dirname(__FILE__) + '/test_helper'")
6
- data.gsub!("describe Blueprints do", 'class BlueprintsTest < ActiveSupport::TestCase')
7
-
8
- # lambda {
9
- # hornsby_clear :undo => :just_orange
10
- # }.should raise_error(ArgumentError)
11
- data.gsub!(/(\s+)lambda \{\n(.*)\n(\s+)\}.should raise_error\((.*)\)/, "\\1assert_raise(\\4) do\n\\2\n\\3end")
12
- # should =~ => assert_similar
13
- data.gsub!(/^(\s+)(.*)\.should\s*=~\s*(.*)/, '\1assert_similar(\2, \3)')
14
-
15
- # .should_not => assert(!())
16
- data.gsub!(/^(\s+)(.*)\.should_not(.*)/, '\1assert(!(\2\3))')
17
- # .should => assert()
18
- data.gsub!(/^(\s+)(.*)\.should(.*)/, '\1assert(\2\3)')
19
- # be_nil => .nil?
20
- data.gsub!(/ be_([^\(\)]*)/, '.\1?')
21
- # have(2).items => .size == 2
22
- data.gsub!(/ have\((\d+)\)\.items/, '.size == \1')
23
-
24
- data.gsub!(/^(\s+)describe/, '\1context')
25
- data.gsub!(/^(\s+)it (["'])(should )?/, '\1should \2')
26
- data.gsub!(/^(\s+)before.*do/, '\1setup do')
27
- data.gsub!(/^(\s+)after.*do/, '\1teardown do')
28
-
29
- File.open('test/blueprints_test.rb', 'w') {|f| f.write(data)}