mack 0.7.1.1 → 0.8.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.
Files changed (76) hide show
  1. data/CHANGELOG +32 -0
  2. data/bin/gem_load_path.rb +1 -1
  3. data/bin/mackery +0 -1
  4. data/bin/mackery-server +5 -1
  5. data/lib/mack/assets/asset_helpers.rb +51 -0
  6. data/lib/mack/assets/assets_mgr.rb +165 -0
  7. data/lib/mack/controller/controller.rb +4 -4
  8. data/lib/mack/controller/cookie_jar.rb +1 -1
  9. data/lib/mack/controller/request.rb +13 -3
  10. data/lib/mack/controller/response.rb +12 -0
  11. data/lib/mack/core_extensions/kernel.rb +69 -0
  12. data/lib/mack/core_extensions/symbol.rb +4 -0
  13. data/lib/mack/errors/errors.rb +5 -1
  14. data/lib/mack/generators/controller_generator/manifest.yml +2 -2
  15. data/lib/mack/generators/controller_helper_generator/manifest.yml +2 -2
  16. data/lib/mack/generators/mack_application_generator/manifest.yml +10 -2
  17. data/lib/mack/generators/mack_application_generator/templates/config/{app_config/default.yml.template → configatron/default.rb.template} +10 -15
  18. data/lib/mack/generators/mack_application_generator/templates/config/{app_config/development.yml.template → configatron/development.rb.template} +1 -1
  19. data/lib/mack/generators/mack_application_generator/templates/config/{app_config/production.yml.template → configatron/production.rb.template} +0 -0
  20. data/lib/mack/generators/mack_application_generator/templates/config/{app_config/test.yml.template → configatron/test.rb.template} +1 -1
  21. data/lib/mack/generators/mack_application_generator/templates/public/404.html.template +15 -0
  22. data/lib/mack/generators/mack_application_generator/templates/public/500.html.template +15 -0
  23. data/lib/mack/generators/view_helper_generator/manifest.yml +2 -2
  24. data/lib/mack/initialization/application.rb +9 -5
  25. data/lib/mack/initialization/boot_loader.rb +2 -104
  26. data/lib/mack/initialization/configuration.rb +72 -69
  27. data/lib/mack/initialization/console.rb +1 -1
  28. data/lib/mack/initialization/helpers.rb +1 -6
  29. data/lib/mack/initialization/logging/basic_layout.rb +14 -0
  30. data/lib/mack/initialization/logging/color_layout.rb +23 -0
  31. data/lib/mack/initialization/logging/filter.rb +45 -0
  32. data/lib/mack/initialization/logging.rb +33 -89
  33. data/lib/mack/initialization/plugins.rb +1 -1
  34. data/lib/mack/rendering/engine/builder.rb +3 -0
  35. data/lib/mack/rendering/engine/erubis.rb +28 -16
  36. data/lib/mack/rendering/type/file_base.rb +1 -1
  37. data/lib/mack/rendering/type/url.rb +3 -3
  38. data/lib/mack/rendering/view_template.rb +4 -7
  39. data/lib/mack/routing/resource_proxy.rb +33 -0
  40. data/lib/mack/routing/route_map.rb +122 -288
  41. data/lib/mack/routing/route_object.rb +88 -0
  42. data/lib/mack/routing/routes.rb +169 -0
  43. data/lib/mack/routing/urls.rb +39 -5
  44. data/lib/mack/runner.rb +65 -32
  45. data/lib/mack/runner_helpers/request_logger.rb +3 -3
  46. data/lib/mack/runner_helpers/session.rb +4 -4
  47. data/lib/mack/sessions/cookie_session_store.rb +3 -3
  48. data/lib/mack/sessions/session.rb +1 -1
  49. data/lib/mack/sessions/session_store_base.rb +1 -1
  50. data/lib/mack/tasks/gem_tasks.rake +156 -1
  51. data/lib/mack/tasks/mack_dump_tasks.rake +1 -1
  52. data/lib/mack/tasks/mack_update_tasks.rake +85 -1
  53. data/lib/mack/tasks/rake_rules.rake +6 -0
  54. data/lib/mack/tasks/test_tasks.rake +4 -4
  55. data/lib/mack/testing/helpers.rb +13 -6
  56. data/lib/mack/testing/rspec.rb +27 -9
  57. data/lib/mack/testing/test_case.rb +1 -1
  58. data/lib/mack/utils/ansi/ansi_color.rb +4 -1
  59. data/lib/mack/utils/forgery_detector.rb +3 -3
  60. data/lib/mack/utils/http_status_codes.rb +19 -0
  61. data/lib/mack/utils/http_status_codes.yml +55 -0
  62. data/lib/mack/utils/paths.rb +32 -32
  63. data/lib/mack/utils/reloader.rb +60 -0
  64. data/lib/mack/utils/server.rb +3 -3
  65. data/lib/mack/version.rb +1 -1
  66. data/lib/mack/view_helpers/all_helpers.rb +7 -0
  67. data/lib/mack/view_helpers/date_time_helpers.rb +16 -10
  68. data/lib/mack/view_helpers/form_helpers.rb +1 -1
  69. data/lib/mack/view_helpers/html_helpers.rb +22 -1
  70. data/lib/mack/view_helpers/link_helpers.rb +51 -10
  71. data/lib/mack/view_helpers/string_helpers.rb +1 -1
  72. data/lib/mack.rb +0 -1
  73. data/lib/mack_core.rb +8 -8
  74. data/lib/mack_tasks.rb +1 -1
  75. metadata +27 -15
  76. data/lib/mack/view_helpers/asset_helpers.rb +0 -50
