dr_nic_magic_models 0.8.1 → 0.9.0
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/History.txt +10 -0
- data/Manifest.txt +55 -0
- data/README +268 -0
- data/Rakefile +82 -107
- data/lib/base.rb +1 -5
- data/lib/dr_nic_magic_models.rb +4 -1
- data/lib/dr_nic_magic_models/inflector.rb +14 -0
- data/lib/dr_nic_magic_models/magic_model.rb +125 -0
- data/lib/dr_nic_magic_models/schema.rb +224 -196
- data/lib/dr_nic_magic_models/validations.rb +6 -6
- data/lib/dr_nic_magic_models/version.rb +2 -2
- data/lib/module.rb +33 -0
- data/scripts/txt2html +3 -2
- data/scripts/txt2js +3 -2
- data/test.db +0 -0
- data/test/abstract_unit.rb +4 -0
- data/test/connections/native_postgresql/connection.rb +0 -2
- data/test/connections/native_sqlite/connection.rb +10 -0
- data/test/fixtures/.DS_Store +0 -0
- data/test/fixtures/db_definitions/mysql.sql +0 -2
- data/test/fixtures/db_definitions/postgresql.sql +0 -1
- data/test/fixtures/db_definitions/sqlite.sql +49 -0
- data/test/invisible_model_access_test.rb +8 -2
- data/test/invisible_model_assoc_test.rb +17 -13
- data/test/magic_module_test.rb +20 -0
- data/website/index.html +283 -297
- data/website/index.txt +4 -16
- data/website/version-raw.js +1 -1
- data/website/version.js +1 -1
- metadata +53 -56
- data/scripts/http-access2-2.0.6.gem +0 -0
- data/scripts/rubyforge-orig +0 -217
- data/test/fixtures/db_definitions/postgresql.drop.sql +0 -4
data/History.txt
ADDED
@@ -0,0 +1,10 @@
|
|
1
|
+
*** 0.9.0 / 2007-4-9
|
2
|
+
|
3
|
+
+ 1 major enhancement:
|
4
|
+
+ Support for dynamic loading of classes again
|
5
|
+
+ 2 new DB supported:
|
6
|
+
+ Tests run on sqlite (no fk support)
|
7
|
+
+ Tests run on postgresql (fk support)
|
8
|
+
+ Many fixes that I've lost track of
|
9
|
+
+ History.txt to keep track of changes like these
|
10
|
+
+ Using Hoe for Rakefile
|
data/Manifest.txt
ADDED
@@ -0,0 +1,55 @@
|
|
1
|
+
CHANGELOG
|
2
|
+
History.txt
|
3
|
+
Manifest.txt
|
4
|
+
README
|
5
|
+
Rakefile
|
6
|
+
install.rb
|
7
|
+
lib/base.rb
|
8
|
+
lib/connection_adapters/abstract/schema_statements.rb
|
9
|
+
lib/connection_adapters/abstract_adapter.rb
|
10
|
+
lib/connection_adapters/mysql_adapter.rb
|
11
|
+
lib/connection_adapters/postgresql_adapter.rb
|
12
|
+
lib/dr_nic_magic_models.rb
|
13
|
+
lib/dr_nic_magic_models/inflector.rb
|
14
|
+
lib/dr_nic_magic_models/magic_model.rb
|
15
|
+
lib/dr_nic_magic_models/schema.rb
|
16
|
+
lib/dr_nic_magic_models/validations.rb
|
17
|
+
lib/dr_nic_magic_models/version.rb
|
18
|
+
lib/module.rb
|
19
|
+
lib/rails.rb
|
20
|
+
scripts/txt2html
|
21
|
+
scripts/txt2js
|
22
|
+
test.db
|
23
|
+
test/abstract_unit.rb
|
24
|
+
test/connections/native_mysql/connection.rb
|
25
|
+
test/connections/native_postgresql/connection.rb
|
26
|
+
test/connections/native_sqlite/connection.rb
|
27
|
+
test/dummy_test.rb
|
28
|
+
test/env_test.rb
|
29
|
+
test/fixtures/.DS_Store
|
30
|
+
test/fixtures/adjectives.yml
|
31
|
+
test/fixtures/adjectives_fun_users.yml
|
32
|
+
test/fixtures/db_definitions/mysql.drop.sql
|
33
|
+
test/fixtures/db_definitions/mysql.sql
|
34
|
+
test/fixtures/db_definitions/postgresql.sql
|
35
|
+
test/fixtures/db_definitions/sqlite.sql
|
36
|
+
test/fixtures/fun_users.yml
|
37
|
+
test/fixtures/group_memberships.yml
|
38
|
+
test/fixtures/group_tag.yml
|
39
|
+
test/fixtures/groups.yml
|
40
|
+
test/foreign_keys_test.rb
|
41
|
+
test/fun_user_plus.rb
|
42
|
+
test/invisible_model_access_test.rb
|
43
|
+
test/invisible_model_assoc_test.rb
|
44
|
+
test/invisible_model_classes_test.rb
|
45
|
+
test/magic_module_test.rb
|
46
|
+
website/index.html
|
47
|
+
website/index.txt
|
48
|
+
website/javascripts/rounded_corners_lite.inc.js
|
49
|
+
website/stylesheets/screen.css
|
50
|
+
website/template.js
|
51
|
+
website/template.rhtml
|
52
|
+
website/version-raw.js
|
53
|
+
website/version-raw.txt
|
54
|
+
website/version.js
|
55
|
+
website/version.txt
|
data/README
CHANGED
@@ -0,0 +1,268 @@
|
|
1
|
+
See http://magicmodels.rubyforge.org/dr_nic_magic_models for pretty README
|
2
|
+
|
3
|
+
Ugly README (from website/index.txt in Textile format):
|
4
|
+
|
5
|
+
h1. Dr Nic's Magic Models
|
6
|
+
|
7
|
+
If you've used Ruby on Rails you'll have written at least one model class like this:
|
8
|
+
|
9
|
+
<pre syntax='ruby'>
|
10
|
+
class Person < ActiveRecord::Base
|
11
|
+
has_many :memberships
|
12
|
+
has_many :groups, :through => :memberships
|
13
|
+
belongs_to :family
|
14
|
+
validates_presence_of :firstname, :lastname, :email
|
15
|
+
end
|
16
|
+
</pre>
|
17
|
+
|
18
|
+
A few minutes later you'll have wondered to yourself,
|
19
|
+
|
20
|
+
<blockquote>
|
21
|
+
Why do I have write my own <code>has_many</code>, <code>belongs_to</code>, and <code>validates_presence_of</code>
|
22
|
+
commands if all the data is in the database schema?
|
23
|
+
</blockquote>
|
24
|
+
|
25
|
+
Now, for the very first time, your classes can look like this:
|
26
|
+
|
27
|
+
<pre syntax='ruby'>
|
28
|
+
class Person < ActiveRecord::Base
|
29
|
+
end
|
30
|
+
</pre>
|
31
|
+
|
32
|
+
or, if you are lazy...
|
33
|
+
|
34
|
+
<pre syntax='ruby'>
|
35
|
+
class Person < ActiveRecord::Base; end
|
36
|
+
</pre>
|
37
|
+
|
38
|
+
or, if you read right to the end of this page, this...
|
39
|
+
|
40
|
+
<pre syntax='ruby'>
|
41
|
+
# Go fish.
|
42
|
+
</pre>
|
43
|
+
|
44
|
+
Magic and mystery abound. All for you. Impress your friends, amaze your mother.
|
45
|
+
|
46
|
+
NOTE: The gratuitous use of *Dr Nic's* in the name should only enhance the mystical magikery,
|
47
|
+
for magic needs a magician; and I love magic. I always wanted to create my own magic trick.
|
48
|
+
So I shall be the magician for the sake of magic itself. I look a bit like Harry Potter too,
|
49
|
+
if Harry were 32 and better dressed.
|
50
|
+
|
51
|
+
h2. Installation
|
52
|
+
|
53
|
+
To install the Dr Nic's Magic Models gem you can run the following command to
|
54
|
+
fetch the gem remotely from RubyForge:
|
55
|
+
<pre>
|
56
|
+
gem install dr_nic_magic_models
|
57
|
+
</pre>
|
58
|
+
|
59
|
+
or "download the gem manually":http://rubyforge.org/projects/magicmodels and
|
60
|
+
run the above command in the download directory.
|
61
|
+
|
62
|
+
Now you need to <code>require</code> the gem into your Ruby/Rails app. Insert the following
|
63
|
+
line into your script (use <code>config/environment.rb</code> for your Rails apps):
|
64
|
+
|
65
|
+
<pre>
|
66
|
+
require 'dr_nic_magic_models'
|
67
|
+
</pre>
|
68
|
+
|
69
|
+
Your application is now blessed with magical mystery.
|
70
|
+
|
71
|
+
h2. David Copperfield eat your Ruby-crusted heart out
|
72
|
+
|
73
|
+
Let's demonstrate the magical mystery in all its full-stage glory. Create a Ruby on Rails app:
|
74
|
+
|
75
|
+
<pre syntax="ruby">
|
76
|
+
rails magic_show
|
77
|
+
cd magic_show
|
78
|
+
ruby script/generate model Person
|
79
|
+
ruby script/generate model Group
|
80
|
+
ruby script/generate model Membership
|
81
|
+
</pre>
|
82
|
+
|
83
|
+
Update the migration <code>001_create_people.rb</code> with:
|
84
|
+
<pre syntax="ruby">
|
85
|
+
class CreatePeople < ActiveRecord::Migration
|
86
|
+
def self.up
|
87
|
+
create_table :people do |t|
|
88
|
+
t.column :firstname, :string, :null => false
|
89
|
+
t.column :lastname, :string, :null => false
|
90
|
+
t.column :email, :string, :null => false
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
def self.down
|
95
|
+
drop_table :people
|
96
|
+
end
|
97
|
+
end
|
98
|
+
</pre>
|
99
|
+
|
100
|
+
Similarly, update the <code>def self.up</code> method of <code>002_create_groups.rb</code>
|
101
|
+
with:
|
102
|
+
<pre syntax="ruby">
|
103
|
+
create_table :groups do |t|
|
104
|
+
t.column :name, :string, :null => false
|
105
|
+
t.column :description, :string
|
106
|
+
end
|
107
|
+
</pre>
|
108
|
+
|
109
|
+
and <code>003_create_memberships.rb</code> with:
|
110
|
+
<pre syntax="ruby">
|
111
|
+
create_table :memberships do |t|
|
112
|
+
t.column :person_id, :integer, :null => false
|
113
|
+
t.column :group_id, :integer, :null => false
|
114
|
+
end
|
115
|
+
</pre>
|
116
|
+
|
117
|
+
Now create your database. For MySql:
|
118
|
+
<pre>
|
119
|
+
mysqladmin -u root create magic_show_development
|
120
|
+
mysqladmin -u root create magic_show_test
|
121
|
+
</pre>
|
122
|
+
|
123
|
+
And run your migrations to create the three tables:
|
124
|
+
<pre>
|
125
|
+
rake migrate
|
126
|
+
</pre>
|
127
|
+
|
128
|
+
h2. And now for some "woofle dust":http://en.wikipedia.org/wiki/List_of_conjuring_terms ...
|
129
|
+
|
130
|
+
At the end of <code>config/environment.rb</code> add the following line:
|
131
|
+
|
132
|
+
<pre>
|
133
|
+
require 'dr_nic_magic_models'
|
134
|
+
</pre>
|
135
|
+
|
136
|
+
Now, let's do a magic trick. First, let's check our model classes (<code>app/models/person.rb</code> etc):
|
137
|
+
|
138
|
+
<pre syntax="ruby">
|
139
|
+
class Person < ActiveRecord::Base
|
140
|
+
end
|
141
|
+
class Group < ActiveRecord::Base
|
142
|
+
end
|
143
|
+
class Membership < ActiveRecord::Base
|
144
|
+
end
|
145
|
+
</pre>
|
146
|
+
|
147
|
+
Nothing suspicious here. We have no validations and no associations. Just some plain old model classes.
|
148
|
+
|
149
|
+
For this trick, we'll need an ordinary console session. Any old one lying around the house will do.
|
150
|
+
|
151
|
+
<pre>
|
152
|
+
ruby script/console
|
153
|
+
</pre>
|
154
|
+
|
155
|
+
Now a normal model class is valid until you explicitly add <code>validates_xxx</code> commands.
|
156
|
+
With Dr Nic's Magic Models:
|
157
|
+
|
158
|
+
<pre syntax="ruby">
|
159
|
+
>> person = Person.new
|
160
|
+
=> #<Person:0x393e0f8 @attributes={"lastname"=>"", "firstname"=>"", "email"=>""}, @new_record=true>
|
161
|
+
>> person.valid?
|
162
|
+
=> false
|
163
|
+
>> person.errors
|
164
|
+
=> <ActiveRecord::Errors:0x3938b18 @errors={"firstname"=>["can't be blank"],
|
165
|
+
"lastname"=>["can't be blank"], "email"=>["can't be blank"]},
|
166
|
+
@base=<Person:0x393e0f8 @errors=<ActiveRecord::Errors:0x3938b18 ...>,
|
167
|
+
@attributes={"lastname"=>"", "firstname"=>"", "email"=>""}, @new_record=true>>
|
168
|
+
</pre>
|
169
|
+
|
170
|
+
*Kapoow!* Instant validation!
|
171
|
+
|
172
|
+
Because you specified the three columns as <code>:null => false</code>,
|
173
|
+
your ActiveRecord models will now automatically generated <code>validates_presence_of</code>
|
174
|
+
for each non-null field.
|
175
|
+
|
176
|
+
Ok, we're just warming up.
|
177
|
+
|
178
|
+
Your models normally require association commands (<code>has_many</code>, <code>belongs_to</code>, etc, as
|
179
|
+
demonstrated above) to have the brilliantly simple support that Rails/ActiveRecords are known for.
|
180
|
+
|
181
|
+
Let's just watch what Dr Nic's Magic Models can do without any effort at all...
|
182
|
+
|
183
|
+
<pre syntax="ruby">
|
184
|
+
>> person = Person.create(:firstname => "Nic", :lastname => "Williams", :email => "drnicwilliams@gmail.com")
|
185
|
+
>> group = Group.create(:name => "Magic Models Forum", :description => "http://groups.google.com/magicmodels")
|
186
|
+
>> membership = Membership.create(:person_id => person, :group_id => group)
|
187
|
+
>> person.memberships.length
|
188
|
+
=> 1
|
189
|
+
>> membership.person
|
190
|
+
=> <Person:0x38898e8 @attributes={"lastname"=>"Williams", "firstname"=>"Nic",
|
191
|
+
"id"=>"1", "email"=>"drnicwilliams@gmail.com"}>
|
192
|
+
>> group.memberships
|
193
|
+
=> [<Membership:0x3c8cd70 @attributes={"group_id"=>"1", "id"=>"1", "person_id"=>"1"}>]
|
194
|
+
</pre>
|
195
|
+
|
196
|
+
|
197
|
+
The final association trick is a ripper. Automatic generation of <code>has_many :through</code> associations...
|
198
|
+
|
199
|
+
<pre syntax="ruby">
|
200
|
+
>> person.groups
|
201
|
+
=> [<Group:0x39047e0 @attributes={"name"=>"Magic Models Forum", "id"=>"1", "description"=>nil}>]
|
202
|
+
>> group.people
|
203
|
+
=> [<Person:0x3c33580 @attributes={"lastname"=>"Williams", "firstname"=>"Nic",
|
204
|
+
"id"=>"1", "email"=>"drnicwilliams@gmail.com"}>]
|
205
|
+
</pre>
|
206
|
+
|
207
|
+
h2. Drum roll...
|
208
|
+
|
209
|
+
Ladies and gentlemen. For my final feat of magical mastery, I'll ask you to do
|
210
|
+
something you've never done before. This illusion is akin to the "floating lady":http://www.toytent.com/Posters/985.html
|
211
|
+
illusion that has been passed down through generations of magicians.
|
212
|
+
|
213
|
+
Exit your console session.
|
214
|
+
|
215
|
+
DELETE your three model classes: <code>person.rb, group.rb, and membership.rb</code> from the
|
216
|
+
<code>app/models</code> folder. (You can always get them back via the model generator... be fearless!)
|
217
|
+
|
218
|
+
Re-launch your console.
|
219
|
+
|
220
|
+
*drums are still rolling...*
|
221
|
+
|
222
|
+
Be prepared to applaud loudly...
|
223
|
+
|
224
|
+
<pre syntax="ruby">
|
225
|
+
>> Person
|
226
|
+
=> Person
|
227
|
+
</pre>
|
228
|
+
|
229
|
+
You applaud loudly, but watch for more...
|
230
|
+
|
231
|
+
<pre syntax="ruby">
|
232
|
+
>> person = Person.find(1)
|
233
|
+
=> <Person:0x3958930 @attributes={"lastname"=>"Williams", "firstname"=>"Nic",
|
234
|
+
"id"=>"1", "email"=>"drnicwilliams@gmail.com"}>
|
235
|
+
>> person.memberships
|
236
|
+
=> [<Membership:0x393a000 @attributes={"group_id"=>"1", "id"=>"1", "person_id"=>"1"}>]
|
237
|
+
>> person.groups
|
238
|
+
=> [<Group:0x390df60 @attributes={"name"=>"Magic Models Forum", "id"=>"1", "description"=>nil}>]
|
239
|
+
</pre>
|
240
|
+
|
241
|
+
h2. Tada!
|
242
|
+
|
243
|
+
The end.
|
244
|
+
|
245
|
+
h2. Dr Nic's Blog
|
246
|
+
|
247
|
+
"http://www.drnicwilliams.com":http://www.drnicwilliams.com - for future announcements and
|
248
|
+
other stories and things.
|
249
|
+
|
250
|
+
h2. Articles about Magic Models
|
251
|
+
|
252
|
+
* "Announcement":http://drnicwilliams.com/2006/08/07/ann-dr-nics-magic-models/
|
253
|
+
* "BTS - Class creation":http://drnicwilliams.com/2006/08/10/bts-magic-models-class-creation/
|
254
|
+
|
255
|
+
|
256
|
+
h2. Forum
|
257
|
+
|
258
|
+
"http://groups.google.com/group/magicmodels":http://groups.google.com/group/magicmodels
|
259
|
+
|
260
|
+
h2. Licence
|
261
|
+
|
262
|
+
This code is free to use under the terms of the MIT licence.
|
263
|
+
|
264
|
+
h2. Contact
|
265
|
+
|
266
|
+
Comments are welcome. Send an email to "Dr Nic Williams":mailto:drnicwilliams@gmail.com
|
267
|
+
or via his blog at "http://www.drnicwilliams.com":http://www.drnicwilliams.com
|
268
|
+
|
data/Rakefile
CHANGED
@@ -1,34 +1,60 @@
|
|
1
1
|
require 'rubygems'
|
2
2
|
require 'rake'
|
3
|
+
require 'rake/clean'
|
3
4
|
require 'rake/testtask'
|
4
5
|
require 'rake/rdoctask'
|
5
6
|
require 'rake/packagetask'
|
6
7
|
require 'rake/gempackagetask'
|
7
8
|
require 'rake/contrib/rubyforgepublisher'
|
9
|
+
require 'hoe'
|
8
10
|
require File.join(File.dirname(__FILE__), 'lib', 'dr_nic_magic_models', 'version')
|
9
11
|
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
12
|
+
AUTHOR = "nicwilliams" # can also be an array of Authors
|
13
|
+
EMAIL = "drnicwilliams@gmail.com"
|
14
|
+
DESCRIPTION = "Dr Nic's Magic Models - Invisible validations, assocations and Active Record models themselves!"
|
15
|
+
GEM_NAME = "dr_nic_magic_models" # what ppl will type to install your gem
|
16
|
+
RUBYFORGE_PROJECT = "magicmodels" # The unix name for your project
|
17
|
+
HOMEPATH = "http://#{RUBYFORGE_PROJECT}.rubyforge.org"
|
18
|
+
|
19
|
+
|
20
|
+
NAME = "magic_multi_connections"
|
21
|
+
REV = nil # UNCOMMENT IF REQUIRED: File.read(".svn/entries")[/committed-rev="(d+)"/, 1] rescue nil
|
22
|
+
VERS = ENV['VERSION'] || (DrNicMagicModels::VERSION::STRING + (REV ? ".#{REV}" : ""))
|
23
|
+
CLEAN.include ['**/.*.sw?', '*.gem', '.config']
|
24
|
+
RDOC_OPTS = ['--quiet', '--title', "dr_nic_magic_models documentation",
|
25
|
+
"--opname", "index.html",
|
26
|
+
"--line-numbers",
|
27
|
+
"--main", "README",
|
28
|
+
"--inline-source"]
|
29
|
+
|
30
|
+
class Hoe
|
31
|
+
def extra_deps
|
32
|
+
@extra_deps.reject { |x| Array(x).first == 'hoe' }
|
33
|
+
end
|
34
|
+
end
|
24
35
|
|
25
|
-
|
26
|
-
|
27
|
-
|
36
|
+
# Generate all the Rake tasks
|
37
|
+
# Run 'rake -T' to see list of generated tasks (from gem root directory)
|
38
|
+
hoe = Hoe.new(GEM_NAME, VERS) do |p|
|
39
|
+
p.author = AUTHOR
|
40
|
+
p.description = DESCRIPTION
|
41
|
+
p.email = EMAIL
|
42
|
+
p.summary = DESCRIPTION
|
43
|
+
p.url = HOMEPATH
|
44
|
+
p.rubyforge_name = RUBYFORGE_PROJECT if RUBYFORGE_PROJECT
|
45
|
+
p.test_globs = ["test/**/test_*.rb"]
|
46
|
+
p.clean_globs = CLEAN #An array of file patterns to delete on clean.
|
47
|
+
|
48
|
+
# == Optional
|
49
|
+
p.changes = p.paragraphs_of("History.txt", 0..1).join("\n\n")
|
50
|
+
|
51
|
+
#p.extra_deps - An array of rubygem dependencies.
|
52
|
+
#p.spec_extras - A hash of extra values to set in the gemspec.
|
53
|
+
end
|
28
54
|
|
29
55
|
# Run the unit tests
|
30
56
|
|
31
|
-
for adapter in %w( mysql postgresql ) # UNTESTED - postgresql sqlite sqlite3 firebird sqlserver sqlserver_odbc db2 oracle sybase openbase )
|
57
|
+
for adapter in %w( sqlite mysql postgresql ) # UNTESTED - postgresql sqlite sqlite3 firebird sqlserver sqlserver_odbc db2 oracle sybase openbase )
|
32
58
|
Rake::TestTask.new("test_#{adapter}") { |t|
|
33
59
|
t.libs << "test" << "test/connections/native_#{adapter}"
|
34
60
|
t.pattern = "test/*_test{,_#{adapter}}.rb"
|
@@ -41,119 +67,68 @@ SCHEMA_PATH = File.join(File.dirname(__FILE__), *%w(test fixtures db_definitions
|
|
41
67
|
desc 'Build the MySQL test databases'
|
42
68
|
task :build_mysql_databases do
|
43
69
|
puts File.join(SCHEMA_PATH, 'mysql.sql')
|
44
|
-
%x( mysqladmin -u root create "#{
|
45
|
-
cmd = "mysql -u root #{
|
70
|
+
%x( mysqladmin -u root create "#{GEM_NAME}_unittest" )
|
71
|
+
cmd = "mysql -u root #{GEM_NAME}_unittest < \"#{File.join(SCHEMA_PATH, 'mysql.sql')}\""
|
46
72
|
puts "#{cmd}\n"
|
47
73
|
%x( #{cmd} )
|
48
74
|
end
|
49
75
|
|
50
76
|
desc 'Drop the MySQL test databases'
|
51
77
|
task :drop_mysql_databases do
|
52
|
-
%x( mysqladmin -u root -f drop "#{
|
78
|
+
%x( mysqladmin -u root -f drop "#{GEM_NAME}_unittest" )
|
53
79
|
end
|
54
80
|
|
55
81
|
desc 'Rebuild the MySQL test databases'
|
56
82
|
task :rebuild_mysql_databases => [:drop_mysql_databases, :build_mysql_databases]
|
57
83
|
|
84
|
+
desc 'Build the sqlite test databases'
|
85
|
+
task :build_sqlite_databases do
|
86
|
+
# puts File.join(SCHEMA_PATH, 'sqlite.sql')
|
87
|
+
# %x( sqlite3 test.db < test/fixtures/db_definitions/sqlite.sql )
|
88
|
+
file = File.join(SCHEMA_PATH, 'sqlite.sql')
|
89
|
+
cmd = "sqlite3 test.db < #{file}"
|
90
|
+
puts cmd
|
91
|
+
%x( #{cmd} )
|
92
|
+
end
|
93
|
+
|
94
|
+
desc 'Drop the sqlite test databases'
|
95
|
+
task :drop_sqlite_databases do
|
96
|
+
%x( rm -f test.db )
|
97
|
+
end
|
98
|
+
|
99
|
+
desc 'Rebuild the sqlite test databases'
|
100
|
+
task :rebuild_sqlite_databases => [:drop_sqlite_databases, :build_sqlite_databases]
|
101
|
+
|
58
102
|
desc 'Build the PostgreSQL test databases'
|
59
103
|
task :build_postgresql_databases do
|
60
|
-
%x( createdb
|
61
|
-
%x( psql "#{
|
104
|
+
%x( createdb "#{GEM_NAME}_unittest" )
|
105
|
+
%x( psql "#{GEM_NAME}_unittest" -f "#{File.join(SCHEMA_PATH, 'postgresql.sql')}" )
|
62
106
|
end
|
63
107
|
|
64
108
|
desc 'Drop the PostgreSQL test databases'
|
65
109
|
task :drop_postgresql_databases do
|
66
|
-
%x( dropdb
|
110
|
+
%x( dropdb "#{GEM_NAME}_unittest" )
|
67
111
|
end
|
68
112
|
|
69
113
|
desc 'Rebuild the PostgreSQL test databases'
|
70
114
|
task :rebuild_postgresql_databases => [:drop_postgresql_databases, :build_postgresql_databases]
|
71
115
|
|
72
|
-
# Generate the RDoc documentation
|
73
|
-
|
74
|
-
Rake::RDocTask.new { |rdoc|
|
75
|
-
rdoc.rdoc_dir = 'doc'
|
76
|
-
rdoc.title = "Dr Nic's Magic Models - Invisible validations, assocations and Active Record models themselves!"
|
77
|
-
rdoc.options << '--line-numbers' << '--inline-source' << '-A cattr_accessor=object'
|
78
|
-
rdoc.template = "#{ENV['template']}.rb" if ENV['template']
|
79
|
-
rdoc.rdoc_files.include('README', 'CHANGELOG')
|
80
|
-
rdoc.rdoc_files.include('lib/**/*.rb')
|
81
|
-
}
|
82
116
|
|
83
|
-
|
84
|
-
task :
|
85
|
-
|
117
|
+
desc 'Generate website files'
|
118
|
+
task :website_generate do
|
119
|
+
sh %{ ruby scripts/txt2html website/index.txt > website/index.html }
|
120
|
+
sh %{ ruby scripts/txt2js website/version.txt > website/version.js }
|
121
|
+
sh %{ ruby scripts/txt2js website/version-raw.txt > website/version-raw.js }
|
86
122
|
end
|
87
123
|
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
s.version = PKG_VERSION
|
96
|
-
s.summary = "Invisible validations, assocations and Active Record models themselves!"
|
97
|
-
s.description = %q{Associations and validations are automagically available to your ActiveRecord models. Model classes themselves are automagically generated if you haven't defined them already!}
|
98
|
-
|
99
|
-
s.files = [ "Rakefile", "install.rb", "README", "CHANGELOG" ]
|
100
|
-
dist_dirs.each do |dir|
|
101
|
-
s.files = s.files + Dir.glob( "#{dir}/**/*" ).delete_if { |item| item.include?( "\.svn" ) }
|
102
|
-
end
|
103
|
-
|
104
|
-
s.require_path = 'lib'
|
105
|
-
s.autorequire = 'dr_nic_magic_models'
|
106
|
-
|
107
|
-
s.has_rdoc = true
|
108
|
-
s.extra_rdoc_files = %w( README )
|
109
|
-
s.rdoc_options.concat ['--main', 'README']
|
110
|
-
|
111
|
-
s.author = "Dr Nic Williams"
|
112
|
-
s.email = "drnicwilliams@gmail.com"
|
113
|
-
s.homepage = "http://magicmodels.rubyforge.org"
|
114
|
-
s.rubyforge_project = "magicmodels"
|
124
|
+
desc 'Upload website files to rubyforge'
|
125
|
+
task :website_upload do
|
126
|
+
config = YAML.load(File.read(File.expand_path("~/.rubyforge/user-config.yml")))
|
127
|
+
host = "#{config["username"]}@rubyforge.org"
|
128
|
+
remote_dir = "/var/www/gforge-projects/#{RUBYFORGE_PROJECT}/#{GEM_NAME}"
|
129
|
+
local_dir = 'website'
|
130
|
+
sh %{rsync -av --delete #{local_dir}/ #{host}:#{remote_dir}}
|
115
131
|
end
|
116
|
-
|
117
|
-
Rake::GemPackageTask.new(spec) do |p|
|
118
|
-
p.gem_spec = spec
|
119
|
-
p.need_tar = false
|
120
|
-
p.need_zip = false
|
121
|
-
end
|
122
|
-
|
123
|
-
task :lines do
|
124
|
-
lines, codelines, total_lines, total_codelines = 0, 0, 0, 0
|
125
|
-
|
126
|
-
for file_name in FileList["lib/**/*.rb"]
|
127
|
-
next if file_name =~ /vendor/
|
128
|
-
f = File.open(file_name)
|
129
|
-
|
130
|
-
while line = f.gets
|
131
|
-
lines += 1
|
132
|
-
next if line =~ /^\s*$/
|
133
|
-
next if line =~ /^\s*#/
|
134
|
-
codelines += 1
|
135
|
-
end
|
136
|
-
puts "L: #{sprintf("%4d", lines)}, LOC #{sprintf("%4d", codelines)} | #{file_name}"
|
137
|
-
|
138
|
-
total_lines += lines
|
139
|
-
total_codelines += codelines
|
140
|
-
|
141
|
-
lines, codelines = 0, 0
|
142
|
-
end
|
143
|
-
|
144
|
-
puts "Total: Lines #{total_lines}, LOC #{total_codelines}"
|
145
|
-
end
|
146
|
-
|
147
132
|
|
148
|
-
|
149
|
-
|
150
|
-
desc "Publish the release files to RubyForge."
|
151
|
-
task :release => [ :package ] do
|
152
|
-
`ruby scripts/rubyforge login`
|
153
|
-
|
154
|
-
for ext in %w( gem tgz zip )
|
155
|
-
release_command = "ruby scripts/rubyforge add_release #{PKG_NAME} #{PKG_NAME} 'REL #{PKG_VERSION}' pkg/#{PKG_NAME}-#{PKG_VERSION}.#{ext}"
|
156
|
-
puts release_command
|
157
|
-
system(release_command)
|
158
|
-
end
|
159
|
-
end
|
133
|
+
desc 'Generate and upload website files'
|
134
|
+
task :website => [:website_generate, :website_upload]
|