picnic 0.7.1 → 0.8.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (45) hide show
  1. data/History.txt +10 -0
  2. data/Manifest.txt +30 -13
  3. data/Rakefile +2 -0
  4. data/lib/picnic.rb +5 -120
  5. data/lib/picnic/authentication.rb +40 -4
  6. data/lib/picnic/cli.rb +86 -43
  7. data/lib/picnic/conf.rb +45 -43
  8. data/lib/picnic/logger.rb +41 -0
  9. data/lib/picnic/server.rb +99 -0
  10. data/lib/picnic/version.rb +2 -2
  11. data/picnic.gemspec +44 -0
  12. data/vendor/{camping-1.5.180 → camping-2.0.20090212}/CHANGELOG +17 -10
  13. data/vendor/{camping-1.5.180 → camping-2.0.20090212}/COPYING +0 -0
  14. data/vendor/{camping-1.5.180 → camping-2.0.20090212}/README +2 -2
  15. data/vendor/{camping-1.5.180 → camping-2.0.20090212}/Rakefile +62 -5
  16. data/vendor/camping-2.0.20090212/bin/camping +99 -0
  17. data/vendor/camping-2.0.20090212/doc/camping.1.gz +0 -0
  18. data/vendor/camping-2.0.20090212/examples/README +5 -0
  19. data/vendor/camping-2.0.20090212/examples/blog.rb +375 -0
  20. data/vendor/camping-2.0.20090212/examples/campsh.rb +629 -0
  21. data/vendor/camping-2.0.20090212/examples/tepee.rb +242 -0
  22. data/vendor/camping-2.0.20090212/extras/Camping.gif +0 -0
  23. data/vendor/camping-2.0.20090212/extras/flipbook_rdoc.rb +491 -0
  24. data/vendor/camping-2.0.20090212/extras/permalink.gif +0 -0
  25. data/vendor/{camping-1.5.180 → camping-2.0.20090212}/lib/camping-unabridged.rb +168 -294
  26. data/vendor/camping-2.0.20090212/lib/camping.rb +54 -0
  27. data/vendor/{camping-1.5.180/lib/camping/db.rb → camping-2.0.20090212/lib/camping/ar.rb} +4 -4
  28. data/vendor/{camping-1.5.180/lib/camping → camping-2.0.20090212/lib/camping/ar}/session.rb +23 -14
  29. data/vendor/camping-2.0.20090212/lib/camping/mab.rb +26 -0
  30. data/vendor/camping-2.0.20090212/lib/camping/reloader.rb +163 -0
  31. data/vendor/camping-2.0.20090212/lib/camping/server.rb +158 -0
  32. data/vendor/camping-2.0.20090212/lib/camping/session.rb +74 -0
  33. data/vendor/camping-2.0.20090212/setup.rb +1551 -0
  34. data/vendor/camping-2.0.20090212/test/apps/env_debug.rb +65 -0
  35. data/vendor/camping-2.0.20090212/test/apps/forms.rb +95 -0
  36. data/vendor/camping-2.0.20090212/test/apps/misc.rb +86 -0
  37. data/vendor/camping-2.0.20090212/test/apps/sessions.rb +38 -0
  38. data/vendor/camping-2.0.20090212/test/test_camping.rb +54 -0
  39. metadata +43 -16
  40. data/lib/picnic/postambles.rb +0 -292
  41. data/lib/picnic/utils.rb +0 -36
  42. data/vendor/camping-1.5.180/lib/camping.rb +0 -57
  43. data/vendor/camping-1.5.180/lib/camping/fastcgi.rb +0 -244
  44. data/vendor/camping-1.5.180/lib/camping/reloader.rb +0 -163
  45. data/vendor/camping-1.5.180/lib/camping/webrick.rb +0 -65
@@ -1,3 +1,5 @@
1
+ require 'active_support'
2
+
1
3
  module Picnic
2
4
  # Provides an interface for accessing your Picnic app's configuration file.
3
5
  #
@@ -11,18 +13,21 @@ module Picnic
11
13
  # puts Conf[:authentication][:username]