@@ -2,6 +2,24 @@ namespace :mack do
2
2
 
3
3
  namespace :update do
4
4
 
5
+ desc "Convert application configuration yml file into Configatron file"
6
+ task :configuration do
7
+ file = ENV['FILE'] || ENV['file'] || File.join(Mack.root, "config", "app_config")
8
+ raise "Cannot find: #{file}" if !File.exists?(file)
9
+ if File.directory?(file)
10
+ Dir.glob(File.join(file, "**", "*.yml")).each do |f|
11
+ convert_config_file(f)
12
+ end
13
+ else
14
+ raise "Cannot convert non-yml file: #{file}" if File.extname(file) != ".yml"
15
+ convert_config_file(file)
16
+ end
17
+
18
+ puts "\nPlease note that you still have access to the pre-converted yml file(s)."
19
+ end
20
+
21
+
22
+
5
23
  # desc "Renames thin.ru to rackup.ru and updates your thin.yml, if necessary."
6
24
  # task :rackup do
7
25
  # require 'fileutils'
@@ -22,5 +40,71 @@ namespace :mack do
22
40
  end
23
41
 
24
42
  end
43
+ # alias_task "mack:update", "mack:update:rackup"
44
+
45
+ private
46
+
47
+ # ----- Helper methods for Configuration Updater -------- #
48
+ def convert_config_file(file)
49
+ print "Converting: #{File.basename(file)}..."
50
+ dest_file = file.gsub(".yml", ".rb").gsub('app_config', 'configatron')
51
+ bak_file = file
52
+ hash = YAML.load(File.read(file))
53
+ config_list = (hash) ? hash_to_configatron(hash) : []
54
+ data = ""
55
+ config_list.each do |line|
56
+ line = update_data(line)
57
+ data += (line + "\n")
58
+ end
59
+ FileUtils.mkdir_p(File.dirname(dest_file))
60
+ File.open(dest_file, "w") { |f| f.write(data.to_s) }
61
+ puts "done."
62
+ end
63
+
64
+ def update_data(old_data)
65
+ updates = {
66
+ "configatron.mack.log_level" => "configatron.mack.log.level",
67
+ "configatron.run_remote_tests" => "configatron.mack.run_remote_tests",
68
+ "configatron.mack.log.db_color" => "configatron.mack.log.colors.db",
69
+ "configatron.mack.log.error_color" => "configatron.mack.log.colors.error",
70
+ "configatron.mack.log.completed_color" => "configatron.mack.log.colors.completed",
71
+ "configatron.base_language" => "configatron.mack.localization.base_language",
72
+ "configatron.supported_languages" => "configatron.mack.localization.supported_languages",
73
+ "configatron.char_encoding" => "configatron.mack.localization.char_encoding",
74
+ "configatron.dynamic_translation" => "configatron.mack.localization.dynamic_translation",
75
+ "configatron.content_expiry" => "configatron.mack.localization.content_expiry",
76
+ "configatron.mack.share_routes" => "configatron.mack.distributed.share_routes",
77
+ "configatron.mack.share_objects" => "configatron.mack.distributed.share_objects",
78
+ "configatron.mack.share_views" => "configatron.mack.distributed.share_views",
79
+ "configatron.mack.distributed_app_name" => "configatron.mack.distributed.app_name",
80
+ "configatron.mack.distributed_site_domain" => "configatron.mack.distributed.site_domain",
81
+ "configatron.mack.drb_timeout" => "configatron.mack.distributed.timeout"
82
+ }
83
+
84
+ key = old_data.split("=").first
85
+ if updates.has_key?(key)
86
+ return old_data.gsub(key, updates[key])
87
+ else
88
+ return old_data
89
+ end
90
+ end
91
+
92
+ def cleanup_key(key)
93
+ if key.is_a?Symbol
94
+ mod_key = key.to_s.gsub("::", ".").to_sym
95
+ else
96
+ mod_key = key.gsub("::", ".")
97
+ end
98
+ end
25
99
 
