dr_nic_magic_models 0.7.0 → 0.7.1

Sign up to get free protection for your applications and to get access to all the features.
data/Rakefile CHANGED
@@ -86,7 +86,7 @@ end
86
86
 
87
87
  # Create compressed packages
88
88
 
89
- dist_dirs = [ "lib", "test", "examples", "website" ]
89
+ dist_dirs = [ "lib", "test", "examples", "website", "scripts"]
90
90
 
91
91
  spec = Gem::Specification.new do |s|
92
92
  s.name = PKG_NAME
@@ -99,7 +99,7 @@ spec = Gem::Specification.new do |s|
99
99
  s.files = s.files + Dir.glob( "#{dir}/**/*" ).delete_if { |item| item.include?( "\.svn" ) }
100
100
  end
101
101
 
102
- s.add_dependency('activerecord', '= 1.14.3' + PKG_BUILD)
102
+ s.add_dependency('activerecord', '>= 1.14.3' + PKG_BUILD)
103
103
 
104
104
  s.require_path = 'lib'
105
105
  s.autorequire = 'dr_nic_magic_models'
@@ -2,7 +2,7 @@ module DrNicMagicModels #:nodoc:
2
2
  module VERSION #:nodoc:
3
3
  MAJOR = 0
4
4
  MINOR = 7
5
- TINY = 0
5
+ TINY = 1
6
6
 
7
7
  STRING = [MAJOR, MINOR, TINY].join('.')
8
8
  end
