hobo 0.5.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (125) hide show
  1. data/LICENSE.txt +22 -0
  2. data/README.txt +18 -0
  3. data/bin/hobo +81 -0
  4. data/hobo_files/plugin/CHANGES.txt +963 -0
  5. data/hobo_files/plugin/LICENSE.txt +22 -0
  6. data/hobo_files/plugin/README +4 -0
  7. data/hobo_files/plugin/Rakefile +11 -0
  8. data/hobo_files/plugin/generators/hobo/hobo_generator.rb +37 -0
  9. data/hobo_files/plugin/generators/hobo/templates/application.dryml +2 -0
  10. data/hobo_files/plugin/generators/hobo/templates/guest.rb +31 -0
  11. data/hobo_files/plugin/generators/hobo_front_controller/USAGE +11 -0
  12. data/hobo_files/plugin/generators/hobo_front_controller/hobo_front_controller_generator.rb +90 -0
  13. data/hobo_files/plugin/generators/hobo_front_controller/templates/controller.rb +51 -0
  14. data/hobo_files/plugin/generators/hobo_front_controller/templates/functional_test.rb +18 -0
  15. data/hobo_files/plugin/generators/hobo_front_controller/templates/helper.rb +2 -0
  16. data/hobo_files/plugin/generators/hobo_front_controller/templates/index.dryml +43 -0
  17. data/hobo_files/plugin/generators/hobo_front_controller/templates/login.dryml +44 -0
  18. data/hobo_files/plugin/generators/hobo_front_controller/templates/search.dryml +18 -0
  19. data/hobo_files/plugin/generators/hobo_front_controller/templates/signup.dryml +45 -0
  20. data/hobo_files/plugin/generators/hobo_model/USAGE +26 -0
  21. data/hobo_files/plugin/generators/hobo_model/hobo_model_generator.rb +38 -0
  22. data/hobo_files/plugin/generators/hobo_model/templates/fixtures.yml +11 -0
  23. data/hobo_files/plugin/generators/hobo_model/templates/migration.rb +13 -0
  24. data/hobo_files/plugin/generators/hobo_model/templates/model.rb +24 -0
  25. data/hobo_files/plugin/generators/hobo_model/templates/unit_test.rb +10 -0
  26. data/hobo_files/plugin/generators/hobo_model_controller/USAGE +30 -0
  27. data/hobo_files/plugin/generators/hobo_model_controller/hobo_model_controller_generator.rb +43 -0
  28. data/hobo_files/plugin/generators/hobo_model_controller/templates/controller.rb +5 -0
  29. data/hobo_files/plugin/generators/hobo_model_controller/templates/functional_test.rb +18 -0
  30. data/hobo_files/plugin/generators/hobo_model_controller/templates/helper.rb +2 -0
  31. data/hobo_files/plugin/generators/hobo_model_controller/templates/view.rhtml +2 -0
  32. data/hobo_files/plugin/generators/hobo_rapid/hobo_rapid_generator.rb +51 -0
  33. data/hobo_files/plugin/generators/hobo_rapid/templates/hobo_rapid.js +436 -0
  34. data/hobo_files/plugin/generators/hobo_rapid/templates/themes/default/default_mapping.rb +11 -0
  35. data/hobo_files/plugin/generators/hobo_rapid/templates/themes/default/public/images/banner.gif +0 -0
  36. data/hobo_files/plugin/generators/hobo_rapid/templates/themes/default/public/images/bkg_bodytop.gif +0 -0
  37. data/hobo_files/plugin/generators/hobo_rapid/templates/themes/default/public/images/bkg_corner_01.gif +0 -0
  38. data/hobo_files/plugin/generators/hobo_rapid/templates/themes/default/public/images/bkg_corner_02.gif +0 -0
  39. data/hobo_files/plugin/generators/hobo_rapid/templates/themes/default/public/images/bkg_corner_03.gif +0 -0
  40. data/hobo_files/plugin/generators/hobo_rapid/templates/themes/default/public/images/bkg_corner_04.gif +0 -0
  41. data/hobo_files/plugin/generators/hobo_rapid/templates/themes/default/public/images/bkg_shadow_bottom.gif +0 -0
  42. data/hobo_files/plugin/generators/hobo_rapid/templates/themes/default/public/images/bkg_shadow_left.gif +0 -0
  43. data/hobo_files/plugin/generators/hobo_rapid/templates/themes/default/public/images/bkg_shadow_right.gif +0 -0
  44. data/hobo_files/plugin/generators/hobo_rapid/templates/themes/default/public/images/bkg_shadow_top.gif +0 -0
  45. data/hobo_files/plugin/generators/hobo_rapid/templates/themes/default/public/images/header_blue.gif +0 -0
  46. data/hobo_files/plugin/generators/hobo_rapid/templates/themes/default/public/images/header_dblue.gif +0 -0
  47. data/hobo_files/plugin/generators/hobo_rapid/templates/themes/default/public/images/header_green.gif +0 -0
  48. data/hobo_files/plugin/generators/hobo_rapid/templates/themes/default/public/images/header_purple.gif +0 -0
  49. data/hobo_files/plugin/generators/hobo_rapid/templates/themes/default/public/images/header_red.gif +0 -0
  50. data/hobo_files/plugin/generators/hobo_rapid/templates/themes/default/public/images/logo.gif +0 -0
  51. data/hobo_files/plugin/generators/hobo_rapid/templates/themes/default/public/images/spinner.gif +0 -0
  52. data/hobo_files/plugin/generators/hobo_rapid/templates/themes/default/public/images/txt_list_img_dblue.gif +0 -0
  53. data/hobo_files/plugin/generators/hobo_rapid/templates/themes/default/public/images/txt_list_img_green.gif +0 -0
  54. data/hobo_files/plugin/generators/hobo_rapid/templates/themes/default/public/images/txt_list_img_purple.gif +0 -0
  55. data/hobo_files/plugin/generators/hobo_rapid/templates/themes/default/public/images/txt_list_img_red.gif +0 -0
  56. data/hobo_files/plugin/generators/hobo_rapid/templates/themes/default/public/images/window_corner_01.gif +0 -0
  57. data/hobo_files/plugin/generators/hobo_rapid/templates/themes/default/public/images/window_corner_02.gif +0 -0
  58. data/hobo_files/plugin/generators/hobo_rapid/templates/themes/default/public/images/window_corner_03.gif +0 -0
  59. data/hobo_files/plugin/generators/hobo_rapid/templates/themes/default/public/images/window_corner_04.gif +0 -0
  60. data/hobo_files/plugin/generators/hobo_rapid/templates/themes/default/public/images/window_shadow_bottom.gif +0 -0
  61. data/hobo_files/plugin/generators/hobo_rapid/templates/themes/default/public/images/window_shadow_left.gif +0 -0
  62. data/hobo_files/plugin/generators/hobo_rapid/templates/themes/default/public/images/window_shadow_right.gif +0 -0
  63. data/hobo_files/plugin/generators/hobo_rapid/templates/themes/default/public/images/window_shadow_top.gif +0 -0
  64. data/hobo_files/plugin/generators/hobo_rapid/templates/themes/default/public/stylesheets/application.css +390 -0
  65. data/hobo_files/plugin/generators/hobo_rapid/templates/themes/default/views/application.dryml +104 -0
  66. data/hobo_files/plugin/generators/hobo_user_model/USAGE +26 -0
  67. data/hobo_files/plugin/generators/hobo_user_model/hobo_user_model_generator.rb +38 -0
  68. data/hobo_files/plugin/generators/hobo_user_model/templates/fixtures.yml +11 -0
  69. data/hobo_files/plugin/generators/hobo_user_model/templates/migration.rb +15 -0
  70. data/hobo_files/plugin/generators/hobo_user_model/templates/model.rb +58 -0
  71. data/hobo_files/plugin/generators/hobo_user_model/templates/unit_test.rb +10 -0
  72. data/hobo_files/plugin/init.rb +44 -0
  73. data/hobo_files/plugin/lib/action_view_extensions/base.rb +14 -0
  74. data/hobo_files/plugin/lib/active_record/has_many_association.rb +54 -0
  75. data/hobo_files/plugin/lib/active_record/has_many_through_association.rb +22 -0
  76. data/hobo_files/plugin/lib/active_record/table_definition.rb +34 -0
  77. data/hobo_files/plugin/lib/extensions.rb +245 -0
  78. data/hobo_files/plugin/lib/extensions/test_case.rb +130 -0
  79. data/hobo_files/plugin/lib/hobo.rb +353 -0
  80. data/hobo_files/plugin/lib/hobo/HtmlString +3 -0
  81. data/hobo_files/plugin/lib/hobo/authenticated_user.rb +106 -0
  82. data/hobo_files/plugin/lib/hobo/authentication_support.rb +108 -0
  83. data/hobo_files/plugin/lib/hobo/composite_model.rb +66 -0
  84. data/hobo_files/plugin/lib/hobo/controller.rb +134 -0
  85. data/hobo_files/plugin/lib/hobo/controller_helpers.rb +135 -0
  86. data/hobo_files/plugin/lib/hobo/core.rb +475 -0
  87. data/hobo_files/plugin/lib/hobo/define_tags.rb +56 -0
  88. data/hobo_files/plugin/lib/hobo/dryml.rb +161 -0
  89. data/hobo_files/plugin/lib/hobo/dryml/dryml_builder.rb +126 -0
  90. data/hobo_files/plugin/lib/hobo/dryml/tag_module.rb +9 -0
  91. data/hobo_files/plugin/lib/hobo/dryml/taglib.rb +57 -0
  92. data/hobo_files/plugin/lib/hobo/dryml/template.rb +586 -0
  93. data/hobo_files/plugin/lib/hobo/dryml/template_environment.rb +302 -0
  94. data/hobo_files/plugin/lib/hobo/dryml/template_handler.rb +19 -0
  95. data/hobo_files/plugin/lib/hobo/generator.rb +25 -0
  96. data/hobo_files/plugin/lib/hobo/html_string.rb +3 -0
  97. data/hobo_files/plugin/lib/hobo/lazy_hash.rb +28 -0
  98. data/hobo_files/plugin/lib/hobo/mapping_tags.rb +262 -0
  99. data/hobo_files/plugin/lib/hobo/markdown_string.rb +7 -0
  100. data/hobo_files/plugin/lib/hobo/model.rb +391 -0
  101. data/hobo_files/plugin/lib/hobo/model_controller.rb +676 -0
  102. data/hobo_files/plugin/lib/hobo/model_queries.rb +92 -0
  103. data/hobo_files/plugin/lib/hobo/model_support.rb +44 -0
  104. data/hobo_files/plugin/lib/hobo/password_string.rb +3 -0
  105. data/hobo_files/plugin/lib/hobo/predicate_dispatch.rb +78 -0
  106. data/hobo_files/plugin/lib/hobo/proc_binding.rb +32 -0
  107. data/hobo_files/plugin/lib/hobo/rapid.rb +447 -0
  108. data/hobo_files/plugin/lib/hobo/static_tags +92 -0
  109. data/hobo_files/plugin/lib/hobo/text.rb +3 -0
  110. data/hobo_files/plugin/lib/hobo/textile_string.rb +13 -0
  111. data/hobo_files/plugin/lib/hobo/undefined.rb +41 -0
  112. data/hobo_files/plugin/lib/hobo/undefined_access_error.rb +5 -0
  113. data/hobo_files/plugin/lib/hobo/where_fragment.rb +23 -0
  114. data/hobo_files/plugin/lib/rexml.rb +345 -0
  115. data/hobo_files/plugin/tags/core.dryml +6 -0
  116. data/hobo_files/plugin/tags/rapid.dryml +177 -0
  117. data/hobo_files/plugin/tags/rapid_editing.dryml +168 -0
  118. data/hobo_files/plugin/tags/rapid_navigation.dryml +95 -0
  119. data/hobo_files/plugin/tags/rapid_pages.dryml +175 -0
  120. data/hobo_files/plugin/tasks/environments.rake +19 -0
  121. data/hobo_files/plugin/tasks/hobo_tasks.rake +4 -0
  122. data/hobo_files/plugin/test/hobo_dryml_template_test.rb +7 -0
  123. data/hobo_files/plugin/test/hobo_test.rb +7 -0
  124. data/hobo_files/plugin/uninstall.rb +1 -0
  125. metadata +206 -0