26
- # alias_task "mack:update", "mack:update:rackup"
100
+ def hash_to_configatron(hash, configs = [], current_config = "configatron")
101
+ hash.each_key do |key|
102
+ if hash[key].is_a?Hash
103
+ hash_to_configatron(hash[key], configs, (current_config + ".#{cleanup_key(key)}"))
104
+ else
105
+ configs << current_config + ".#{cleanup_key(key)} = #{hash[key].inspect}"
106
+ end
107
+ end
108
+ return configs
109
+ end
110
+ # ----- END:: Helper methods for Configuration Updater -------- #
@@ -30,4 +30,10 @@ rule /^generate:/ do |t|
30
30
  Rake::Task["environment"].invoke
31
31
  klass = "#{klass.camelcase}Generator"
32
32
  gen = klass.constantize.run(ENV.to_hash)
33
+ end
34
+
35
+ rule /^gems:freeze:/ do |t|
36
+ gem_name = t.name.gsub('gems:freeze:', '')
37
+ ENV['gem_name'] = gem_name
38
+ Rake::Task["gems:install_and_freeze"].invoke
33
39
  end
@@ -13,7 +13,7 @@ namespace :test do
13
13
  require File.join(File.dirname(__FILE__), '..', 'initialization', 'configuration')
14
14
  Mack::BootLoader.run(:configuration)
15
15
  t.libs << "test"
16
- t.pattern = app_config.mack.send("#{app_config.mack.testing_framework}_file_pattern")
16
+ t.pattern = configatron.mack.send("#{configatron.mack.testing_framework}_file_pattern")
17
17
  t.verbose = true
18
18
  end
19
19
 
@@ -22,7 +22,7 @@ namespace :test do
22
22
  require File.join(File.dirname(__FILE__), '..', 'initialization', 'configuration')
23
23
  Mack::BootLoader.run(:configuration)
24
24
  t.spec_opts << '--options' << 'test/spec.opts' if File.exists?('test/spec.opts')
25
- t.spec_files = Dir.glob(app_config.mack.send("#{app_config.mack.testing_framework}_file_pattern"))
25
+ t.spec_files = Dir.glob(configatron.mack.send("#{configatron.mack.testing_framework}_file_pattern"))
26
26
  end
27
27
 
28
28
  desc "Report code statistics (KLOCs, etc) from the application. Requires the rcov gem."
@@ -73,7 +73,7 @@ namespace :test do
73
73
  end
74
74
 
75
75
  puts "Generating... please wait..."
