manufactory 0.0.1 → 0.0.2

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.
@@ -0,0 +1,11 @@
1
+ # encoding: utf-8
2
+
3
+ require_relative "spec_helper"
4
+ require "manufactory/adapters/object"
5
+
6
+ describe Manufactory do
7
+ Post = Struct.new(:title, :body, :published)
8
+ it "should play nice with just attributes, so it calls initialize without any arguments" do
9
+ Post.should_receive(:new).with(no_args)
10
+ end
11
+ end
@@ -0,0 +1,146 @@
1
+ require File.dirname(__FILE__) + '/spec_helper'
2
+ require 'manufactory/sequel'
3
+
4
+ # We have to define this here because Sequel needs a DB connection
5
+ # setup before you can define models
6
+ DB = Sequel.sqlite(:logger => Logger.new(File.dirname(__FILE__) + "/log/test.log"))
7
+
8
+ DB.create_table :people do
9
+ primary_key :id
10
+ String :name
11
+ String :type
12
+ String :password
13
+ Boolean :admin, :default => false
14
+ end
15
+
16
+ DB.create_table :posts do
17
+ primary_key :id
18
+ String :title
19
+ String :body
20
+ Boolean :published, :default => true
21
+ end
22
+
23
+ DB.create_table :comments do
24
+ primary_key :id
25
+ Integer :post_id
26
+ Integer :author_id
27
+ String :body
28
+ end
29
+
30
+ module ManufactorySequelSpecs
31
+
32
+ class Person < Sequel::Model
33
+ set_restricted_columns :password
34
+ end
35
+
36
+ class Post < Sequel::Model
37
+ one_to_many :comments, :class => "ManufactorySequelSpecs::Comment"
38
+ end
39
+
40
+ class Comment < Sequel::Model
41
+ many_to_one :post, :class => "ManufactorySequelSpecs::Post"
42
+ many_to_one :author, :class => "ManufactorySequelSpecs::Person"
43
+ end
44
+
45
+ describe Manufactory, "Sequel adapter" do
46
+
47
+ before(:each) do
48
+ Person.blueprints.clear
49
+ Post.blueprints.clear
50
+ Comment.blueprints.clear
51
+ end
52
+
53
+ describe "make method" do
54
+ it "should save the constructed object" do
55
+ Person.blueprint { }
56
+ person = Person.make
57
+ person.should_not be_new
58
+ end
59
+
60
+ it "should create and object through a many_to_one association" do
61
+ Post.blueprint { }
62
+ Comment.blueprint { post }
63
+ Comment.make.post.class.should == Post
64
+ end
65
+
66
+ it "should create an object through many_to_one association with a class_name attribute" do
67
+ Person.blueprint { }
68
+ Comment.blueprint { author }
69
+ Comment.make.author.class.should == Person
70
+ end
71
+
72
+ it "should allow setting a protected attribute in the blueprint" do
73
+ Person.blueprint do
74
+ password "Test"
75
+ end
76
+ Person.make.password.should == "Test"
77
+ end
78
+
79
+ it "should allow overriding a protected attribute" do
80
+ Person.blueprint do
81
+ password "Test"
82
+ end
83
+ Person.make(:password => "New").password.should == "New"
84
+ end
85
+
86
+ it "should allow setting the id attribute in a blueprint" do
87
+ Person.blueprint { id 12345 }
88
+ Person.make.id.should == 12345
89
+ end
90
+
91
+ # it "should allow setting the type attribute in a blueprint" do
92
+ # Person.blueprint { type "Person" }
93
+ # Person.make.type.should == "Person"
94
+ # end
95
+ end
96
+
97
+ describe "plan method" do
98
+ it "should not save the constructed object" do
99
+ lambda {
100
+ Person.blueprint { }
101
+ person = Person.plan
102
+ }.should_not change(Person,:count)
103
+ end
104
+
105
+ it "should return a regular attribute in the hash" do
106
+ Post.blueprint { title "Test" }
107
+ post = Post.plan
108
+ post[:title].should == "Test"
109
+ end
110
+
111
+ it "should create an object through a many_to_one association, and return its id" do
112
+ Post.blueprint { }
113
+ Comment.blueprint { post }
114
+ lambda {
115
+ comment = Comment.plan
116
+ comment[:post].should be_nil
117
+ comment[:post_id].should_not be_nil
118
+ }.should change(Post, :count).by(1)
119
+ end
120
+ end
121
+
122
+ # Note that building up an unsaved object graph using just the
123
+ # association methods is not possible in Sequel, so
124
+ # make_unsaved will break in amusing ways unless you manually
125
+ # override the setters.
126
+ #
127
+ # From sequel-talk "Sequel does not have such an API and will not be adding one"
128
+ # Feb 17
129
+ describe "make_unsaved method" do
130
+ it "should not save the constructed object" do
131
+ Person.blueprint { }
132
+ person = Person.make_unsaved
133
+ person.should be_new
134
+ end
135
+
136
+ it "should save objects made within a passed-in block" do
137
+ Post.blueprint { }
138
+ Comment.blueprint { }
139
+ comment = nil
140
+ post = Post.make_unsaved { comment = Comment.make }
141
+ post.should be_new
142
+ comment.should_not be_new
143
+ end
144
+ end
145
+ end
146
+ end
File without changes
@@ -1,9 +1,10 @@
1
1
  # encoding: utf-8