@@ -0,0 +1,104 @@
1
+ <taglib src="plugins/hobo/tags/rapid"/>
2
+
3
+ <def tag="page" attrs="title_prefix, title">
4
+ <% title ||= human_type + ": " + display_name(:no_span => true) %>
5
+ <%= '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">' %>
6
+ <html>
7
+ <head content_option="head">
8
+ <title><%= title_prefix %><%= title %></title>
9
+ <theme_stylesheet/>
10
+ <%= javascript_include_tag :defaults %>
11
+ <hobo_rapid_javascripts replace_option="rapid_javascripts"/>
12
+ </head>
13
+
14
+ <body onload="Hobo.applyEvents()" content_option="body">
15
+
16
+ <div id='ajax_progress'>
17
+ <div>
18
+ <span id="ajax_progress_text"></span><theme_img src="spinner.gif"/>
19
+ </div>
20
+ </div>
21
+
22
+ <div id="page">
23
+
24
+ <div id="page_top">
25
+ <div id="page_right">
26
+ <div id="page_bottom">
27
+ <div id="page_left">
28
+ <div id="page_corner02">
29
+ <div id="page_corner04">
30
+ <div id="page_corner03">
31
+ <div id="page_corner01">
32
+ <div id="page_inner_top">
33
+
34
+ <div id='header' content_option="header">
35
+ <div class="logo" content_option="logo"><theme_img src="logo.gif"/></div>
36
+
37
+ <div class="nav_bars" content_option="navigation">
38
+ <div class="nav" content_option="main_nav"><application_nav/></div>
39
+ <if q="#login_url rescue false">
40
+ <div class="account_nav" content_option="account_nav"><application_account_nav/></div>
41
+ </if>
42
+ </div>
43
+ <clearer/>
44
+ </div>
45
+
46
+ <if q="#flash[:notice]">
47
+ <div class="flash"><%= flash[:notice] %></div>
48
+ </if>
49
+
50
+ <div content_option="intro"></div>
51
+ <div content_option="main">
52
+ <div class="maincol" content_option="maincol"/>
53
+ <div class="sidecol" content_option="sidecol"/>
54
+ </div>
55
+
56
+ <clearer/>
57
+
58
+ </div></div></div></div></div></div></div></div></div>
59
+ </div>
60
+
61
+ <div id="footer" content_option="footer"/>
62
+ </body>
63
+ </html>
64
+ </def>
65
+
66
+
67
+ <def tag="panel">
68
+ <div class="panel" xattrs="">
69
+ <div class="panel_top"><div class="panel_right">
70
+ <div class="panel_bottom"><div class="panel_left">
71
+ <div class="panel_corner02"><div class="panel_corner04">
72
+ <div class="panel_corner03"><div class="panel_corner01">
73
+
74
+ <tagbody/>
75
+
76
+ </div></div></div></div></div></div></div></div>
77
+ </div>
78
+ </def>
79
+
80
+ <def tag="section">
81
+ <div class="section" xattrs=""><tagbody/></div>
82
+ </def>
83
+
84
+
85
+ <def tag="navbar" attrs="items,current">
86
+ <repeat obj="#items">
87
+ <div class='nav_item <%= "current" if current == this[0] %>'><%= link_to this[0].upcase, this[1] %></div>
88
+ </repeat>
89
+ <clearer/>
90
+ </def>
91
+
92
+
93
+ <def tag="application_nav">
94
+ <% items = [['Home', urlb + '/']] +
95
+ Hobo.models[0..2].map{|m| [m.name.pluralize.titlecase, object_url(m)]} +
96
+ [['Search', (search_url rescue "")]] %>
97
+ <navbar items="#items"/>
98
+ </def>
99
+
100
+
101
+ <def tag="application_logo">
102
+ <theme_img src="logo.gif"/>
103
+ </def>
104
+
@@ -0,0 +1,26 @@
1
+ Description:
2
+ The model generator creates stubs for a new model.
3
+
4
+ The generator takes a model name as its argument. The model name may be given in CamelCase or under_score and
5
+ should not be suffixed with 'Model'.
6
+
7
+ As additional parameters, the generator will take attribute pairs described by name and type. These attributes will
8
+ be used to prepopulate the migration to create the table for the model and give you a set of predefined fixture.
9
+ You don't have to think up all attributes up front, but it's a good idea of adding just the baseline of what's
10
+ needed to start really working with the resource.
11
+
12
+ The generator creates a model class in app/models, a test suite in test/unit, test fixtures in
13
+ test/fixtures/singular_name.yml, and a migration in db/migrate.
14
+
15
+ Examples:
16
+ ./script/generate model account
17
+
18
+ This will create an Account model:
19
+ Model: app/models/account.rb
20
+ Test: test/unit/account_test.rb
21
+ Fixtures: test/fixtures/accounts.yml
22
+ Migration: db/migrate/XXX_add_accounts.rb
23
+
24
+ ./script/generate model post title:string created_on:date body:text published:boolean
25
+
26
+ Creates post model with predefined attributes.
@@ -0,0 +1,38 @@
1
+ class HoboUserModelGenerator < Rails::Generator::NamedBase
2
+ default_options :skip_migration => false
3
+
4
+ def manifest
5
+ record do |m|
6
+ # Check for class naming collisions.
7
+ m.class_collisions class_path, class_name, "#{class_name}Test"
8
+
9
+ # Model, test, and fixture directories.
10
+ m.directory File.join('app/models', class_path)
11
+ m.directory File.join('test/unit', class_path)
12
+ m.directory File.join('test/fixtures', class_path)
13
+
14
+ # Model class, unit test, and fixtures.
15
+ m.template 'model.rb', File.join('app/models', class_path, "#{file_name}.rb")
16
+ m.template 'unit_test.rb', File.join('test/unit', class_path, "#{file_name}_test.rb")
17
+ m.template 'fixtures.yml', File.join('test/fixtures', class_path, "#{table_name}.yml")
18
+
19
+ unless options[:skip_migration]
20
+ m.migration_template 'migration.rb', 'db/migrate', :assigns => {
21
+ :migration_name => "Create#{class_name.pluralize.gsub(/::/, '')}"
22
+ }, :migration_file_name => "create_#{file_path.gsub(/\//, '_').pluralize}"
23
+ end
24
+ end
25
+ end
26
+
27
+ protected
28
+ def banner
29
+ "Usage: #{$0} generate ModelName [field:type, field:type]"
30
+ end
31
+
32
+ def add_options!(opt)
33
+ opt.separator ''
34
+ opt.separator 'Options:'
35
+ opt.on("--skip-migration",
36
+ "Don't generate a migration file for this model") { |v| options[:skip_migration] = v }
37
+ end
38
+ end
@@ -0,0 +1,11 @@
1
+ # Read about fixtures at http://ar.rubyonrails.org/classes/Fixtures.html
2
+ one:
3
+ id: 1
4
+ <% for attribute in attributes -%>
5
+ <%= attribute.name %>: <%= attribute.default %>
6
+ <% end -%>
7
+ two:
8
+ id: 2
9
+ <% for attribute in attributes -%>
10
+ <%= attribute.name %>: <%= attribute.default %>
11
+ <% end -%>
@@ -0,0 +1,15 @@
1
+ class <%= migration_name %> < ActiveRecord::Migration
2
+ def self.up
3
+ create_table :<%= table_name %> do |t|
4
+ t.string :username
5
+ t.string :crypted_password, :salt, :limit => 40
6
+ t.string :remember_token
7
+ t.datetime :remember_token_expires_at
8
+ t.auto_dates
9
+ end
10
+ end
11
+
12
+ def self.down
13
+ drop_table :<%= table_name %>
14
+ end
15
+ end
@@ -0,0 +1,58 @@
1
+ class <%= class_name %> < ActiveRecord::Base
2
+
3
+ hobo_model
4
+
5
+ include Hobo::AuthenticatedUser
6
+
7
+ set_login_attr :username
8
+
9
+ alias_attribute :display_name, :username
10
+
11
+ # --- Hobo Permissions --- #
12
+
13
+ def super_user?
14
+ # login == 'admin'
15
+ end
16
+
17
+ def creatable_by?(creator)
18
+ false
19
+ end
20
+
21
+ def updatable_by?(updater, new)
22
+ false
23
+ end
24
+
25
+ def deletable_by?(deleter)
26
+ false
27
+ end
28
+
29
+ def viewable_by?(viewer, field)
30
+ true
31
+ end
32
+
33
+
34
+ # --- Fallback permissions --- #
35
+
36
+ # (Hobo checks these for models that do not define the *_by? methods)
37
+
38
+ def can_create?(obj)
39
+ false
40
+ end
41
+
42
+ def can_update?(obj, new)
43
+ false
44
+ end
45
+
46
+ def can_delete?(obj)
47
+ false
48
+ end
49
+
50
+ def can_view?(obj, field)
51
+ true
52
+ end
53
+
54
+ def guest?
55
+ false
56
+ end
57
+
58
+ end
@@ -0,0 +1,10 @@
1
+ require File.dirname(__FILE__) + '<%= '/..' * class_nesting_depth %>/../test_helper'
2
+
3
+ class <%= class_name %>Test < Test::Unit::TestCase
4
+ fixtures :<%= table_name %>
5
+
6
+ # Replace this with your real tests.
7
+ def test_truth
8
+ assert true
9
+ end
10
+ end
@@ -0,0 +1,44 @@
1
+ require 'extensions'
2
+ require 'rexml'
3
+ require 'active_record/has_many_association'
4
+ require 'active_record/has_many_through_association'
5
+ require 'active_record/table_definition'
6
+ require 'action_view_extensions/base'
7
+
8
+ require 'hobo'
9
+ require 'hobo/dryml'
10
+
11
+ require 'hobo/model'
12
+
13
+ require 'hobo/dryml/template'
14
+ require 'hobo/dryml/taglib'
15
+ require 'hobo/dryml/template_environment'
16
+ require 'hobo/dryml/template_handler'
17
+
18
+ require 'extensions/test_case' if RAILS_ENV == "test"
19
+
20
+
21
+ ActionView::Base.register_template_handler("dryml", Hobo::Dryml::TemplateHandler)
22
+
23
+ class ActionController::Base
24
+
25
+ def self.hobo_model_controller(model=nil)
26
+ include Hobo::ModelController
27
+ self.model = model if model
28
+ end
29
+
30
+ def self.hobo_controller(model=nil)
31
+ include Hobo::Controller
32
+ end
33
+
34
+ end
35
+
36
+ def (ActiveRecord::Base).hobo_model
37
+ include Hobo::Model
38
+ end
39
+
40
+ # Default settings
41
+
42
+ Hobo.user_model ||= (User rescue (Person rescue nil))
43
+
44
+ Hobo.developer_features = ["development", "test"].include?(RAILS_ENV) if Hobo.developer_features? == nil
@@ -0,0 +1,14 @@
1
+ module ActionView
2
+
3
+ class Base
4
+
5
+ alias_method :render_file_without_hobo, :render_file
6
+ def render_file(template_path, *args)
7
+ @hobo_template_path = template_path
8
+ render_file_without_hobo(template_path, *args)
9
+ end
10
+
11
+ end
12
+
13
+ end
14
+
@@ -0,0 +1,54 @@
1
+ module ActiveRecord::Associations
2
+
3
+ class HasManyAssociation
4
+
5
+ def new(*args)
6
+ res = build(*args)
7
+ if @owner.new_record?
8
+ refl = @owner.class.reverse_reflection(@reflection.name)
9
+ if refl
10
+ bta = ActiveRecord::Associations::BelongsToAssociation.new(res, refl)
11
+ bta.replace(@owner)
12
+ res.instance_variable_set("@#{refl.name}", bta)
13
+ end
14
+ end
15
+ res
16
+ end
17
+
18
+
19
+ def new_without_appending(attributes = {})
20
+ record = @reflection.klass.new(attributes)
21
+ set_belongs_to_association_for(record)
22
+ record
23
+ end
24
+
25
+
26
+ def include?(record)
27
+ if loaded?
28
+ target.include?(record)
29
+ else
30
+ find(record.id) && true rescue false
31
+ end
32
+ end
33
+
34
+
35
+ def member_class
36
+ proxy_reflection.klass
37
+ end
38
+
39
+
40
+ def find_with_block(*args, &b)
41
+ if b
42
+ options = extract_options_from_args!(args)
43
+ args << options.merge(:conditions => member_class.conditions(&b))
44
+ find_without_block(*args)
45
+ else
46
+ find_without_block(*args)
47
+ end
48
+ end
49
+ alias_method_chain :find, :block
50
+
51
+ end
52
+
53
+ end
54
+
@@ -0,0 +1,22 @@
1
+ module ActiveRecord::Associations
2
+
3
+ class HasManyThroughAssociation
4
+
5
+ def include?(record)
6
+ return false unless record.is_a? ActiveRecord::Base
7
+
8
+ if loaded?
9
+ target.include?(record)
10
+ else
11
+ !!find_by_id(record.id)
12
+ end
13
+ end
14
+
15
+ def member_class
16
+ proxy_reflection.klass
17
+ end
18
+
19
+ end
20
+
21
+ end
22
+
@@ -0,0 +1,34 @@
1
+ module ActiveRecord::ConnectionAdapters
2
+
3
+ class TableDefinition
4
+
5
+ def fkey(*args)
6
+ options = take_options!(args)
7
+ args.each {|col| column("#{col}_id".to_sym, :integer, options)}
8
+ end
9
+
10
+ def auto_dates
11
+ column :created_at, :datetime
12
+ column :updated_at, :datetime
13
+ end
14
+
15
+ def method_missing(name, *args)
16
+ if name.in? [:integer, :float, :decimal, :datetime, :date, :timestamp,
17
+ :time, :text, :string, :binary, :boolean ]
18
+ options = take_options!(args)
19
+ args.each {|col| column(col, name, options)}
20
+ else
21
+ super
22
+ end
23
+ end
24
+
25
+
26
+ private
27
+
28
+ def take_options!(args)
29
+ args.last.is_a?(Hash) ? args.pop : {}
30
+ end
31
+
32
+ end
33
+
34
+ end