76
- res = `#{rcov} --html #{app_config.mack.send("#{app_config.mack.testing_framework}_file_pattern")}`
76
+ res = `#{rcov} --html #{configatron.mack.send("#{configatron.mack.testing_framework}_file_pattern")}`
77
77
  res
78
78
  end
79
79
 
@@ -84,7 +84,7 @@ task :default do
84
84
  Mack::BootLoader.run(:configuration)
85
85
  tf = "rspec"
86
86
  begin
87
- tf = app_config.mack.testing_framework
87
+ tf = configatron.mack.testing_framework
88
88
  rescue Exception => e
89
89
  end
90
90
  Rake::Task["test:setup"].invoke
@@ -12,6 +12,13 @@ if Mack.env == "test"
12
12
  end # Session
13
13
  end # RunnerHelpers
14
14
  end # Mack
15
+ module Rack # :nodoc:
16
+ class MockRequest # :nodoc:
17
+ def method_missing(sym, *args)
18
+ @app.instance_variable_get("@app").instance_variable_get("@request").send(sym, *args)
19
+ end
20
+ end
21
+ end
15
22
  end
16
23
  #++
17
24
 
@@ -22,13 +29,13 @@ module Mack
22
29
  # Temporarily changes the application configuration. Changes are reverted after
23
30
  # the yield returns.
24
31
  def temp_app_config(options = {})
25
- app_config.load_hash(options, String.randomize)
26
- yield
27
- app_config.revert
32
+ configatron.temp(options) do
33
+ yield
34
+ end
28
35
  end
29
36
 
30
37
  def remote_test # :nodoc:
31
- if (app_config.run_remote_tests)
38
+ if (configatron.mack.run_remote_tests)
32
39
  yield
33
40
  end
34
41
  end
@@ -93,7 +100,7 @@ module Mack
93
100
  sess = Mack::SessionStore.get($current_session_id, nil, nil, nil)
94
101
  if sess.nil?
95
102
  id = String.randomize(40).downcase
96
- set_cookie(app_config.mack.session_id, id)
103
+ set_cookie(configatron.mack.session_id, id)
97
104
  sess = Mack::Session.new(id)
98
105
  Mack::SessionStore.store.direct_set(id, sess)
99
106
  $current_session_id = id
@@ -194,7 +201,7 @@ module Mack
194
201
  spt = ck.split("=")
195
202
  name = spt.first
196
203
  value = spt.last
197
- if name == app_config.mack.session_id
204
+ if name == configatron.mack.session_id
198
205
  value = nil unless @_mack_in_session
199
206
  end
200
207
  set_cookie(name, value)
@@ -7,16 +7,11 @@ module Spec # :nodoc:
7
7
  include Mack::Routes::Urls
8
8
  include Mack::Testing::Helpers
9
9
 
10
- alias_method :mack_run_with_description_capturing, :run_with_description_capturing
10
+ alias_instance_method :eval_block, :mack_eval_block
11
11
 
12
- def run_with_description_capturing
13
- begin
14
- in_session do
15
- instance_eval(&(@_implementation || PENDING_EXAMPLE_BLOCK))
16
- end
17
- ensure
18
- @_matcher_description = Spec::Matchers.generated_description
19
- Spec::Matchers.clear_generated_description
12
+ def eval_block
13
+ in_session do
14
+ mack_eval_block
20
15
  end
21
16
  end
22
17
 
@@ -30,4 +25,27 @@ module Spec # :nodoc:
30
25
  end
31
26
  end # Matchers
32
27
 
28
+ # require 'spec/runner/formatter/base_text_formatter'
29
+ # module Runner # :nodoc:
30
+ # module Formatter # :nodoc:
31
+ # class BaseTextFormatter < BaseFormatter # :nodoc:
32
+ #
33
+ # def dump_pending
34
+ # unless @pending_examples.empty?
35
+ # @output.puts
36
+ # @output.puts yellow("Pending:")
37
+ # @pending_examples.each do |pending_example|
38
+ # @output.puts yellow("#{pending_example[0]} (#{pending_example[1]})")
39
+ # # @output.puts " Called from #{pending_example[2]}"
40
+ # end
41
+ # end
42
+ # @output.flush
43
+ # end
44
+ #
45
+ # end # BaseTextFormatter
46
+ # end # Formatter
47
+ # end # Runner
48
+
33
49
  end # Spec