Binary file
@@ -0,0 +1,217 @@
1
+ #!/usr/bin/env ruby
2
+ #
3
+ # RENAME THIS to rubyorge, and change username/password below to your rubyforge details.
4
+ # Set rubyforge file to Ignore on Subversion.
5
+ # libs
6
+ #
7
+ $VERBOSE = nil
8
+ require "getoptlong"
9
+ require "enumerator"
10
+ require "http-access2"
11
+ #
12
+ # config
13
+ #
14
+ config = {
15
+ "username" => "username", # this must be your username
16
+ "password" => "password", # this must be your password
17
+
18
+ "group_id" => 1953, # see source of http://rubyforge.org/frs/admin/qrs.php?package=&group_id=1953
19
+
20
+ "package_ids" => { # configure shortcuts for your packages here
21
+ "compositekeys" => 2327,
22
+ },
23
+
24
+ "uri" => "http://rubyforge.org",
25
+ "cookie_jar" => File::join(File::expand_path("~"), ".rubyforge.cookie_jar"),
26
+ }
27
+
28
+ opts =
29
+ GetoptLong::new(
30
+ [ "--username" , "-u" , GetoptLong::REQUIRED_ARGUMENT ] ,
31
+ [ "--password" , "-p" , GetoptLong::REQUIRED_ARGUMENT ] ,
32
+ [ "--cookie_jar" , "-c" , GetoptLong::REQUIRED_ARGUMENT ]
33
+ ).enum_for.inject({}){|h,kv| h.update Hash[*kv]}
34
+
35
+ username = opts['username'] || config['username']
36
+ password = opts['password'] || config['password']
37
+ cookie_jar = opts["cookie_jar"] || config['cookie_jar']
38
+ #
39
+ # setup
40
+ #
41
+ mode = ARGV.shift
42
+ abort "#{ $0 } [login|create_package (package_name)|add_package (package_id release_name release.ext)]" unless mode
43
+
44
+ page, form, method = nil
45
+ extheader = {}
46
+
47
+ case mode
48
+
49
+ when %r/login/
50
+ page = "/account/login.php"
51
+ method = "post_content"
52
+
53
+ form = {
54
+ "return_to" => "",
55
+ "form_loginname" => username,
56
+ "form_pw" => password,
57
+ "login" => "Login"
58
+ }
59
+
60
+ when %r/create_package/
61
+ page = "/frs/admin/index.php"
62
+ method = "post_content"
63
+
64
+ opts =
65
+ GetoptLong::new(
66
+ [ "--group_id" , "-g" , GetoptLong::REQUIRED_ARGUMENT ] ,
67
+ [ "--is_private" , "-P" , GetoptLong::REQUIRED_ARGUMENT ]
68
+ ).enum_for.inject({}){|h,kv| h.update Hash[*kv]}
69
+
70
+ package_name = ARGV.shift
71
+ abort "#{ $0 } package_name" unless package_name
72
+
73
+ group_id = opts["group_id"] || config["group_id"]
74
+ is_public = opts["is_private"] ? 0 : 1
75
+
76
+ form = {
77
+ "group_id" => group_id,
78
+ "package_name" => package_name,
79
+ "func" => "add_package",
80
+ "is_public" => is_public,
81
+ "submit" => "Create This Package",
82
+ }
83
+
84
+ when %r/add_release/
85
+ page = "/frs/admin/qrs.php"
86
+ method = "post_content"
87
+
88
+ opts =
89
+ GetoptLong::new(
90
+ [ "--group_id" , "-g" , GetoptLong::REQUIRED_ARGUMENT ] ,
91
+ [ "--release_date" , "-r" , GetoptLong::REQUIRED_ARGUMENT ] ,
92
+ [ "--type_id" , "-t" , GetoptLong::REQUIRED_ARGUMENT ] ,
93
+ [ "--processor_id" , "-P" , GetoptLong::REQUIRED_ARGUMENT ] ,
94
+ [ "--release_nots" , "-n" , GetoptLong::REQUIRED_ARGUMENT ] ,
95
+ [ "--release_changes" , "-a" , GetoptLong::REQUIRED_ARGUMENT ]
96
+ ).enum_for.inject({}){|h,kv| h.update Hash[*kv]}
97
+
98
+ package_id, release_name, userfile, ignored = ARGV
99
+ abort "#{ $0 } package_name" unless
100
+ package_id and release_name and userfile
101
+
102
+ package_id = config["package_ids"][package_id] unless
103
+ package_id =~ %r/^\d+$/
104
+
105
+ group_id = opts["group_id"] || config["group_id"]
106
+ release_date = opts["release_date"] || Time::now.strftime('%Y-%m-%d %H:%M')
107
+
108
+ type_id = opts['type_id'] || userfile[%r|\.[^\./]+$|]
109
+ type_id = {
110
+ ".deb" => 1000,
111
+ ".rpm" => 2000,
112
+ ".zip" => 3000,
113
+ ".bz2" => 3100,
114
+ ".gz" => 3110,
115
+ ".src.zip" => 5000,
116
+ ".src.bz2" => 5010,
117
+ ".src.gz" => 5020,
118
+ ".src.rpm" => 5100,
119
+ ".src" => 5900,
120
+ ".jpg" => 8000,
121
+ ".txt" => 8100,
122
+ ".text" => 8100,
123
+ ".htm" => 8200,
124
+ ".html" => 8200,
125
+ ".pdf" => 8300,
126
+ ".oth" => 9999,
127
+ ".ebuild" => 1300,
128
+ ".exe" => 1100,
129
+ ".dmg" => 1200,
130
+ ".tar.gz" => 5000,
131
+ ".tgz" => 5000,
132
+ ".gem" => 1400,
133
+ ".pgp" => 8150,
134
+ ".sig" => 8150,
135
+ }[type_id]
136
+
137
+ processor_id = opts['processor_id'] || 'Any'
138
+ processor_id = {
139
+ "i386" => 1000,
140
+ "IA64" => 6000,
141
+ "Alpha" => 7000,
142
+ "Any" => 8000,
143
+ "PPC" => 2000,
144
+ "MIPS" => 3000,
145
+ "Sparc" => 4000,
146
+ "UltraSparc" => 5000,
147
+ "Other" => 9999,
148
+ }[processor_id]
149
+
150
+ release_notes = opts['release_notes'] || nil
151
+ release_notes = open(release_notes) if release_notes
152
+
153
+ release_changes = opts['release_changes'] || nil
154
+ release_changes = open(release_changes) if release_changes
155
+
156
+ userfile = open(userfile)
157
+
158
+ preformatted = '1'
159
+
160
+ form = {
161
+ "group_id" => group_id,
162
+ "package_id" => package_id,
163
+ "release_name" => release_name,
164
+ "release_date" => release_date,
165
+ "type_id" => type_id,
166
+ "processor_id" => processor_id,
167
+ "preformatted" => preformatted,
168
+ "userfile" => userfile,
169
+ "submit" => "Release File"
170
+ }
171
+
172
+ boundary = Array::new(8){ "%2.2d" % rand(42) }.join('__')
173
+ extheader['content-type'] = "multipart/form-data; boundary=___#{ boundary }___"
174
+
175
+ else
176
+ abort "#{ $0 } login create_package add_release"
177
+
178
+ end
179
+ #
180
+ # http transaction
181
+ #
182
+ client = HTTPAccess2::Client::new ENV['HTTP_PROXY']
183
+ client.debug_dev = STDERR if ENV['DEBUG']
184
+
185
+ client.set_cookie_store cookie_jar
186
+
187
+ # fixes http-access2 bug
188
+ client.redirect_uri_callback = lambda do |res|
189
+ page = res.header['location'].first
190
+ page = page =~ %r/http/ ? page : "#{ config['uri'] }/#{ page }"
191
+ page
192
+ end
193
+
194
+ response = client.send "#{ method }", "#{ config['uri'] }/#{ page }", form, extheader
195
+
196
+ client.save_cookie_store
197
+
198
+ # fixes http-access2 bug
199
+ BEGIN {
200
+ require "http-access2"
201
+ module WebAgent::CookieUtils
202
+ def domain_match(host, domain)
203
+ case domain
204
+ when /\d+\.\d+\.\d+\.\d+/
205
+ return (host == domain)
206
+ when '.'
207
+ return true
208
+ when /^\./
209
+ #return tail_match?(domain, host)
210
+ return tail_match?(host, domain)
211
+ else
212
+ return (host == domain)
213
+ end
214
+ end
215
+ end
216
+
217
+ }
data/scripts/txt2html ADDED
@@ -0,0 +1,65 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'redcloth'
4
+ require 'syntax/convertors/html'
5
+ require 'erb'
6
+ require '../lib/dr_nic_magic_models/version.rb'
7
+
8
+ version = DrNicMagicModels::VERSION::STRING
9
+ download = 'http://rubyforge.org/projects/magicmodels'
10
+
11
+ class Fixnum
12
+ def ordinal
13
+ # teens
14
+ return 'th' if (10..19).include?(self % 100)
15
+ # others
16
+ case self % 10
17
+ when 1: return 'st'
18
+ when 2: return 'nd'
19
+ when 3: return 'rd'
20
+ else return 'th'
21
+ end
22
+ end
23
+ end
24
+
25
+ class Time
26
+ def pretty
27
+ return "#{mday}#{mday.ordinal} #{strftime('%B')} #{year}"
28
+ end
29
+ end
30
+
31
+ def convert_syntax(syntax, source)
32
+ return Syntax::Convertors::HTML.for_syntax(syntax).convert(source).gsub(%r!^<pre>|</pre>$!,'')
33
+ end
34
+
35
+ if ARGV.length >= 1
36
+ src, template = ARGV
37
+ template ||= 'template.rhtml'
38
+ else
39
+ puts("Usage: #{File.split($0).last} source.txt [template.rhtml] > output.html")
40
+ exit!
41
+ end
42
+
43
+ template = ERB.new(File.open(template).read)
44
+
45
+ title = nil
46
+ body = nil
47
+ File.open(src) do |fsrc|
48
+ title_text = fsrc.readline
49
+ body_text = fsrc.read
50
+ syntax_items = []
51
+ body_text.gsub!(%r!<(pre|code)[^>]*?syntax=['"]([^'"]+)[^>]*>(.*?)</\1>!m){
52
+ ident = syntax_items.length
53
+ element, syntax, source = $1, $2, $3
54
+ syntax_items << "<#{element} class=\"syntax\">#{convert_syntax(syntax, source)}</#{element}>"
55
+ "syntax-temp-#{ident}"
56
+ }
57
+ title = RedCloth.new(title_text).to_html.gsub(%r!<.*?>!,'').strip
58
+ body = RedCloth.new(body_text).to_html
59
+ body.gsub!(%r!(?:<pre><code>)?syntax-temp-(\d+)(?:</code></pre>)?!){ syntax_items[$1.to_i] }
60
+ end
61
+ stat = File.stat(src)
62
+ created = stat.ctime
63
+ modified = stat.mtime
64
+
65
+ $stdout << template.result(binding)
data/website/index.html CHANGED
@@ -33,7 +33,7 @@
33
33
  <h1>Dr Nic&#8217;s Magic Models</h1>
34
34
  <div id="version" class="clickable" onclick='document.location = "http://rubyforge.org/projects/magicmodels"; return false'>
35
35
  Get Version
36
- <a href="http://rubyforge.org/projects/magicmodels" class="numbers">0.7.0</a>
36
+ <a href="http://rubyforge.org/projects/magicmodels" class="numbers">0.7.1</a>
37
37
  </div>
38
38
  <blockquote>
39
39
  <strong>conjure</strong> 1. To create events that appear to be magical<br />
@@ -269,10 +269,95 @@ demonstrated above) to have the brilliantly simple support that Rails/ActiveReco
269
269
  <span class="punct">&gt;&gt;</span> <span class="ident">person</span><span class="punct">.</span><span class="ident">groups</span>