2
2
 
3
3
  require_relative "spec_helper"
4
- require "manufactory/adapters/object"
4
+ require "manufactory/adapters/generic_model"
5
5
 
6
- Post = HashStruct.new(:title, :body, :published)
6
+ HashStruct.extend(Manufactory::GenericModelMixin)
7
+ Post = HashStruct.generate(:title, :body, :published)
7
8
 
8
9
  describe Manufactory do
9
10
  before(:each) do
@@ -40,8 +41,102 @@ describe Manufactory do
40
41
  Post.make(:first).published.should be_true
41
42
  end
42
43
  end
44
+
45
+ describe "monkey patching" do
46
+ it "should " do
47
+ Post.blueprint { published true }
48
+ Post.blueprint { published false }
49
+ Post.make.published.should be_false
50
+ end
51
+ end
43
52
 
44
53
  it "should raise for make on a class with no blueprint" do
45
54
  lambda { Post.make }.should raise_error(RuntimeError)
46
55
  end
56
+
57
+ # it "should default to calling Sham for an attribute in the blueprint" do
58
+ # Sham.clear
59
+ # Sham.name { "Fred" }
60
+ # Person.blueprint { name }
61
+ # Person.make.name.should == "Fred"
62
+ # end
63
+ #
64
+ # it "should override an attribute from the blueprint with a passed-in attribute" do
65
+ # Person.blueprint do
66
+ # name "Fred"
67
+ # end
68
+ # Person.make(:name => "Bill").name.should == "Bill"
69
+ # end
70
+ #
71
+ # it "should allow overridden attribute names to be strings" do
72
+ # Person.blueprint do
73
+ # name "Fred"
74
+ # end
75
+ # Person.make("name" => "Bill").name.should == "Bill"
76
+ # end
77
+ #
78
+ # it "should not call a block in the blueprint if that attribute is passed in" do
79
+ # block_called = false
80
+ # Person.blueprint do
81
+ # name { block_called = true; "Fred" }
82
+ # end
83
+ # Person.make(:name => "Bill").name.should == "Bill"
84
+ # block_called.should be_false
85
+ # end
86
+ #
87
+ # it "should call a passed-in block with the object being constructed" do
88
+ # Person.blueprint { }
89
+ # block_called = false
90
+ # Person.make do |person|
91
+ # block_called = true
92
+ # person.class.should == Person
93
+ # end
94
+ # block_called.should be_true
95
+ # end
96
+ #
97
+ # it "should provide access to the object being constructed from within the blueprint" do
98
+ # person = nil
99
+ # Person.blueprint { person = object }
100
+ # Person.make
101
+ # person.class.should == Person
102
+ # end
103
+ #
104
+ # it "should allow reading of a previously assigned attribute from within the blueprint" do
105
+ # Post.blueprint do
106
+ # title "Test"
107
+ # body { title }
108
+ # end
109
+ # Post.make.body.should == "Test"
110
+ # end
111
+ #
112
+ # describe "blueprint inheritance" do
113
+ # it "should inherit blueprinted attributes from the parent class" do
114
+ # Dad.blueprint { name "Fred" }
115
+ # Son.blueprint { }
116
+ # Son.make.name.should == "Fred"
117
+ # end
118
+ #
119
+ # it "should override blueprinted attributes in the child class" do
120
+ # Dad.blueprint { name "Fred" }
121
+ # Son.blueprint { name "George" }
122
+ # Dad.make.name.should == "Fred"
123
+ # Son.make.name.should == "George"
124
+ # end
125
+ #
126
+ # it "should inherit from blueprinted attributes in ancestor class" do
127
+ # Grandpa.blueprint { name "Fred" }
128
+ # Son.blueprint { }
129
+ # Grandpa.make.name.should == "Fred"
130
+ # lambda { Dad.make }.should raise_error(RuntimeError)
131
+ # Son.make.name.should == "Fred"
132
+ # end
133
+ #
134
+ # it "should follow inheritance for named blueprints correctly" do
135
+ # Dad.blueprint { name "John" }
136
+ # Dad.blueprint(:special) { name "Paul" }
137
+ # Son.blueprint { }
138
+ # Son.blueprint(:special) { }
139
+ # Son.make(:special).name.should == "John"
140
+ # end
141
+ # end
47
142
  end