50
+
51
+
@@ -8,7 +8,7 @@ module Test # :nodoc:
8
8
 
9
9
  # Let's alias the run method in the class above us so we can create a new one here
10
10
  # but still reference it.
11
- alias_method :super_run, :run # :nodoc:
11
+ alias_instance_method :run, :super_run # :nodoc:
12
12
 
13
13
  # We need to wrap the run method so we can do things like
14
14
  # run a cleanup method if it exists
@@ -5,7 +5,10 @@ module Mack
5
5
  module Color
6
6
 
7
7
  def self.wrap(color, string)
8
- "\e[#{Mack::Utils::Ansi::ColorRegistry.registered_items[color.to_sym] || 0}m#{string}\e[0m"
8
+ if configatron.mack.log.use_colors
9
+ return "\e[#{Mack::Utils::Ansi::ColorRegistry.registered_items[color.to_sym] || 0}m#{string}\e[0m"
10
+ end
11
+ return string
9
12
  end
10
13
 
11
14
  end # Color
@@ -127,9 +127,9 @@ module Mack
127
127
 
128
128
  def valid_request? # :nodoc:
129
129
  return true if !self.class.ignored_actions.empty? and self.skip_action?
130
- return app_config.mack.disable_forgery_detector ||
130
+ return configatron.mack.disable_forgery_detector ||
131
131
  self.skip_action? ||
132
- request.params[:method] == "get" ||
132
+ request.params[:method].to_sym == :get ||
133
133
  (request.params[:__authenticity_token] == authenticity_token)
134
134
  end
135
135
 
@@ -142,7 +142,7 @@ module Mack
142
142
  include Singleton
143
143
 
144
144
  def dispense_token(key) # :nodoc:
145
- salt = app_config.request_authenticity_token_salt || "shh, it's a secret"
145
+ salt = configatron.mack.retrieve(:request_authenticity_token_salt, "shh, it's a secret")
146
146
  salt = "shh, it's a secret" if salt.empty?
147
147
  string_to_hash = key.to_s + salt.to_s
148
148
  Digest::SHA1.hexdigest(string_to_hash)
@@ -0,0 +1,19 @@
1
+ module Mack
2
+ module Utils # :nodoc:
3
+ class HttpStatusCodes < Mack::Utils::RegistryMap
4
+
5
+ def initial_state
6
+ YAML.load(File.read(File.join(File.dirname(__FILE__), 'http_status_codes.yml')))
7
+ end
8
+
9
+ class << self
10
+
11
+ def get(status)
12
+ self.registered_items[status.to_i] || 'UNKNOWN HTTP STATUS'
13
+ end
14
+
15
+ end
16
+
17
+ end # HttpStatusCodes
18
+ end # Utils
19
+ end # Mack
@@ -0,0 +1,55 @@
1
+ 100: Continue
2
+ 101: Switching Protocols
3
+ 102: Processing
4
+ 200: OK
5
+ 201: Created
6
+ 202: Accepted
7
+ 203: Non-Authoritative Information
8
+ 204: No Content
9
+ 205: Reset Content
10
+ 206: Partial Content
11
+ 207: Multi-Status
12
+ 300: Multiple Choices
13
+ 301: Moved Permanently
14
+ 302: Found
15
+ 303: See Other
16
+ 304: Not Modified
17
+ 305: Use Proxy
18
+ 306: Switch Proxy
19
+ 307: Temporary Redirect
20
+ 400: Bad Request
21
+ 401: Unauthorized
22
+ 402: Payment Required
23
+ 403: Forbidden
24
+ 404: Not Found
25
+ 405: Method Not Allowed
26
+ 406: Not Acceptable
27
+ 407: Proxy Authentication Required
28
+ 408: Request Timeout
29
+ 409: Conflict
30
+ 410: Gone
31
+ 404: Not Found
32
+ 411: Length Required
33
+ 412: Precondition Failed
34
+ 413: Request Entity Too Large
35
+ 414: Request-URI Too Long
36
+ 415: Unsupported Media Type
37
+ 416: Requested Range Not Satisfiable
38
+ 417: Expectation Failed
39
+ 418: I'm a Teapot
40
+ 422: Unprocessable Entity
41
+ 423: Locked
42
+ 424: Failed Dependency
43
+ 425: Unordered Collection
44
+ 426: Upgrade Required
45
+ 449: Retry With
46
+ 500: Internal Server Error
47
+ 501: Not Implemented
48
+ 502: Bad Gateway
49
+ 503: Service Unavailable
50
+ 504: Gateway Timeout
51
+ 505: HTTP Version Not Supported
52
+ 506: Variant Also Negotiates
53
+ 507: Insufficient Storage
54
+ 509: Bandwidth Limit Exceeded
55
+ 510: Not Extended
@@ -3,151 +3,151 @@ module Mack
3
3
 