270
270
  <span class="punct">=&gt;</span> <span class="punct">[&lt;</span><span class="constant">Group</span><span class="punct">:</span><span class="number">0x39047e0</span> <span class="attribute">@attributes</span><span class="punct">={&quot;</span><span class="string">name</span><span class="punct">&quot;=&gt;&quot;</span><span class="string">Magic Models Forum</span><span class="punct">&quot;,</span> <span class="punct">&quot;</span><span class="string">id</span><span class="punct">&quot;=&gt;&quot;</span><span class="string">1</span><span class="punct">&quot;,</span> <span class="punct">&quot;</span><span class="string">description</span><span class="punct">&quot;=&gt;</span><span class="constant">nil</span><span class="punct">}&gt;]</span>
271
271
  <span class="punct">&gt;&gt;</span> <span class="ident">group</span><span class="punct">.</span><span class="ident">people</span>
272
- <span class="punct">=&gt;</span>
272
+ <span class="punct">=&gt;</span> <span class="punct">[&lt;</span><span class="constant">Person</span><span class="punct">:</span><span class="number">0x3c33580</span> <span class="attribute">@attributes</span><span class="punct">={&quot;</span><span class="string">lastname</span><span class="punct">&quot;=&gt;&quot;</span><span class="string">Williams</span><span class="punct">&quot;,</span> <span class="punct">&quot;</span><span class="string">firstname</span><span class="punct">&quot;=&gt;&quot;</span><span class="string">Nic</span><span class="punct">&quot;,</span>
273
+ <span class="punct">&quot;</span><span class="string">id</span><span class="punct">&quot;=&gt;&quot;</span><span class="string">1</span><span class="punct">&quot;,</span> <span class="punct">&quot;</span><span class="string">email</span><span class="punct">&quot;=&gt;&quot;</span><span class="string">drnicwilliams@gmail.com</span><span class="punct">&quot;}&gt;]</span>
273
274
  </pre></p>
