the_jobbook_admin_data 1.3.0a

Sign up to get free protection for your applications and to get access to all the features.
Files changed (174) hide show
  1. data/.gitignore +19 -0
  2. data/CHANGELOG.rdoc +284 -0
  3. data/Gemfile +22 -0
  4. data/Gemfile.lock +121 -0
  5. data/Guardfile +14 -0
  6. data/MIT-LICENSE +20 -0
  7. data/README.md +37 -0
  8. data/README.rdoc +3 -0
  9. data/Rakefile +40 -0
  10. data/admin_data.gemspec +23 -0
  11. data/app/assets/images/add.png +0 -0
  12. data/app/assets/images/admin_data/.gitkeep +0 -0
  13. data/app/assets/images/no.png +0 -0
  14. data/app/assets/images/site.png +0 -0
  15. data/app/assets/images/sort_by_asc.jpg +0 -0
  16. data/app/assets/images/sort_by_desc.jpg +0 -0
  17. data/app/assets/images/sort_by_nothing.jpg +0 -0
  18. data/app/assets/javascripts/admin_data.js +18 -0
  19. data/app/assets/javascripts/admin_data/application.js +15 -0
  20. data/app/assets/javascripts/advance_search/act_on_result.js +45 -0
  21. data/app/assets/javascripts/advance_search/advance_search.js +83 -0
  22. data/app/assets/javascripts/advance_search/advance_search_structure.js +79 -0
  23. data/app/assets/javascripts/advance_search/ajaxify_advance_search.js +28 -0
  24. data/app/assets/javascripts/advance_search/build_first_row.js +8 -0
  25. data/app/assets/javascripts/advance_search/event_bindings.js +76 -0
  26. data/app/assets/javascripts/advance_search/global_ajax_setting.js +10 -0
  27. data/app/assets/javascripts/advance_search/sortby.js +14 -0
  28. data/app/assets/javascripts/advance_search/trigger_submit_on_domready.js +6 -0
  29. data/app/assets/javascripts/analytics/report.js +7 -0
  30. data/app/assets/javascripts/misc/drop_down_change.js +8 -0
  31. data/app/assets/javascripts/misc/js_util.js +58 -0
  32. data/app/assets/javascripts/misc/quick_search_input_focus.js +6 -0
  33. data/app/assets/javascripts/vendor/jquery-1.4.2.js +6240 -0
  34. data/app/assets/javascripts/vendor/jquery-ui-1.7.2.custom.min.js +298 -0
  35. data/app/assets/javascripts/vendor/jquery.ba-isjquery.js +21 -0
  36. data/app/assets/javascripts/vendor/jquery_form.js +814 -0
  37. data/app/assets/javascripts/vendor/log.js +9 -0
  38. data/app/assets/javascripts/vendor/rails.js +132 -0
  39. data/app/assets/stylesheets/admin_data.css +1141 -0
  40. data/app/assets/stylesheets/admin_data/application.css +13 -0
  41. data/app/assets/stylesheets/vendor/jquery-ui-1.7.2.custom.css +406 -0
  42. data/app/controllers/admin_data/application_controller.rb +107 -0
  43. data/app/controllers/admin_data/crud_controller.rb +100 -0
  44. data/app/controllers/admin_data/feed_controller.rb +48 -0
  45. data/app/controllers/admin_data/home_controller.rb +8 -0
  46. data/app/controllers/admin_data/migration_controller.rb +18 -0
  47. data/app/controllers/admin_data/public_controller.rb +28 -0
  48. data/app/controllers/admin_data/search_controller.rb +143 -0
  49. data/app/controllers/admin_data/table_structure_controller.rb +25 -0
  50. data/app/helpers/admin_data/application_helper.rb +320 -0
  51. data/app/views/admin_data/crud/association/_association_info.html.erb +11 -0
  52. data/app/views/admin_data/crud/association/_belongs_to_info.html.erb +7 -0
  53. data/app/views/admin_data/crud/association/_habtm_info.html.erb +7 -0
  54. data/app/views/admin_data/crud/association/_has_many_info.html.erb +7 -0
  55. data/app/views/admin_data/crud/association/_has_one_info.html.erb +6 -0
  56. data/app/views/admin_data/crud/edit.html.erb +36 -0
  57. data/app/views/admin_data/crud/misc/_form.html.erb +38 -0
  58. data/app/views/admin_data/crud/misc/_modify_record.html.erb +18 -0
  59. data/app/views/admin_data/crud/new.html.erb +25 -0
  60. data/app/views/admin_data/crud/show.html.erb +42 -0
  61. data/app/views/admin_data/feed/index.rss.builder +25 -0
  62. data/app/views/admin_data/home/index.html.erb +21 -0
  63. data/app/views/admin_data/migration/index.html.erb +18 -0
  64. data/app/views/admin_data/migration/jstest.html.erb +51 -0
  65. data/app/views/admin_data/search/advance_search.html.erb +1 -0
  66. data/app/views/admin_data/search/quick_search.html.erb +1 -0
  67. data/app/views/admin_data/search/search/_advance_search_form.html.erb +52 -0
  68. data/app/views/admin_data/search/search/_errors.html.erb +5 -0
  69. data/app/views/admin_data/search/search/_listing.html.erb +43 -0
  70. data/app/views/admin_data/search/search/_search_form.html.erb +27 -0
  71. data/app/views/admin_data/search/search/_title.html.erb +34 -0
  72. data/app/views/admin_data/shared/_breadcrum.html.erb +16 -0
  73. data/app/views/admin_data/shared/_drop_down_klasses.html.erb +4 -0
  74. data/app/views/admin_data/shared/_flash_message.html.erb +13 -0
  75. data/app/views/admin_data/shared/_header.html.erb +20 -0
  76. data/app/views/admin_data/shared/_powered_by.html.erb +6 -0
  77. data/app/views/admin_data/shared/_secondary_navigation.html.erb +26 -0
  78. data/app/views/admin_data/table_structure/index.html.erb +54 -0
  79. data/app/views/layouts/admin_data.html.erb +34 -0
  80. data/app/views/layouts/admin_data/application.html.erb +14 -0
  81. data/app/views/layouts/search.html.erb +71 -0
  82. data/config/routes.rb +32 -0
  83. data/lib/admin_data.rb +27 -0
  84. data/lib/admin_data/active_record_util.rb +102 -0
  85. data/lib/admin_data/analytics.rb +176 -0
  86. data/lib/admin_data/authenticator.rb +15 -0
  87. data/lib/admin_data/config.rb +38 -0
  88. data/lib/admin_data/configuration.rb +127 -0
  89. data/lib/admin_data/date_util.rb +58 -0
  90. data/lib/admin_data/engine.rb +17 -0
  91. data/lib/admin_data/model_finder.rb +15 -0
  92. data/lib/admin_data/rails_version_check.rb +8 -0
  93. data/lib/admin_data/search.rb +188 -0
  94. data/lib/admin_data/setup_config.rb +24 -0
  95. data/lib/admin_data/util.rb +102 -0
  96. data/lib/admin_data/version.rb +3 -0
  97. data/lib/tasks/admin_data_tasks.rake +4 -0
  98. data/script/rails +8 -0
  99. data/test/admin_data_test.rb +7 -0
  100. data/test/dummy/README.md +19 -0
  101. data/test/dummy/Rakefile +7 -0
  102. data/test/dummy/app/controllers/application_controller.rb +3 -0
  103. data/test/dummy/app/helpers/application_helper.rb +5 -0
  104. data/test/dummy/app/models/user.rb +3 -0
  105. data/test/dummy/app/models/user/student.rb +2 -0
  106. data/test/dummy/app/views/layouts/application.html.erb +14 -0
  107. data/test/dummy/config.ru +4 -0
  108. data/test/dummy/config/application.rb +15 -0
  109. data/test/dummy/config/boot.rb +13 -0
  110. data/test/dummy/config/cucumber.yml +9 -0
  111. data/test/dummy/config/database.yml +25 -0
  112. data/test/dummy/config/database.yml.mysql +22 -0
  113. data/test/dummy/config/database.yml.pg +15 -0
  114. data/test/dummy/config/database.yml.sqlite3 +25 -0
  115. data/test/dummy/config/environment.rb +5 -0
  116. data/test/dummy/config/environments/development.rb +22 -0
  117. data/test/dummy/config/environments/production.rb +49 -0
  118. data/test/dummy/config/environments/test.rb +35 -0
  119. data/test/dummy/config/initializers/admin_data.rb +15 -0
  120. data/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
  121. data/test/dummy/config/initializers/empty_spaces_to_nil.rb +10 -0
  122. data/test/dummy/config/initializers/inflections.rb +10 -0
  123. data/test/dummy/config/initializers/mime_types.rb +5 -0
  124. data/test/dummy/config/initializers/secret_token.rb +7 -0
  125. data/test/dummy/config/initializers/session_store.rb +8 -0
  126. data/test/dummy/config/locales/en.yml +5 -0
  127. data/test/dummy/config/routes.rb +9 -0
  128. data/test/dummy/db/development.sqlite3 +0 -0
  129. data/test/dummy/db/migrate/20091030202259_create_tables.rb +72 -0
  130. data/test/dummy/db/production.sqlite3 +1 -0
  131. data/test/dummy/db/schema.rb +23 -0
  132. data/test/dummy/db/seeds.rb +40 -0
  133. data/test/dummy/db/test.sqlite3 +0 -0
  134. data/test/dummy/features/advance_search/boolean.feature +74 -0
  135. data/test/dummy/features/advance_search/datetime.feature +101 -0
  136. data/test/dummy/features/advance_search/delete_all.feature +20 -0
  137. data/test/dummy/features/advance_search/destroy_all.feature +20 -0
  138. data/test/dummy/features/advance_search/integer.feature +69 -0
  139. data/test/dummy/features/advance_search/multiple_rows.feature +87 -0
  140. data/test/dummy/features/advance_search/string.feature +130 -0
  141. data/test/dummy/features/crud.feature +50 -0
  142. data/test/dummy/features/crud_show.feature +56 -0
  143. data/test/dummy/features/feed.feature +13 -0
  144. data/test/dummy/features/home.feature +42 -0
  145. data/test/dummy/features/migration.feature +7 -0
  146. data/test/dummy/features/quick_search.feature +113 -0
  147. data/test/dummy/features/step_definitions/advance_search_steps.rb +13 -0
  148. data/test/dummy/features/step_definitions/app_steps.rb +36 -0
  149. data/test/dummy/features/step_definitions/async.rb +18 -0
  150. data/test/dummy/features/step_definitions/configuration_steps.rb +61 -0
  151. data/test/dummy/features/step_definitions/crud_show_steps.rb +37 -0
  152. data/test/dummy/features/step_definitions/feed_steps.rb +24 -0
  153. data/test/dummy/features/step_definitions/quick_search_steps.rb +68 -0
  154. data/test/dummy/features/step_definitions/util.rb +90 -0
  155. data/test/dummy/features/step_definitions/web_steps.rb +219 -0
  156. data/test/dummy/features/support/env.rb +66 -0
  157. data/test/dummy/features/support/hooks.rb +9 -0
  158. data/test/dummy/features/support/paths.rb +33 -0
  159. data/test/dummy/features/table_structure.feature +18 -0
  160. data/test/dummy/lib/tasks/.gitkeep +0 -0
  161. data/test/dummy/lib/tasks/cucumber.rake +53 -0
  162. data/test/dummy/lib/tasks/dbs.rake +30 -0
  163. data/test/dummy/lib/tasks/sample_cars.rake +18 -0
  164. data/test/dummy/public/.gitkeep +0 -0
  165. data/test/dummy/script/cucumber +10 -0
  166. data/test/dummy/script/rails +6 -0
  167. data/test/dummy/test/factories.rb +30 -0
  168. data/test/dummy/test/test_helper.rb +7 -0
  169. data/test/integration/navigation_test.rb +10 -0
  170. data/test/test_helper.rb +15 -0
  171. data/test/unit/admin_data/model_finder_test.rb +16 -0
  172. data/test/unit/car_test.rb +96 -0
  173. data/test/unit/user_phone_test.rb +19 -0
  174. metadata +253 -0