4
4
  # <MACK_PROJECT_ROOT>
5
5
  def self.root(*files)
6
- File.join(Mack.root, files)
6
+ File.join(Mack.root, *files)
7
7
  end
8
8
 
9
9
  # <MACK_PROJECT_ROOT>/public
10
10
  def self.public(*files)
11
- Mack::Paths.root("public", files)
11
+ Mack::Paths.root("public", *files)
12
12
  end
13
13
 
14
14
  # <MACK_PROJECT_ROOT>/public/images
15
15
  def self.images(*files)
16
- Mack::Paths.public("images", files)
16
+ Mack::Paths.public("images", *files)
17
17
  end
18
18
 
19
19
  # <MACK_PROJECT_ROOT>/public/javascripts
20
20
  def self.javascripts(*files)
21
- Mack::Paths.public("javascripts", files)
21
+ Mack::Paths.public("javascripts", *files)
22
22
  end
23
23
 
24
24
  # <MACK_PROJECT_ROOT>/public/stylesheets
25
25
  def self.stylesheets(*files)
26
- Mack::Paths.public("stylesheets", files)
26
+ Mack::Paths.public("stylesheets", *files)
27
27
  end
28
28
 
29
29
  # <MACK_PROJECT_ROOT>/app
30
30
  def self.app(*files)
31
- Mack::Paths.root("app", files)
31
+ Mack::Paths.root("app", *files)
32
32
  end
33
33
 
34
34
  # <MACK_PROJECT_ROOT>/log
35
35
  def self.log(*files)
36
- Mack::Paths.root("log", files)
36
+ Mack::Paths.root("log", *files)
37
37
  end
38
38
 
39
39
  # <MACK_PROJECT_ROOT>/test
40
40
  def self.test(*files)
41
- Mack::Paths.root("test", files)
41
+ Mack::Paths.root("test", *files)
42
42
  end
43
43
 
44
44
  # <MACK_PROJECT_ROOT>/tmp
45
45
  def self.tmp(*files)
46
- Mack::Paths.root("tmp", files)
46
+ Mack::Paths.root("tmp", *files)
47
47
  end
48
48
 
49
49
  # <MACK_PROJECT_ROOT>/test/models
50
50
  def self.model_tests(*files)
51
- Mack::Paths.test("models", files)
51
+ Mack::Paths.test("models", *files)
52
52
  end
53
53
 
54
54
  # <MACK_PROJECT_ROOT>/test/controllers
55
55
  def self.controller_tests(*files)
56
- Mack::Paths.test("controllers", files)
56
+ Mack::Paths.test("controllers", *files)
57
57
  end
58
58
 
59
59
  def self.test_helpers(*files)
60
- Mack::Paths.test("helpers", files)
60
+ Mack::Paths.test("helpers", *files)
61
61
  end
62
62
 
63
63
  # <MACK_PROJECT_ROOT>/test/helpers/controllers
64
64
  def self.controller_helper_tests(*files)
65
- Mack::Paths.test_helpers("controllers", files)
65
+ Mack::Paths.test_helpers("controllers", *files)
66
66
  end
67
67
 
68
68
  # <MACK_PROJECT_ROOT>/test/helpers/views