275
+
276
+
277
+ <h2>Drum roll&#8230;</h2>
278
+
279
+
280
+ <p>Ladies and gentlemen. For my final feat of magical mastery, I&#8217;ll ask you to do
281
+ something you&#8217;ve never done before. This illusion is akin to the <a href="http://www.toytent.com/Posters/985.html">floating lady</a>
282
+ illusion that has been passed down through generations of magicians.</p>
283
+
284
+
285
+ <p>Exit your console session.</p>
286
+
287
+
288
+ <span class="caps">DELETE</span> your three model classes: <code>person.rb, group.rb, and membership.rb</code> from the
289
+ <code>app/models</code> folder. (You can always get them back via the model generator&#8230; be fearless!)
290
+
291
+ <p>Re-launch your console.</p>
292
+
293
+
294
+ <p><strong>drums are still rolling&#8230;</strong></p>
295
+
296
+
297
+ <p>Be prepared to applaud loudly&#8230;</p>
298
+
299
+
300
+ <p><pre class="syntax">
301
+ <span class="punct">&gt;&gt;</span> <span class="constant">Person</span>
302
+ <span class="punct">=&gt;</span> <span class="constant">Person</span>
303
+ </pre></p>
304
+
305
+
306
+ <p>You applaud loudly, but watch for more&#8230;</p>
307
+
308
+
309
+ <p><pre class="syntax">
310
+ <span class="punct">&gt;&gt;</span> <span class="ident">person</span> <span class="punct">=</span> <span class="constant">Person</span><span class="punct">.</span><span class="ident">find</span><span class="punct">(</span><span class="number">1</span><span class="punct">)</span>
311
+ <span class="punct">=&gt;</span> <span class="punct">&lt;</span><span class="constant">Person</span><span class="punct">:</span><span class="number">0x3958930</span> <span class="attribute">@attributes</span><span class="punct">={&quot;</span><span class="string">lastname</span><span class="punct">&quot;=&gt;&quot;</span><span class="string">Williams</span><span class="punct">&quot;,</span> <span class="punct">&quot;</span><span class="string">firstname</span><span class="punct">&quot;=&gt;&quot;</span><span class="string">Nic</span><span class="punct">&quot;,</span>
312
+ <span class="punct">&quot;</span><span class="string">id</span><span class="punct">&quot;=&gt;&quot;</span><span class="string">1</span><span class="punct">&quot;,</span> <span class="punct">&quot;</span><span class="string">email</span><span class="punct">&quot;=&gt;&quot;</span><span class="string">drnicwilliams@gmail.com</span><span class="punct">&quot;}&gt;</span>
313
+ <span class="punct">&gt;&gt;</span> <span class="ident">person</span><span class="punct">.</span><span class="ident">memberships</span>
314
+ <span class="punct">=&gt;</span> <span class="punct">[&lt;</span><span class="constant">Membership</span><span class="punct">:</span><span class="number">0x393a000</span> <span class="attribute">@attributes</span><span class="punct">={&quot;</span><span class="string">group_id</span><span class="punct">&quot;=&gt;&quot;</span><span class="string">1</span><span class="punct">&quot;,</span> <span class="punct">&quot;</span><span class="string">id</span><span class="punct">&quot;=&gt;&quot;</span><span class="string">1</span><span class="punct">&quot;,</span> <span class="punct">&quot;</span><span class="string">person_id</span><span class="punct">&quot;=&gt;&quot;</span><span class="string">1</span><span class="punct">&quot;}&gt;]</span>
315
+ <span class="punct">&gt;&gt;</span> <span class="ident">person</span><span class="punct">.</span><span class="ident">groups</span>
316
+ <span class="punct">=&gt;</span> <span class="punct">[&lt;</span><span class="constant">Group</span><span class="punct">:</span><span class="number">0x390df60</span> <span class="attribute">@attributes</span><span class="punct">={&quot;</span><span class="string">name</span><span class="punct">&quot;=&gt;&quot;</span><span class="string">Magic Models Forum</span><span class="punct">&quot;,</span> <span class="punct">&quot;</span><span class="string">id</span><span class="punct">&quot;=&gt;&quot;</span><span class="string">1</span><span class="punct">&quot;,</span> <span class="punct">&quot;</span><span class="string">description</span><span class="punct">&quot;=&gt;</span><span class="constant">nil</span><span class="punct">}&gt;]</span>
317
+ </pre></p>
318
+
319
+
320
+ <h2>Tada!</h2>
321
+
322
+
323
+ <p>The end.</p>
324
+
325
+
326
+ <h2>Dr Nic&#8217;s Blog</h2>
327
+
328
+
329
+ <p><a href="http://www.drnicwilliams.com">http://www.drnicwilliams.com</a> &#8211; for future announcements and
330
+ other stories and things.</p>
331
+
332
+
333
+ <h2>Articles about Magic Models</h2>
334
+
335
+
336
+ <ul>
337
+ <li><a href="http://drnicwilliams.com/2006/08/07/ann-dr-nics-magic-models/">Announcement</a></li>
338
+ <li><a href="http://drnicwilliams.com/2006/08/10/bts-magic-models-class-creation/"><span class="caps">BTS</span> &#8211; Class creation</a></li>
339
+ </ul>
340
+
341
+
342
+ <h2>Forum</h2>
343
+
344
+
345
+ <p><a href="http://groups.google.com/group/magicmodels">http://groups.google.com/group/magicmodels</a></p>
346
+
347
+
348
+ <h2>Licence</h2>
349
+
350
+
351
+ <p>This code is free to use under the terms of the <span class="caps">MIT</span> licence.</p>
352
+
353
+
354
+ <h2>Contact</h2>
355
+
356
+
357
+ <p>Comments are welcome. Send an email to <a href="mailto:drnicwilliams@gmail.com">Dr Nic Williams</a>
358
+ or via his blog at <a href="http://www.drnicwilliams.com">http://www.drnicwilliams.com</a></p>
274
359
  <p class="coda">
275
- <a href="mailto:drnicwilliams@gmail.com">Dr Nic</a>, 7th August 2006<br>
360
+ <a href="mailto:drnicwilliams@gmail.com">Dr Nic</a>, 10th August 2006<br>
276
361
  Theme extended from <a href="http://rb2js.rubyforge.org/">Paul Battley</a>
277
362
  </p>
278
363
  </div>
data/website/index.txt CHANGED
@@ -200,5 +200,69 @@ The final association trick is a ripper. Automatic generation of <code>has_many
200
200
  >> person.groups
201
201
  => [<Group:0x39047e0 @attributes={"name"=>"Magic Models Forum", "id"=>"1", "description"=>nil}>]
202
202
  >> group.people
203
- =>
203
+ => [<Person:0x3c33580 @attributes={"lastname"=>"Williams", "firstname"=>"Nic",
204
+ "id"=>"1", "email"=>"drnicwilliams@gmail.com"}>]
204
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
+
metadata CHANGED
@@ -3,8 +3,8 @@ rubygems_version: 0.8.11
3
3
  specification_version: 1
4
4
  name: dr_nic_magic_models
5
5
  version: !ruby/object:Gem::Version
6
- version: 0.7.0
7
- date: 2006-08-07 00:00:00 +02:00
6
+ version: 0.7.1
7
+ date: 2006-08-12 00:00:00 +02:00
8
8
  summary: Invisible validations, assocations and Active Record models themselves!
9
9
  require_paths:
10
10
  - lib
@@ -32,21 +32,20 @@ files:
32
32
  - install.rb
33
33
  - README
34
34
  - CHANGELOG
35
- - lib/module.rb
36
35
  - lib/dr_nic_magic_models
37
36
  - lib/dr_nic_magic_models.rb
38
- - lib/new_base.rb
39
37
  - lib/base.rb
38
+ - lib/module.rb
40
39
  - lib/dr_nic_magic_models/associations.rb
41
40
  - lib/dr_nic_magic_models/schema.rb
42
41
  - lib/dr_nic_magic_models/validations.rb
43
42
  - lib/dr_nic_magic_models/version.rb
44
43
  - test/connections
45
44
  - test/fixtures
46
- - test/abstract_unit.rb
47
45
  - test/dummy_test.rb
48
- - test/invisible_model_classes_test.rb
49
46
  - test/env_test.rb
47
+ - test/invisible_model_classes_test.rb
48
+ - test/abstract_unit.rb
50
49
  - test/invisible_model_access_test.rb
51
50
  - test/invisible_model_assoc_test.rb
52
51
  - test/connections/native_mysql
@@ -58,13 +57,16 @@ files:
58
57
  - test/fixtures/fun_users.yml
59
58
  - test/fixtures/db_definitions/mysql.sql
60
59
  - test/fixtures/db_definitions/mysql.drop.sql
61
- - website/index.txt
62
60
  - website/index.html
63
61
  - website/javascripts
64
62
  - website/stylesheets
65
63
  - website/template.rhtml
64
+ - website/index.txt
66
65
  - website/javascripts/rounded_corners_lite.inc.js
67
66
  - website/stylesheets/screen.css
67
+ - scripts/rubyforge-orig
68
+ - scripts/txt2html
69
+ - scripts/http-access2-2.0.6.gem
68
70
  test_files: []
69
71
 
70
72
  rdoc_options:
@@ -84,7 +86,7 @@ dependencies:
84
86
  version_requirement:
85
87
  version_requirements: !ruby/object:Gem::Version::Requirement
86
88
  requirements:
87
- - - "="
89
+ - - ">="
88
90
  - !ruby/object:Gem::Version
89
91
  version: 1.14.3
90
92
  version:
data/lib/new_base.rb DELETED
@@ -1,105 +0,0 @@
1
- # Only needs to be an Include module for the generated classes, not for all ARs
2
- module ActiveRecord
3
- class Base
4
- class << self
5
- alias old_new new
6
- def new(*args)
7
- obj = old_new(*args)
8
- unless self.methods.include? 'generate_validations'
9
- self.send(:include, DrNicMagicModels::Validations)
10
- self.generate_validations
11
- end
12
- obj
13
- end
14
- alias old_allocate allocate
15
- def allocate
16
- obj = old_allocate
17
- unless self.methods.include? 'generate_validations'
18
- self.send(:include, DrNicMagicModels::Validations)
19
- self.generate_validations
20
- end
21
- obj
22
- end
23
-
24
- cattr_accessor :known_unknowns
25
-
26
- # Returns the AssociationReflection object for the named +aggregation+ (use the symbol). Example:
27
- # Account.reflect_on_association(:owner) # returns the owner AssociationReflection
28
- # Invoice.reflect_on_association(:line_items).macro # returns :has_many
29
- def reflect_on_association(association)
30
- puts "Known association? #{association.to_sym.inspect} -> #{reflections[association]}"
31
- reflections[association].is_a?(AssociationReflection) ? reflections[association] : nil
32
- end
33
-
34
- def assess_unknown_method(instance, method, *args, &block)
35
- result = find_belongs_to instance, method, *args, &block
36
- result = find_has_some instance, method, *args, &block if not result
37
- result = find_has_some_indirect instance, method, *args, &block if not result
38
- result
39
- end
40
-
41
- def add_known_unknown(method)
42
- known_unknowns ||= {}
43
- known_unknowns[method] = true
44
- end
45
-
46
- def unknown_method?(method)
47
- known_unknowns.nil? or known_unknowns.include? method
48
- end
49
-
50
- def find_belongs_to(instance, method, *args, &block)
51
- foreign_key = self.columns.select {|column| column.name == method.to_s.foreign_key}.first
52
- return add_belongs_to(instance, method, *args, &block) if foreign_key
53
- end
54
-
55
- def add_belongs_to(instance, method, *args, &block)
56
- self.send 'belongs_to', method
57
- instance.send(method, *args, &block)
58
- end
59
-
60
- def find_has_some(instance, method, *args, &block)
61
- klass = Module.const_get method.to_s.downcase.singularize.camelize rescue nil
62
- foreign_key = klass.columns.select {|column| column.name == self.name.foreign_key}.first if klass
63
- return add_has_some(instance, method, *args, &block) if foreign_key
64
- end
65
-
66
- def add_has_some(instance, method, *args, &block)
67
- _method = method.to_s
68
- association = _method.singularize == _method ? 'has_one' : 'has_many'
69
- self.send association, method
70
- instance.send(instance, method, *args, &block)
71
- end
72
-
73
- def find_has_some_indirect(instance, method, *args, &block)
74
- klass = Module.const_get method.to_s.downcase.singularize.camelize rescue return
75
- join_table = nil
76
- self.connection.tables.each do |table|
77
- unless [self.table_name, klass.table_name].include? table
78
- columns = self.connection.columns(table).map(&:name)
79
- join_table = table if columns.include?(self.to_s.foreign_key) and columns.include?(klass.to_s.foreign_key)
80
- end
81
- break if join_table
82
- end
83
- return add_has_some_through(instance, join_table, method, *args, &block) if join_table
84
- end
85
-
86
- def add_has_some_through(instance, join_table, method, *args, &block)
87
- puts "self.class.send 'has_many', #{method}, :through => #{join_table.inspect}"
88
- self.send 'has_many', method, :through => join_table.to_sym
89
- instance.send(method, *args, &block)
90
- end
91
- end
92
-
93
- class_eval do
94
- alias :normal_method_missing :method_missing
95
- def method_missing(method, *args, &block)
96
- if unknown_method? method
97
- self.class.assess_unknown_method(self, method, *args, &block)
98
- end
99
- add_known_unknown method
100
- normal_method_missing(method, *args, &block)
101
- end
102
-
103
- end
104
- end
105
- end