12
14
  # # ... etc.
13
15
  class Conf
14
- $CONF ||= HashWithIndifferentAccess.new
15
- $CONF[:log] ||= HashWithIndifferentAccess.new
16
- $CONF[:log][:file] ||= STDOUT
17
- $CONF[:log][:level] ||= 'DEBUG'
18
- $CONF[:uri_path] ||= "/"
16
+ def initialize(from_hash = {})
17
+ @conf = HashWithIndifferentAccess.new(from_hash)
18
+
19
+ @conf[:log] ||= HashWithIndifferentAccess.new
20
+ @conf[:log].merge!(:file => STDOUT, :level => 'DEBUG')
21
+
22
+ @conf[:uri_path] ||= "/"
23
+ end
19
24
 
20
25
  # Read a configuration option.
21
26
  #
22
27
  # For example:
23
28
  # puts Conf[:server]
24
- def self.[](key)
25
- $CONF[key]
29
+ def [](key)
30
+ @conf[key]
26
31
  end
27
32
 
28
33
  # Another way of reading a configuration option.
@@ -30,10 +35,15 @@ module Picnic
30
35
  # The following statements are equivalent:
31
36
  # puts Conf[:server]
32
37
  # puts Conf.server
33
- def self.method_missing(method, *args)
38
+ def method_missing(method, *args)
34
39
  self[method]
35
40
  end
36
41
 
42
+ # Needs to be defined when we have a custom method_missing().
43
+ def respond_to?(method)
44
+ (@conf.stringify_keys.keys).include?(method.to_s) || super
45
+ end
46
+
37
47
  # Returns the path to your application's example config file.
38
48
  #
39
49
  # The example config file should be in the root directory of
@@ -41,32 +51,27 @@ module Picnic
41
51
  # <tt>config.example.yml</tt>. This file is used as a template
42
52
  # for your app's configuration, to be customized by the end
43
53
  # user.
44
- def self.example_config_file_path
45
- if $APP_PATH
46
- app_path = File.expand_path($APP_PATH)
47
- else
48
- caller.last =~ /^(.*?):\d+$/
49
- app_path = File.dirname(File.expand_path($1))
50
- end
51
- app_path+'/config.example.yml'
54
+ def example_config_file_path(app_root)
55
+ "#{app_root}/config.example.yml"
52
56
  end
53
57
 
54
58
  # Copies the example config file into the appropriate
55
59
  # configuration directory.
56
60
  #
57
- # +app+:: The name of your application. For example: <tt>foo</tt>
61
+ # +app_name+:: The name of your application. For example: <tt>foo</tt>
62
+ # +app_root+:: The path to your application's root directory. For example: <tt>/srv/www/camping/foo/</tt>
58
63
  # +dest_conf_file:: The path where the example conf file should be copied to.
59
64
  # For example: <tt>/etc/foo/config.yml</tt>
60
- def self.copy_example_config_file(app, dest_conf_file)
65
+ def copy_example_config_file(app_name, app_root, dest_conf_file)
61
66
  require 'fileutils'
62
67
 
63
- example_conf_file = example_config_file_path
68
+ example_conf_file = example_config_file_path(app_root)
64
69
 
65
- puts "\n#{app.to_s.upcase} SERVER HAS NOT YET BEEN CONFIGURED!!!\n"
70
+ puts "\n#{app_name.to_s.upcase} SERVER HAS NOT YET BEEN CONFIGURED!!!\n"
66
71
  puts "\nAttempting to copy sample configuration from '#{example_conf_file}' to '#{dest_conf_file}'...\n"
67
72
 
68
73
  unless File.exists? example_conf_file
69
- puts "\nThe example conf file does not exist! The author of #{app} may have forgotten to include it. You'll have to create the config file manually.\n"
74
+ puts "\nThe example conf file does not exist! The author of #{app_name} may have forgotten to include it. You'll have to create the config file manually.\n"
70
75
  exit 2
71
76
  end
72
77
 
@@ -84,50 +89,47 @@ module Picnic
84
89
  end
85
90
 