69
69
  def self.view_helper_tests(*files)
70
- Mack::Paths.test_helpers("views", files)
70
+ Mack::Paths.test_helpers("views", *files)
71
71
  end
72
72
 
73
73
  # <MACK_PROJECT_ROOT>/app/views
74
74
  def self.views(*files)
75
- Mack::Paths.app("views", files)
75
+ Mack::Paths.app("views", *files)
76
76
  end
77
77
 
78
78
  # <MACK_PROJECT_ROOT>/app/views/layouts
79
79
  def self.layouts(*files)
80
- Mack::Paths.views("layouts", files)
80
+ Mack::Paths.views("layouts", *files)
81
81
  end
82
82
 
83
83
  # <MACK_PROJECT_ROOT>/app/controllers
84
84
  def self.controllers(*files)
85
- Mack::Paths.app("controllers", files)
85
+ Mack::Paths.app("controllers", *files)
86
86
  end
87
87
 
88
88
  # <MACK_PROJECT_ROOT>/app/models
89
89
  def self.models(*files)
90
- Mack::Paths.app("models", files)
90
+ Mack::Paths.app("models", *files)
91
91
  end
92
92
 
93
93
  # <MACK_PROJECT_ROOT>/app/helpers
94
94
  def self.helpers(*files)
95
- Mack::Paths.app("helpers", files)
95
+ Mack::Paths.app("helpers", *files)
96
96
  end
97
97
 
98
98
  # <MACK_PROJECT_ROOT>/app/helpers/controllers
99
99
  def self.controller_helpers(*files)
100
- Mack::Paths.helpers("controllers", files)
100
+ Mack::Paths.helpers("controllers", *files)
101
101
  end
102
102
 
103
103
  # <MACK_PROJECT_ROOT>/app/helpers/views
104
104
  def self.view_helpers(*files)
105
- Mack::Paths.helpers("views", files)
105
+ Mack::Paths.helpers("views", *files)
106
106
  end
107
107
 
108
108
  # <MACK_PROJECT_ROOT>/lib
109
109
  def self.lib(*files)
110
- Mack::Paths.root("lib", files)
110
+ Mack::Paths.root("lib", *files)
111
111
  end
112
112
 
113
113
  # <MACK_PROJECT_ROOT>/lib/tasks
114
114
  def self.tasks(*files)
115
- Mack::Paths.lib("tasks", files)
115
+ Mack::Paths.lib("tasks", *files)
116
116
  end
117
117
 
118
118
  # <MACK_PROJECT_ROOT>/db
119
119
  def self.db(*files)
120
- Mack::Paths.root("db", files)
120
+ Mack::Paths.root("db", *files)
121
121
  end
122
122
 
123
123
  # <MACK_PROJECT_ROOT>/db/migrations
124
124
  def self.migrations(*files)
125
- Mack::Paths.db("migrations", files)
125
+ Mack::Paths.db("migrations", *files)
126
126
  end
127
127
 
128
128
  # <MACK_PROJECT_ROOT>/config
129
129
  def self.config(*files)
130
- Mack::Paths.root("config", files)
130
+ Mack::Paths.root("config", *files)
131
131
  end
132
132
 
133
- # <MACK_PROJECT_ROOT>/config/app_config
134
- def self.app_config(*files)
135
- Mack::Paths.config("app_config", files)
133
+ # <MACK_PROJECT_ROOT>/config/configatron
134
+ def self.configatron(*files)
135
+ Mack::Paths.config("configatron", *files)
136
136
  end
137
137
 
138
138
  # <MACK_PROJECT_ROOT>/config/initializers
139
139
  def self.initializers(*files)
140
- Mack::Paths.config("initializers", files)
140
+ Mack::Paths.config("initializers", *files)
141
141
  end
142
142
 
143
143
  # <MACK_PROJECT_ROOT>/vendor
144
144
  def self.vendor(*files)
145
- Mack::Paths.root("vendor", files)
145
+ Mack::Paths.root("vendor", *files)
146
146
  end
147
147
 
148
148
  # <MACK_PROJECT_ROOT>/vendor/plugins