@@ -0,0 +1,8 @@
1
+ unless Rails.version >= '3.0'
2
+ msg = []
3
+ msg << "It seems you are not using Rails 3."
4
+ msg << "Please see documentation at"
5
+ msg << "http://github.com/neerajdotname/admin_data/wiki"
6
+ msg << "to find out how to use this gem with rails 2.3.x"
7
+ raise msg.join(' ')
8
+ end
@@ -0,0 +1,188 @@
1
+ module AdminData
2
+ module Search
3
+
4
+ class Dbbase
5
+ def initialize(operands, table_name, field_name, operator)
6
+ @operands = operands
7
+ @table_name = table_name
8
+ @field_name = field_name
9
+ @operator = operator
10
+ end
11
+
12
+ def like_operator
13
+ 'LIKE'
14
+ end
15
+
16
+ def sql_field_name
17
+ "#{@table_name}.#{@field_name}"
18
+ end
19
+
20
+ def operands
21
+ @operands
22
+ end
23
+ end
24
+
25
+ class PostgresqlSpecific < Dbbase
26
+ def like_operator
27
+ 'ILIKE'
28
+ end
29
+ end
30
+
31
+ class OracleSpecific < Dbbase
32
+ def sql_field_name
33
+ result = super
34
+ %w(contains is_exactly does_not_contain).include?(@operator) ? "upper(#{result})" : result
35
+ end
36
+
37
+ def operands
38
+ result = super
39
+ %w(contains is_exactly does_not_contain).include?(@operator) ? result.upcase : result
40
+ end
41
+ end
42
+
43
+ class Term
44
+
45
+ attr_accessor :error, :table_name, :field, :operator, :operands, :dbbase
46
+
47
+ def initialize(klass, value, search_type)
48
+ @table_name = klass.table_name
49
+ compute_search_fields(value)
50
+
51
+ adapter = AdminData.config.adapter_name.downcase
52
+ if adapter =~ /postgresql/
53
+ self.dbbase = PostgresqlSpecific.new(@operands, table_name, field, operator)
54
+ elsif adapter =~ /oracle/
55
+ self.dbbase = OracleSpecific.new(@operands, table_name, field, operator)
56
+ else
57
+ self.dbbase = Dbbase.new(@operands, table_name, field, operator)
58
+ end
59
+ end
60
+
61
+ def attribute_condition
62
+ return if valid? && operand_required? && operands.blank?
63
+ case operator
64
+ when 'contains'
65
+ ["#{sql_field_name} #{like_operator} ?","%#{operands}%"]
66
+
67
+ when 'is_exactly'
68
+ ["#{sql_field_name} = ?", operands]
69
+
70
+ when 'does_not_contain'
71
+ ["#{sql_field_name} IS NULL OR #{sql_field_name} NOT #{like_operator} ?","%#{operands}%"]
72
+
73
+ when 'is_false'
74
+ ["#{sql_field_name} = ?",false]
75
+
76
+ when 'is_true'
77
+ ["#{sql_field_name} = ?",true]
78
+
79
+ when 'is_null'
80
+ ["#{sql_field_name} IS NULL"]
81
+
82
+ when 'is_not_null'
83
+ ["#{sql_field_name} IS NOT NULL"]
84
+
85
+ when 'is_on'
86
+ ["#{sql_field_name} >= ? AND #{sql_field_name} < ?", values_after_cast.beginning_of_day,
87
+ values_after_cast.end_of_day]
88
+
89
+ when 'is_on_or_before_date'
90
+ ["#{sql_field_name} <= ?",values_after_cast.end_of_day]
91
+
92
+ when 'is_on_or_after_date'
93
+ ["#{sql_field_name} >= ?",values_after_cast.beginning_of_day]
94
+
95
+ when 'is_equal_to'
96
+ ["#{sql_field_name} = ?",values_after_cast]
97
+
98
+ when 'greater_than'
99
+ ["#{sql_field_name} > ?",values_after_cast]
100
+
101
+ when 'less_than'
102
+ ["#{sql_field_name} < ?",values_after_cast]
103
+
104
+ else
105
+ # it means user did not select anything in operator. Ignore it.
106
+ end
107
+ end
108
+
109
+ def valid?
110
+ @error = nil
111
+ @error = validate
112
+ @error.blank?
113
+ end
114
+
115
+ private
116
+
117
+ def like_operator
118
+ dbbase.like_operator
119
+ end
120
+
121
+ def sql_field_name
122
+ dbbase.sql_field_name
123
+ end
124
+
125
+ def operands
126
+ dbbase.operands
127
+ end
128
+
129
+ def operand_required?
130
+ operator =~ /(contains|is_exactly|does_not_contain|is_on |is_on_or_before_date|is_on_or_after_date |greater_than|less_than|is_equal_to)/
131
+ end
132
+
133
+ def compute_search_fields(value)
134
+ @field, @operator, @operands = value.values_at(:col1, :col2, :col3)
135
+ # field value is directly used in the sql statement. So it is important to sanitize it
136
+ @field = @field.gsub(/\W/,'')
137
+ @operands = (@operands.blank? ? @operands : @operands.strip)
138
+ end
139
+
140
+ def values_after_cast
141
+ case operator
142
+ when /(is_on|is_on_or_before_date|is_on_or_after_date)/
143
+ AdminData::DateUtil.parse(operands)
144
+ when /(is_equal_to|greater_than|less_than)/
145
+ operands.to_i
146
+ else
147
+ operands
148
+ end
149
+ end
150
+
151
+ def validate
152
+ case operator
153
+ when /(is_on|is_on_or_before_date|is_on_or_after_date)/
154
+ "#{operands} is not a valid date" unless AdminData::DateUtil.valid?(operands)
155
+ when /(is_equal_to|greater_than|less_than)/
156
+ unless operands.blank?
157
+ "#{operands} is not a valid integer" unless operands =~ /^\d+$/
158
+ end
159
+ end
160
+ end
161
+
162
+ end # end of Term
163
+
164
+
165
+ def build_quick_search_condition( klass, search_term )
166
+ return nil if search_term.blank?
167
+ str_columns = klass.columns.select { |column| column.type.to_s =~ /(string|text)/i }
168
+ conditions = str_columns.collect do |column|
169
+ t = Term.new(klass, {:col1 => column.name, :col2 => 'contains', :col3 => search_term}, 'quick_search')
170
+ t.attribute_condition
171
+ end
172
+ AdminData::Util.or_merge_conditions(klass, *conditions)
173
+ end
174
+
175
+ def build_advance_search_condition(klass, options)
176
+ values = ( options.blank? ? [] : options.values )
177
+ terms = values.collect {|value| Term.new(klass, value, 'advance_search') }
178
+ valid_terms = terms.select{ |t| t.valid? }
179
+ errors = (terms - valid_terms).collect { |t| t.error }
180
+ return {:errors => errors} if errors.any?
181
+
182
+ r = klass.unscoped
183
+ valid_terms.each { |t| r = r.where(t.attribute_condition) }
184
+ { :cond => r }
185
+ end
186
+
187
+ end
188
+ end
@@ -0,0 +1,24 @@
1
+ module AdminData
2
+
3
+ module SetupConfig
4
+ extend ActiveSupport::Concern
5
+
6
+ module ClassMethods
7
+
8
+ # See AdminData::Configuration for details.
9
+ attr_accessor :configuration
10
+
11
+ # Call this method to customize the behavior of admin_data .
12
+ #
13
+ # @example
14
+ # AdminData.config do |config|
15
+ # config.number_of_records_per_page = 20
16
+ # end
17
+ def config
18
+ self.configuration ||= Configuration.new
19
+ block_given? ? yield(configuration) : configuration
20
+ end
21
+ end
22
+
23
+ end
24
+ end
@@ -0,0 +1,102 @@
1
+ module AdminData
2
+ class Util
3
+
4
+ def self.label_values_pair_for(model, view)
5
+ data = model.class.columns.inject([]) do |sum, column|
6
+ tmp = view.get_value_for_column(column, model, :limit => nil)
7
+ sum << [ column.name, (tmp.html_safe? ? tmp : view.send(:h,tmp)) ]
8
+ end
9
+ data
10
+ end
11
+
12
+ def self.custom_value_for_column(column, model)
13
+ # some would say that if I use try method then I will not be raising exception and
14
+ # I agree. However in this case for clarity I would prefer to not to have try after each call
15
+ begin
16
+ column_name = column.respond_to?(:name) ? column.name : column
17
+ tmp = AdminData.config.column_settings[model.class.name.to_s]
18
+ _proc = tmp.fetch(column_name.intern)
19
+ _proc.call(model)
20
+ rescue
21
+ model.send(column_name)
22
+ end
23
+ end
24
+
25
+ def self.get_serialized_value(html, column_value)
26
+ html << %{ <i>Cannot edit serialized field.</i> }
27
+ unless column_value.blank?
28
+ html << %{ <i>Raw contents:</i><br/> }
29
+ html << column_value.inspect
30
+ end
31
+ html.join
32
+ end
33
+
34
+ def self.pluralize(count, text)
35
+ count > 1 ? text+'s' : text
36
+ end
37
+
38
+ # Rails method merge_conditions ANDs all the conditions. I need to ORs all the conditions
39
+ def self.or_merge_conditions(klass, *conditions)
40
+ s = ') OR ('
41
+ cond = conditions.inject([]) do |sum, condition|
42
+ condition.blank? ? sum : sum << klass.send(:sanitize_sql, condition)
43
+ end.compact.join(s)
44
+ "(#{cond})" unless cond.blank?
45
+ end
46
+
47
+ def self.camelize_constantize(klassu)
48
+ klasss = klassu.camelize
49
+ self.constantize_klass(klasss)
50
+ end
51
+
52
+ # klass_name = model_name.sub(/\.rb$/,'').camelize
53
+ # constantize_klass(klass_name)
54
+ def self.constantize_klass(klass_name)
55
+ klass_name.split('::').inject(Object) do |klass, part|
56
+ klass.const_get(part)
57
+ end
58
+ end
59
+
60
+ # Usage: write 'hello world' to tmp/hello.txt file
61
+ # Util.write_to_file('hello world', 'a+', 'tmp', 'hello.txt')
62
+ def self.write_to_file(data, mode, *path)
63
+ path = File.expand_path(Rails.root.join(*path.flatten.compact))
64
+ FileUtils.mkdir_p(File.dirname(path))
65
+ File.open(path, mode) {|fh| fh.puts(data) }
66
+ end
67
+
68
+ def self.string_representation_of_data(value)
69
+ case value
70
+ when BigDecimal
71
+ value.to_s
72
+ when Date, DateTime, Time
73
+ "'#{value.to_s(:db)}'"
74
+ else
75
+ value.inspect
76
+ end
77
+ end
78
+
79
+ def self.build_sort_options(klass, sortby)
80
+ klass.columns.inject('') do |result, column|
81
+ name = column.name
82
+
83
+ selected_text = (sortby == "#{name} desc") ? "selected='selected'" : ''
84
+ result << "<option value='#{name} desc' #{selected_text}>#{name} desc</option>"
85
+
86
+ selected_text = (sortby == "#{name} asc") ? "selected='selected'" : ''
87
+ result << "<option value='#{name} asc' #{selected_text}>#{name} asc</option>"
88
+ end.html_safe
89
+ end
90
+
91
+ def self.associations_for(klass, association_type)
92
+ klass.name.camelize.constantize.reflections.values.select do |value|
93
+ value.macro == association_type
94
+ end
95
+ end
96
+
97
+ def self.exception_info(e)
98
+ "#{e.class}: #{e.message}#$/#{e.backtrace.join($/)}"
99
+ end
100
+
101
+ end
102
+ end
@@ -0,0 +1,3 @@
1
+ module AdminData
2
+ VERSION = "1.3.0a"
3
+ end
@@ -0,0 +1,4 @@
1
+ # desc "Explaining what the task does"
2
+ # task :admin_data do
3
+ # # Task goes here
4
+ # end
data/script/rails ADDED
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env ruby
2
+ # This command will automatically be run when you run "rails" with Rails 3 gems installed from the root of your application.
3
+
4
+ ENGINE_ROOT = File.expand_path('../..', __FILE__)
5
+ ENGINE_PATH = File.expand_path('../../lib/admin_data/engine', __FILE__)
6
+
7
+ require 'rails/all'
8
+ require 'rails/engine/commands'
@@ -0,0 +1,7 @@
1
+ require 'test_helper'
2
+
3
+ class AdminDataTest < ActiveSupport::TestCase
4
+ test "truth" do
5
+ assert_kind_of Module, AdminData
6
+ end
7
+ end
@@ -0,0 +1,19 @@
1
+ # Test setup #
2
+
3
+ bundle install
4
+ rake db:migrate
5
+ rake db:test:prepare
6
+
7
+ # Cucumber test #
8
+
9
+ bundle exec cucumber
10
+
11
+ # Unit test #
12
+
13
+ ruby -I test test/unit/car_test.rb
14
+
15
+ # Switch database #
16
+
17
+ rake db:use:pg
18
+ rake db:use:sqlite3
19
+ rake db:use:mysql
@@ -0,0 +1,7 @@
1
+ # Add your own tasks in files placed in lib/tasks ending in .rake,
2
+ # for example lib/tasks/capistrano.rake, and they will automatically be available to Rake.
3
+
4
+ require File.expand_path('../config/application', __FILE__)
5
+ require 'rake'
6
+
7
+ AdminDataDemo::Application.load_tasks
@@ -0,0 +1,3 @@
1
+ class ApplicationController < ActionController::Base
2
+ protect_from_forgery
3
+ end
@@ -0,0 +1,5 @@
1
+ module ApplicationHelper
2
+ def foo
3
+ "inside main app"
4
+ end
5
+ end
@@ -0,0 +1,3 @@
1
+ class User < ActiveRecord::Base
2
+
3
+ end
@@ -0,0 +1,2 @@
1
+ class User::Student < User
2
+ end
@@ -0,0 +1,14 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <title>AdminDataDemo</title>
5
+ <%= stylesheet_link_tag :all %>
6
+ <%= javascript_include_tag :defaults %>
7
+ <%= csrf_meta_tag %>
8
+ </head>
9
+ <body>
10
+
11
+ <%= yield %>
12
+
13
+ </body>
14
+ </html>
@@ -0,0 +1,4 @@
1
+ # This file is used by Rack-based servers to start the application.
2
+
3
+ require ::File.expand_path('../config/environment', __FILE__)
4
+ run AdminDataDemo::Application
@@ -0,0 +1,15 @@
1
+ require File.expand_path('../boot', __FILE__)
2
+
3
+ require 'rails/all'
4
+
5
+ # If you have a Gemfile, require the gems listed there, including any gems
6
+ # you've limited to :test, :development, or :production.
7
+ Bundler.require(:default, Rails.env) if defined?(Bundler)
8
+
9
+ module AdminDataDemo
10
+ class Application < Rails::Application
11
+ config.time_zone = 'Central Time (US & Canada)'
12
+ config.encoding = "utf-8"
13
+ config.filter_parameters += [:password]
14
+ end
15
+ end