86
91
  puts "\nA sample configuration has been created for you in '#{dest_conf_file}'. Please edit this file to" +
87
- " suit your needs and then run #{app} again.\n"
92
+ " suit your needs and then run #{app_name} again.\n"
88
93
  exit 1
89
94
  end
90
95
 
91
- # Loads the configuration from the yaml file for the given app.
96
+ # Loads the configuration from the YAML file for the given app.
92
97
  #
93
- # <tt>app</tt> should be the name of your app; for example: <tt>foo</tt>.
98
+ # <tt>app_name</tt> should be the name of your app; for example: <tt>foo</tt>
99
+ # <tt>app_root</tt> should be the path to your application's root directory; for example:: <tt>/srv/www/camping/foo/</tt>
100
+ # [<tt>config_file</tt>] can be the path to an alternate location for the config file to load
94
101
  #
95
- # By default, the configuration will be loaded from <tt>/etc/<app>/config.yml</tt>.
96
- # You can override this by setting a global <tt>$CONFIG_FILE</tt> variable.
97
- def self.load(app)
102
+ # By default, the configuration will be loaded from <tt>/etc/<app_name>/config.yml</tt>.
103
+ def load_from_file(app_name, app_root, config_file = nil)
104
+ conf_file = config_file || "/etc/#{app_name.to_s.downcase}/config.yml"
98
105
 
99
- conf_file = $CONFIG_FILE || "/etc/#{app.to_s.downcase}/config.yml"
100
-
101
- puts "Loading configuration for #{app} from '#{conf_file}'..."
106
+ puts "Loading configuration for #{app_name.inspect} from #{conf_file.inspect}..."
102
107
 
103
108
  begin
104
109
  conf_file = etc_conf = conf_file
105
110
  unless File.exists? conf_file
106
111
  # can use local config.yml file in case we're running non-gem installation
107
- conf_file = File.dirname(File.expand_path(__FILE__))+"/../../config.yml"
112
+ conf_file = "#{app_root}/config.yml"
108
113
  end
109
114
 
110
115
  unless File.exists? conf_file
111
- copy_example_config_file(app, etc_conf)
116
+ copy_example_config_file(app_name, app_root, etc_conf)
112
117
  end
113
118
 
114
119
  loaded_conf = HashWithIndifferentAccess.new(YAML.load_file(conf_file))
115
120
 
116
- if $CONF
117
- $CONF = HashWithIndifferentAccess.new($CONF)
118
- $CONF = $CONF.merge(loaded_conf)
119
- else
120
- $CONF = loaded_conf
121
- end
122
-
123
- $CONF[:log][:file] = STDOUT unless $CONF[:log][:file]
121
+ @conf.merge!(loaded_conf)
124
122
 
125
- rescue
126
- raise "Your #{app} configuration may be invalid."+
123
+ rescue => e
124
+ raise "Your #{app_name} configuration may be invalid."+
127
125
  " Please double-check check your config.yml file."+
128
126
  " Make sure that you are using spaces instead of tabs for your indentation!!" +
129
- "\n\nTHE UNDERLYING ERROR WAS:\n#{$!}"
127
+ "\n\nTHE UNDERLYING ERROR WAS:\n#{e.inspect}"
130
128
  end
131
129
  end
130
+
131
+ def merge_defaults(defaults)
132
+ @conf = HashWithIndifferentAccess.new(HashWithIndifferentAccess.new(defaults).merge(@conf))
133
+ end
132
134
  end
133
135
  end