149
149
  def self.plugins(*files)
150
- Mack::Paths.vendor("plugins", files)
150
+ Mack::Paths.vendor("plugins", *files)
151
151
  end
152
152
 
153
153
  end # Paths
@@ -0,0 +1,60 @@
1
+ module Mack
2
+ # Mack::Reloader checks on every request, but at most every +secs+
3
+ # seconds, if a file loaded changed, and reloads it, logging to
4
+ # Mack.logger.debug.
5
+
6
+ class Reloader
7
+ def initialize(app, secs = configatron.mack.reload_classes)
8
+ @app = app
9
+ @secs = secs # reload every @secs seconds max
10
+ @last = Time.now
11
+ end
12
+
13
+ def call(env)
14
+ if Time.now > @last + @secs
15
+ Thread.exclusive {
16
+ reload!
17
+ @last = Time.now
18
+ }
19
+ end
20
+
21
+ @app.call(env)
22
+ end
23
+
24
+ def reload!
25
+ need_reload = $LOADED_FEATURES.find_all { |loaded|
26
+ begin
27
+ if loaded =~ /\A[.\/]/ # absolute filename or 1.9
28
+ abs = loaded
29
+ else
30
+ if configatron.mack.deep_class_reload
31
+ abs = $LOAD_PATH.map { |path| ::File.join(path, loaded) }.find { |file| ::File.exist? file }
32
+ end
33
+ end
34
+
35
+ if abs
36
+ ::File.mtime(abs) > @last - @secs rescue false
37
+ else
38
+ false
39
+ end
40
+ end
41
+ }
42
+
43
+ need_reload.each { |l|
44
+ $LOADED_FEATURES.delete l
45
+ }
46
+
47
+ need_reload.each { |to_load|
48
+ begin
49
+ if require to_load
50
+ Mack.logger.debug "#{self.class}: reloaded `#{to_load}'"
51
+ end
52
+ rescue LoadError, SyntaxError => e
53
+ raise e # Possibly ShowExceptions
54
+ end
55
+ }
56
+ need_reload
57
+ end
58
+
59
+ end
60
+ end
@@ -20,13 +20,13 @@ module Mack
20
20
  # Any urls listed will go straight to the public directly and will not be served up via the app:
21
21
  app = Rack::Static.new(app, :urls => ["/css", "/images", "/files", "/images", "/stylesheets", "/javascripts", "/media", "/favicon.ico"], :root => "public")
22
22
  app = Mack::Utils::ContentLengthHandler.new(app)
23
- app = Rack::Lint.new(app) if app_config.mack.use_lint
23
+ app = Rack::Lint.new(app) if configatron.mack.use_lint
24
24
  app = Rack::ShowStatus.new(app)
25
- app = Rack::ShowExceptions.new(app) if app_config.mack.show_exceptions
25
+ app = Rack::ShowExceptions.new(app) if configatron.mack.show_exceptions
26
26
  app = Rack::Recursive.new(app)
27
27
 
28
28
  # This will reload any edited classes if the cache_classes config setting is set to true.
29
- app = Rack::Reloader.new(app, 1) unless app_config.mack.cache_classes
29
+ app = Mack::Reloader.new(app) unless configatron.mack.cache_classes
30
30
  app
31
31
  end
32
32
 
data/lib/mack/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Mack
2
- VERSION = '0.7.1.1' unless const_defined?("VERSION")
2
+ VERSION = '0.8.0' unless const_defined?("VERSION")
3
3
  end
@@ -1,5 +1,12 @@
1
1
  module Mack
2
2
  module ViewHelpers # :nodoc:
3
+
4
+ def get_resource_root(resource)
5
+ path = ""
6
+ path = "#{configatron.mack.distributed.site_domain}" unless configatron.mack.distributed.site_domain.nil?
7
+ path = Mack::Assets::Helpers.instance.asset_hosts(resource) if path.empty?
8
+ return path
9
+ end
3
10
 
4
11
  # Used to easily include all Mack::ViewHelpers. It will NOT include itself!
5
12
  # This is primarily used to aid in testing view helpers.