@@ -5,5 +5,5 @@ require "hash_struct"
5
5
  $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), "..", "lib"))
6
6
 
7
7
  Spec::Runner.configure do |config|
8
- config.before(:each) { Sham.reset }
8
+ config.before(:each) { Manufactory::Sham.reset }
9
9
  end
@@ -0,0 +1,20 @@
1
+ ActiveRecord::Schema.define(:version => 0) do
2
+ create_table :people, :force => true do |t|
3
+ t.column :name, :string
4
+ t.column :type, :string
5
+ t.column :password, :string
6
+ t.column :admin, :boolean, :default => false
7
+ end
8
+
9
+ create_table :posts, :force => true do |t|
10
+ t.column :title, :string
11
+ t.column :body, :text
12
+ t.column :published, :boolean, :default => true
13
+ end
14
+
15
+ create_table :comments, :force => true do |t|
16
+ t.column :post_id, :integer
17
+ t.column :author_id, :integer
18
+ t.column :body, :text
19
+ end
20
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: manufactory
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - "Jakub \xC5\xA0\xC5\xA5astn\xC3\xBD aka Botanicus"
@@ -30,13 +30,25 @@ extensions: []
30
30
  extra_rdoc_files: []
31
31
 
32
32
  files:
33
+ - lib/manufactory/adapters/activerecord.rb
33
34
  - lib/manufactory/adapters/datamapper.rb
35
+ - lib/manufactory/adapters/generic_model.rb
34
36
  - lib/manufactory/adapters/object.rb
37
+ - lib/manufactory/adapters/sequel.rb
38
+ - lib/manufactory/dsl.rb
35
39
  - lib/manufactory/sham.rb
36
40
  - lib/manufactory.rb
41
+ - spec/manufactory/adapters/activerecord_spec.rb
42
+ - spec/manufactory/adapters/datamapper_spec.rb
43
+ - spec/manufactory/adapters/generic_model_spec.rb
44
+ - spec/manufactory/adapters/log/test.log
45
+ - spec/manufactory/adapters/object_spec.rb
46
+ - spec/manufactory/adapters/sequel_spec.rb
47
+ - spec/manufactory/dsl_spec.rb
37
48
  - spec/manufactory/sham_spec.rb
38
49
  - spec/manufactory_spec.rb
39
50
  - spec/spec_helper.rb
51
+ - spec/stubs/db/schema.rb
40
52
  - CHANGELOG
41
53
  - LICENSE
42
54
  - Rakefile
@@ -68,6 +80,6 @@ rubyforge_project: manufactory
68
80
  rubygems_version: 1.3.5
69
81
  signing_key:
70
82
  specification_version: 3
71
- summary: Manufactory is a minimalistic and clean rewrite of machinist with some improvements.
83
+ summary: Manufactory is a minimalistic and clean rewrite of manufactory with some improvements.
72
84
  test_files: []
73
85