@@ -0,0 +1,41 @@
1
+ require 'logger'
2
+
3
+ module Picnic
4
+ module Logger
5
+
6
+ # Makes available a Logger instance under the global $LOG variable.
7
+ def init_global_logger!
8
+ logdev = ($CONF && $CONF.log[:file]) || STDOUT
9
+ $LOG = Picnic::Logger::Base.new(logdev)
10
+ $LOG.level = Picnic::Logger::Base.const_get(($CONF && $CONF.log[:level]) || 'DEBUG')
11
+
12
+ puts "Initialized global logger to #{logdev.inspect}."
13
+ end
14
+ module_function :init_global_logger!
15
+
16
+ class Base < ::Logger
17
+ def initialize(logdev, shift_age = 0, shift_size = 1048576)
18
+ begin
19
+ super
20
+ rescue Exception
21
+ puts "WARNING: Couldn't create Logger with output '#{logdev}'. Logger output will be redirected to STDOUT."
22
+ super(STDOUT, shift_age, shift_size)
23
+ end
24
+ end
25
+
26
+ def format_message(severity, datetime, progrname, msg)
27
+ (@formatter || @default_formatter).call(severity, datetime, progname, msg)
28
+ end
29
+ end
30
+
31
+ # Custom log formatter used by the Picnic Logger.
32
+ class Formatter < ::Logger::Formatter
33
+ Format = "[%s#%d] %5s -- %s: %s\n"
34
+
35
+ def call(severity, time, progname, msg)
36
+ Format % [format_datetime(time), $$, severity, progname,
37
+ msg2str(msg)]
38
+ end
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,99 @@
1
+ require 'camping/server'
2
+
3
+ module Picnic::Server
4
+ class Base < Camping::Server::Base
5
+ def start
6
+ handler, conf = case @conf.server
7
+ when "console"
8
+ ARGV.clear
9
+ IRB.start
10
+ exit
11
+ when "mongrel"
12
+ prep_mongrel
13
+ when "webrick"
14
+ prep_webrick
15
+ end
16
+
17
+ rapp = apps.first
18
+
19
+ if @conf.uri_path
20
+ rapp = Rack::URLMap.new(@conf.uri_path => rapp)
21
+ end
22
+
23
+ rapp = Rack::Static.new(rapp, @conf[:static]) if @conf[:static]
24
+ rapp = Rack::ContentLength.new(rapp)
25
+ rapp = FixContentLength.new(rapp)
26
+ rapp = Rack::Lint.new(rapp)
27
+ rapp = Camping::Server::XSendfile.new(rapp)
28
+ rapp = Rack::ShowExceptions.new(rapp)
29
+
30
+ handler.run(rapp, conf)
31
+ end
32
+
33
+
34
+ private
35
+
36
+ def prep_webrick
37
+ handler = Rack::Handler::WEBrick
38
+ options = {
39
+ :BindAddress => @conf.bind_address || "0.0.0.0",
40
+ :Port => @conf.port
41
+ }
42
+
43
+ cert_path = @conf.ssl_cert
44
+ key_path = @conf.ssl_key || @conf.ssl_cert
45
+ # look for the key in the ssl_cert if no ssl_key is specified
46
+
47
+ unless cert_path.nil? && key_path.nil?
48
+ raise "The specified certificate file #{cert_path.inspect} does not exist or is not readable. " +
49
+ " Your 'ssl_cert' configuration setting must be a path to a valid " +
50
+ " ssl certificate." unless
51
+ File.exists? cert_path
52
+
53
+ raise "The specified key file #{key_path.inspect} does not exist or is not readable. " +
54
+ " Your 'ssl_key' configuration setting must be a path to a valid " +
55
+ " ssl private key." unless
56
+ File.exists? key_path
57
+
58
+ require 'openssl'
59
+ require 'webrick/https'
60
+
61
+ cert = OpenSSL::X509::Certificate.new(File.read(cert_path))
62
+ key = OpenSSL::PKey::RSA.new(File.read(key_path))
63
+
64
+ options[:SSLEnable] = true
65
+ options[:SSLVerifyClient] = ::OpenSSL::SSL::VERIFY_NONE
66
+ options[:SSLCertificate] = cert
67
+ options[:SSLPrivateKey] = key
68
+ end
69
+
70
+ return handler, options
71
+ end
72
+
73
+
74
+ def prep_mongrel
75
+ handler = Rack::Handler::Mongrel
76
+ options = {
77
+ :Host => @conf.bind_address || "0.0.0.0",
78
+ :Port => @conf.port
79
+ }
80
+
81
+ return handler, options
82
+ end
83
+
84
+ end
85
+
86
+ class FixContentLength
87
+ def initialize(app)
88
+ @app = app
89
+ end
90
+
91
+ def call(env)
92
+ status, headers, body = @app.call(env)
93
+ if headers.has_key?('Content-Length') && headers['Content-Length'].to_i == 0
94
+ headers['Content-Length'] = body.body.length.to_s
95
+ end
96
+ [status, headers, body]
97
+ end
98
+ end
99
+ end
@@ -1,8 +1,8 @@
1
1
  module Picnic #:nodoc:
2
2
  module VERSION #:nodoc:
3
3
  MAJOR = 0
4
- MINOR = 7
5
- TINY = 1
4
+ MINOR = 8
5
+ TINY = 0
6
6
 
7
7
  STRING = [MAJOR, MINOR, TINY].join('.')
8
8
  end
@@ -0,0 +1,44 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ Gem::Specification.new do |s|
4
+ s.name = %q{picnic}
5
+ s.version = '0.8.0.' + Time.now.strftime('%Y%m%d')
6
+
7
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
8
+ s.authors = ["Matt Zukowski"]
9
+ s.date = Time.now.strftime('%Y-%m-%d')
10
+ s.description = %q{Camping for sissies}
11
+ s.email = %q{matt@roughest.net}
12
+ s.extra_rdoc_files = ["CHANGELOG.txt", "History.txt", "LICENSE.txt", "Manifest.txt", "README.txt"]
13
+ s.files = ["CHANGELOG.txt", "History.txt", "LICENSE.txt", "Manifest.txt", "README.txt", "Rakefile", "lib/picnic.rb", "lib/picnic/authentication.rb", "lib/picnic/cli.rb", "lib/picnic/conf.rb", "lib/picnic/controllers.rb", "lib/picnic/logger.rb", "lib/picnic/server.rb", "lib/picnic/service_control.rb", "lib/picnic/version.rb", "setup.rb", "test/picnic_test.rb", "test/test_helper.rb", "vendor/camping-2.0.20090212/CHANGELOG", "vendor/camping-2.0.20090212/COPYING", "vendor/camping-2.0.20090212/README", "vendor/camping-2.0.20090212/Rakefile", "vendor/camping-2.0.20090212/bin/camping", "vendor/camping-2.0.20090212/doc/camping.1.gz", "vendor/camping-2.0.20090212/examples/README", "vendor/camping-2.0.20090212/examples/blog.rb", "vendor/camping-2.0.20090212/examples/campsh.rb", "vendor/camping-2.0.20090212/examples/tepee.rb", "vendor/camping-2.0.20090212/extras/Camping.gif", "vendor/camping-2.0.20090212/extras/flipbook_rdoc.rb", "vendor/camping-2.0.20090212/extras/permalink.gif", "vendor/camping-2.0.20090212/lib/camping-unabridged.rb", "vendor/camping-2.0.20090212/lib/camping.rb", "vendor/camping-2.0.20090212/lib/camping/ar.rb", "vendor/camping-2.0.20090212/lib/camping/ar/session.rb", "vendor/camping-2.0.20090212/lib/camping/mab.rb", "vendor/camping-2.0.20090212/lib/camping/reloader.rb", "vendor/camping-2.0.20090212/lib/camping/server.rb", "vendor/camping-2.0.20090212/lib/camping/session.rb", "vendor/camping-2.0.20090212/setup.rb", "vendor/camping-2.0.20090212/test/apps/env_debug.rb", "vendor/camping-2.0.20090212/test/apps/forms.rb", "vendor/camping-2.0.20090212/test/apps/misc.rb", "vendor/camping-2.0.20090212/test/apps/sessions.rb", "vendor/camping-2.0.20090212/test/test_camping.rb"]
14
+ s.has_rdoc = true
15
+ s.homepage = %q{http://picnic.rubyforge.org}
16
+ s.rdoc_options = ["--main", "README.txt"]
17
+ s.require_paths = ["lib"]
18
+ s.rubyforge_project = %q{picnic}
19
+ s.rubygems_version = %q{1.3.1}
20
+ s.summary = %q{Camping for sissies}
21
+ s.test_files = ["test/picnic_test.rb"]
22
+
23
+ if s.respond_to? :specification_version then
24
+ current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
25
+ s.specification_version = 2
26
+
27
+ if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
28
+ s.add_runtime_dependency(%q<rack>, [">= 0"])
29
+ s.add_runtime_dependency(%q<markaby>, [">= 0"])
30
+ s.add_runtime_dependency(%q<activesupport>, [">= 0"])
31
+ s.add_development_dependency(%q<hoe>, [">= 1.8.2"])
32
+ else
33
+ s.add_dependency(%q<rack>, [">= 0"])
34
+ s.add_dependency(%q<markaby>, [">= 0"])
35
+ s.add_dependency(%q<activesupport>, [">= 0"])
36
+ s.add_dependency(%q<hoe>, [">= 1.8.2"])
37
+ end
38
+ else
39
+ s.add_dependency(%q<rack>, [">= 0"])
40
+ s.add_dependency(%q<markaby>, [">= 0"])
41
+ s.add_dependency(%q<activesupport>, [">= 0"])
42
+ s.add_dependency(%q<hoe>, [">= 1.8.2"])
43
+ end
44
+ end
@@ -1,14 +1,21 @@
1
- = Patches
2
- === 31st Mar, 2008
3
-
4
- * Can now set expiry time for cookies.
5
-
6
- @cookies[:foo] = {:value => "bar", :expires => Time.now + 1.hour}
7
-
8
- The simple method of setting cookies without expiry still works.
1
+ = 1.6
2
+ === ???, 2007
3
+
4
+ * Camping::Apps removed, it wasn't reliable.
5
+ * bin/camping server kinds splitted in various files.
6
+ * NotFound and ServerError controllers changed to methods :
7
+
8
+ r404 : called when a controller was not found
9
+ r500 : called on uncaught exception
10
+ r501 : called on undefined method
9
11
 
10
- @cookies[:foo] = "bar"
11
-
12
+ All of those can be overridden at your taste.
13
+
14
+ * Markaby no longer required. Like AR, is it autoloaded on (Mab) usage.
15
+ * Camping::H is now inheriting from Hash instead of HashWithIndifferentAccess.
16
+ * Which made possible to remove the last strict dependency : active_support
17
+ * #errors_for removed, it wasn't really used
18
+ * Bug fixes !
12
19
 
13
20
  = 1.5
14
21
  === 3rd Oct, 2006
@@ -78,7 +78,7 @@ Interested yet? Okay, okay, one step at a time.
78
78
 
79
79
  Or for the bleeding edge:
80
80
 
81
- * <tt>gem install camping --source code.whytheluckystiff.net</tt>
81
+ * <tt>gem install camping --source http://code.whytheluckystiff.net</tt>
82
82
 
83
83
  You are encourage to install Camping and SQLite3, since it is a small database
84
84
  which fits perfectly with our compact bylaws, works well with the examples.
@@ -93,7 +93,7 @@ If you run them from the commandline, you'll probably just see a pile of HTML.
93
93
  Camping comes with an tool for launching apps from the commandline:
94
94
 
95
95
  * Run: <tt>camping blog.rb</tt>
96
- * Visit http://localhost:3301/blog/ to use the app.
96
+ * Visit http://localhost:3301/ to use the app.
97
97
 
98
98
  == How the Camping Tool Works
99
99
 
@@ -7,9 +7,9 @@ require 'fileutils'
7
7
  include FileUtils
8
8
 
9
9
  NAME = "camping"
10
- REV = File.read(".svn/entries")[/committed-rev="(\d+)"/, 1] rescue nil
11
- VERS = ENV['VERSION'] || ("1.5" + (REV ? ".#{REV}" : ""))
12
- CLEAN.include ['**/.*.sw?', '*.gem', '.config', 'test/test.log']
10
+ REV = (`#{ENV['GIT'] || "git"} rev-list HEAD`.split.length + 1).to_s rescue nil
11
+ VERS = ENV['VERSION'] || ("1.9" + (REV ? ".#{REV}" : ""))
12
+ CLEAN.include ['**/.*.sw?', '*.gem', '.config', 'test/test.log', '.*.pt']
13
13
  RDOC_OPTS = ['--quiet', '--title', "Camping, the Documentation",
14
14
  "--opname", "index.html",
15
15
  "--line-numbers",
@@ -17,7 +17,7 @@ RDOC_OPTS = ['--quiet', '--title', "Camping, the Documentation",
17
17
  "--inline-source"]
18
18
 
19
19
  desc "Packages up Camping."
20
- task :default => [:package]
20
+ task :default => [:check]
21
21
  task :package => [:clean]
22
22
 
23
23
  task :doc => [:before_doc, :rdoc, :after_doc]
@@ -59,8 +59,8 @@ spec =
59
59
  s.homepage = 'http://code.whytheluckystiff.net/camping/'
60
60
  s.executables = ['camping']
61
61
 
62
- s.add_dependency('activesupport', '>=1.3.1')
63
62
  s.add_dependency('markaby', '>=0.5')
63
+ s.add_dependency('rack', '>=0.3')
64
64
  s.add_dependency('metaid')
65
65
  s.required_ruby_version = '>= 1.8.2'
66
66
 
@@ -115,3 +115,60 @@ Rake::TestTask.new(:test) do |t|
115
115
  # t.warning = true
116
116
  # t.verbose = true
117
117
  end
118
+
119
+ desc "Compare camping and camping-unabridged parse trees"
120
+ task :diff do
121
+ if `which parse_tree_show`.strip.empty?
122
+ STDERR.puts "ERROR: parse_tree_show missing : `gem install ParseTree`"
123
+ exit 1
124
+ end
125
+
126
+ sh "parse_tree_show lib/camping.rb > .camping.pt"
127
+ sh "parse_tree_show lib/camping-unabridged.rb > .camping-unabridged.pt"
128
+ sh "diff -u .camping-unabridged.pt .camping.pt | less"
129
+ end
130
+
131
+ task :ruby_diff do
132
+ require 'ruby2ruby'
133
+ c = Ruby2Ruby.translate(File.read("lib/camping.rb"))
134
+ n = Ruby2Ruby.translate(File.read("lib/camping-unabridged.rb"))
135
+
136
+ File.open(".camping-unabridged.rb.rb","w"){|f|f<<c}
137
+ File.open(".camping.rb.rb","w"){|f|f<<n}
138
+
139
+ sh "diff -u .camping-unabridged.rb.rb .camping.rb.rb | less"
140
+ end
141
+
142
+ task :check => ["check:valid", "check:size", "check:lines"]
143
+ namespace :check do
144
+
145
+ desc "Check source code validity"
146
+ task :valid do
147
+ ruby "-rubygems", "-w", "lib/camping-unabridged.rb"
148
+ ruby "-rubygems", "-w", "lib/camping.rb"
149
+ end
150
+
151
+ SIZE_LIMIT = 4096
152
+ desc "Compare camping sizes to unabridged"
153
+ task :size do
154
+ FileList["lib/camping*.rb"].each do |path|
155
+ s = File.size(path)
156
+ puts "%21s : % 6d % 4d%" % [File.basename(path), s, (100 * s / SIZE_LIMIT)]
157
+ end
158
+ if File.size("lib/camping.rb") > SIZE_LIMIT
159
+ STDERR.puts "lib/camping.rb: file is too big (> #{SIZE_LIMIT})"
160
+ end
161
+ end
162
+
163
+ desc "Verify that line lenght doesn't exceed 80 chars for camping.rb"
164
+ task :lines do
165
+ i = 1
166
+ File.open("lib/camping.rb").each_line do |line|
167
+ if line.size > 81 # 1 added for \n
168
+ STDERR.puts "lib/camping.rb:#{i}: line too long (#{line[-10..-1].inspect})"
169
+ end
170
+ i += 1
171
+ end
172
+ end
173
+
174
+ end