restfulie 0.9.1 → 0.9.3

Sign up to get free protection for your applications and to get access to all the features.
data/Gemfile CHANGED
@@ -1,11 +1,10 @@
1
1
  # A sample Gemfile
2
2
  source :gemcutter
3
3
  #
4
- gem "rails"
4
+ gem "rails", ">= 3.0.0"
5
5
  gem "libxml-ruby"
6
6
 
7
7
  gem "rack-conneg"
8
- gem "responders_backport"
9
8
  gem "json_pure"
10
9
  gem "sqlite3-ruby"
11
10
  gem "yard"
@@ -18,11 +17,10 @@ end
18
17
 
19
18
  group :test do
20
19
  gem "nokogiri"
21
- gem "rspec-rails"
20
+ gem "rspec-rails", ">= 2.0.0.beta.19"
22
21
  gem "rcov"
23
22
  gem "sinatra"
24
23
  gem "state_machine"
25
24
  gem "test-unit", "= 1.2.3"
26
- gem "rails", "= 2.3.5"
27
25
  gem "fakeweb"
28
26
  end
data/Gemfile.lock ADDED
@@ -0,0 +1,128 @@
1
+ GEM
2
+ remote: http://rubygems.org/
3
+ specs:
4
+ abstract (1.0.0)
5
+ actionmailer (3.0.0)
6
+ actionpack (= 3.0.0)
7
+ mail (~> 2.2.5)
8
+ actionpack (3.0.0)
9
+ activemodel (= 3.0.0)
10
+ activesupport (= 3.0.0)
11
+ builder (~> 2.1.2)
12
+ erubis (~> 2.6.6)
13
+ i18n (~> 0.4.1)
14
+ rack (~> 1.2.1)
15
+ rack-mount (~> 0.6.12)
16
+ rack-test (~> 0.5.4)
17
+ tzinfo (~> 0.3.23)
18
+ activemodel (3.0.0)
19
+ activesupport (= 3.0.0)
20
+ builder (~> 2.1.2)
21
+ i18n (~> 0.4.1)
22
+ activerecord (3.0.0)
23
+ activemodel (= 3.0.0)
24
+ activesupport (= 3.0.0)
25
+ arel (~> 1.0.0)
26
+ tzinfo (~> 0.3.23)
27
+ activeresource (3.0.0)
28
+ activemodel (= 3.0.0)
29
+ activesupport (= 3.0.0)
30
+ activesupport (3.0.0)
31
+ arel (1.0.1)
32
+ activesupport (~> 3.0.0)
33
+ builder (2.1.2)
34
+ columnize (0.3.1)
35
+ diff-lcs (1.1.2)
36
+ erubis (2.6.6)
37
+ abstract (>= 1.0.0)
38
+ fakeweb (1.2.8)
39
+ hoe (2.6.1)
40
+ rake (>= 0.8.7)
41
+ rubyforge (>= 2.0.4)
42
+ i18n (0.4.1)
43
+ json_pure (1.4.6)
44
+ libxml-ruby (1.1.4)
45
+ linecache (0.43)
46
+ mail (2.2.5)
47
+ activesupport (>= 2.3.6)
48
+ mime-types
49
+ treetop (>= 1.4.5)
50
+ mime-types (1.16)
51
+ nokogiri (1.4.3.1)
52
+ polyglot (0.3.1)
53
+ rack (1.2.1)
54
+ rack-conneg (0.1.4)
55
+ rack (>= 1.0)
56
+ rack-mount (0.6.12)
57
+ rack (>= 1.0.0)
58
+ rack-test (0.5.4)
59
+ rack (>= 1.0)
60
+ rails (3.0.0)
61
+ actionmailer (= 3.0.0)
62
+ actionpack (= 3.0.0)
63
+ activerecord (= 3.0.0)
64
+ activeresource (= 3.0.0)
65
+ activesupport (= 3.0.0)
66
+ bundler (~> 1.0.0)
67
+ railties (= 3.0.0)
68
+ railties (3.0.0)
69
+ actionpack (= 3.0.0)
70
+ activesupport (= 3.0.0)
71
+ rake (>= 0.8.4)
72
+ thor (~> 0.14.0)
73
+ rake (0.8.7)
74
+ rcov (0.9.8)
75
+ responders_backport (0.1.2)
76
+ rspec (2.0.0.beta.19)
77
+ rspec-core (= 2.0.0.beta.19)
78
+ rspec-expectations (= 2.0.0.beta.19)
79
+ rspec-mocks (= 2.0.0.beta.19)
80
+ rspec-core (2.0.0.beta.19)
81
+ rspec-expectations (2.0.0.beta.19)
82
+ diff-lcs (>= 1.1.2)
83
+ rspec-mocks (2.0.0.beta.19)
84
+ rspec-rails (2.0.0.beta.19)
85
+ rspec (= 2.0.0.beta.19)
86
+ webrat (>= 0.7.2.beta.1)
87
+ ruby-debug (0.10.3)
88
+ columnize (>= 0.1)
89
+ ruby-debug-base (~> 0.10.3.0)
90
+ ruby-debug-base (0.10.3)
91
+ linecache (>= 0.3)
92
+ rubyforge (2.0.4)
93
+ json_pure (>= 1.1.7)
94
+ sinatra (1.0)
95
+ rack (>= 1.0)
96
+ sqlite3-ruby (1.3.1)
97
+ state_machine (0.9.4)
98
+ test-unit (1.2.3)
99
+ hoe (>= 1.5.1)
100
+ thor (0.14.0)
101
+ treetop (1.4.8)
102
+ polyglot (>= 0.3.1)
103
+ tzinfo (0.3.23)
104
+ webrat (0.7.2.beta.1)
105
+ nokogiri (>= 1.2.0)
106
+ rack (>= 1.0)
107
+ rack-test (>= 0.5.3)
108
+ yard (0.5.8)
109
+
110
+ PLATFORMS
111
+ ruby
112
+
113
+ DEPENDENCIES
114
+ fakeweb
115
+ json_pure
116
+ libxml-ruby
117
+ nokogiri
118
+ rack-conneg
119
+ rails (>= 3.0.0)
120
+ rcov
121
+ responders_backport
122
+ rspec-rails (>= 2.0.0.beta.19)
123
+ ruby-debug
124
+ sinatra
125
+ sqlite3-ruby
126
+ state_machine
127
+ test-unit (= 1.2.3)
128
+ yard
data/README.textile CHANGED
@@ -83,14 +83,7 @@ Appart from the simple server and client examples provided here, you can find th
83
83
 
84
84
  h2. Installing
85
85
 
86
- For client side usage, execute:
87
-
88
- <pre>
89
- gem install activesupport
90
- gem install restfulie
91
- </pre>
92
-
93
- For server side usage, execute:
86
+ Execute:
94
87
 
95
88
  <pre>
96
89
  gem install restfulie
@@ -103,6 +96,7 @@ If you want to build the project and run its tests, remember to install all (cli
103
96
 
104
97
  <pre>
105
98
  bundle install
99
+ rake test:spec test:integration
106
100
  </pre>
107
101
 
108
102
  <script type="text/javascript">
@@ -117,10 +111,10 @@ pageTracker._trackPageview();
117
111
 
118
112
  h2. Contributions
119
113
 
120
- Restfulie was created and is maintained by "http://caelumobjects.com":Caelum, and has received enormous contributions from all those developers:
114
+ Restfulie was created and is maintained by "Caelum":http://caelumobjects.com, and has received enormous contributions from all those developers:
121
115
 
122
116
  Project Leader
123
- Guilherme Silveira, "http://caelum.com.br":Caelum
117
+ Guilherme Silveira, "Caelum":http://www.caelum.com.br
124
118
 
125
119
  Caue Guerra, caelum
126
120
  George Guimaraes, abril and plataforma
@@ -134,5 +128,9 @@ Everton Ribeiro, abril
134
128
  Paulo Ahagon, abril
135
129
  Elomar França
136
130
  Thomas Stefano
137
- "http://www.caelum.com.br":"David Paniz"
138
- "http://www.caikesouza.com/blog":Caike Souza
131
+ "David Paniz":"http://www.caelum.com.br"
132
+ "Caike Souza":"http://www.caikesouza.com/blog"
133
+
134
+ h2. Rails 2
135
+
136
+ If you want to use Restfulie with Rails2, please use any release up to 0.9.2 and its minor releases.
data/Rakefile CHANGED
@@ -1,17 +1,17 @@
1
- # encoding: UTF-8
2
-
3
1
  require 'rubygems'
4
2
  require 'rubygems/specification'
5
3
  require 'rake'
6
4
  require 'rake/gempackagetask'
7
- require 'spec/rake/spectask'
8
5
  require 'rake/rdoctask'
6
+ require 'rspec'
7
+ require 'rspec/core'
8
+ require 'rspec/core/rake_task'
9
9
  require File.expand_path('lib/restfulie')
10
10
 
11
11
  GEM = "restfulie"
12
12
  GEM_VERSION = Restfulie::VERSION
13
13
  SUMMARY = "Hypermedia aware resource based library in ruby (client side) and ruby on rails (server side)."
14
- AUTHOR = "Guilherme Silveira, Caue Guerra, Luis Cipriani, Everton Ribeiro, George Guimaraes, Paulo Ahagon"
14
+ AUTHOR = "Guilherme Silveira, Caue Guerra, Luis Cipriani, Everton Ribeiro, George Guimaraes, Paulo Ahagon, Several contributors"
15
15
  EMAIL = "guilherme.silveira@caelum.com.br"
16
16
  HOMEPAGE = "http://restfulie.caelumobjects.com"
17
17
 
@@ -25,7 +25,6 @@ spec = Gem::Specification.new do |s|
25
25
  s.add_dependency("nokogiri", [">= 1.4.2"])
26
26
  s.add_dependency("actionpack", [">= 2.3.2"])
27
27
  s.add_dependency("activesupport", [">= 2.3.2"])
28
- s.add_dependency("responders_backport", ["~> 0.1.0"])
29
28
  s.add_dependency("json_pure", [">= 1.2.4"])
30
29
 
31
30
  s.author = AUTHOR
@@ -33,120 +32,84 @@ spec = Gem::Specification.new do |s|
33
32
  s.homepage = HOMEPAGE
34
33
  end
35
34
 
36
- # optionally loads a task if the required gems exist
37
- def optionally
38
- begin
39
- yield
40
- rescue LoadError; end
41
- end
42
-
43
- def start_server_and_invoke_test(task_name)
44
- IO.popen("ruby ./spec/units/client/fake_server.rb") do |pipe|
45
- wait_server(4567)
46
- Rake::Task[task_name].invoke
47
- Process.kill 'INT', pipe.pid
48
- end
49
- end
50
-
51
- def wait_server(port=3000)
52
- (1..15).each do
53
- begin
54
- Net::HTTP.get(URI.parse("http://localhost:#{port}/"))
55
- return
56
- rescue
57
- sleep 1
35
+ module FakeServer
36
+ def self.wait_server(port=3000)
37
+ (1..15).each do
38
+ begin
39
+ Net::HTTP.get(URI.parse("http://localhost:#{port}/"))
40
+ return
41
+ rescue
42
+ sleep 1
43
+ end
58
44
  end
45
+ raise "Waited for the server but it did not finish"
59
46
  end
60
- raise "Waited for the server but it did not finish"
61
- end
62
-
63
- desc 'Start server'
64
- task :server do
65
- process 'fake_server'
66
- end
67
-
68
- namespace :test do
69
47
 
70
- desc "Execute integration Order tests"
71
- task :integration do
72
- integration_path = "spec/integration/order/server"
73
-
74
- Dir.chdir(File.join(File.dirname(__FILE__), integration_path)) do
75
- system('rake db:drop db:create db:migrate')
76
- system('rake')
48
+ def self.start_sinatra
49
+ IO.popen("cd tests && ruby ./spec/requests/fake_server.rb") do |pipe|
50
+ wait_server 4567
51
+ yield
52
+ Process.kill 'INT', pipe.pid
77
53
  end
78
54
  end
79
55
 
80
- namespace :spec do
81
- spec_opts = ['--options', File.join(File.dirname(__FILE__) , 'spec', 'units', 'spec.opts')]
82
- Spec::Rake::SpecTask.new(:all) do |t|
83
- t.spec_files = FileList['spec/units/**/*_spec.rb']
84
- t.spec_opts = spec_opts
85
- end
86
- Spec::Rake::SpecTask.new(:common) do |t|
87
- t.spec_files = FileList['spec/common/**/*_spec.rb']
88
- t.spec_opts = spec_opts
89
- end
90
- Spec::Rake::SpecTask.new(:client) do |t|
91
- t.spec_files = FileList['spec/units/client/**/*_spec.rb']
92
- t.spec_opts = spec_opts
56
+ def self.run(setup, process)
57
+ success = IO.popen(setup) do |pipe|
58
+ wait_server
59
+ success = system "rake spec"
60
+ Process.kill 'INT', pipe.pid
61
+ success
93
62
  end
94
- Spec::Rake::SpecTask.new(:server) do |t|
95
- t.spec_files = FileList['spec/units/server/**/*_spec.rb']
96
- t.spec_opts = spec_opts
63
+ if !success
64
+ raise "Some of the specs failed"
97
65
  end
98
66
  end
99
67
 
100
- namespace :rcov do
101
- Spec::Rake::SpecTask.new('rcov') do |t|
102
- options_file = File.expand_path('spec/units/spec.opts')
103
- t.spec_opts = %w(-fs -fh:doc/specs.html --color)
104
- t.spec_files = FileList['spec/units/**/*_spec.rb']
105
- t.rcov = true
106
- t.rcov_opts = ["-e", "/Library*", "-e", "~/.rvm", "-e", "spec", "-i", "bin"]
107
- end
108
- desc 'Run coverage test with fake server'
109
- task :run do
110
- start_server_and_invoke_test('test:rcov:rcov')
68
+ def self.start_server_and_run_spec(target_dir)
69
+ success = Dir.chdir(File.join(File.dirname(__FILE__), target_dir)) do
70
+ system('rake db:drop db:create db:migrate')
71
+ self.run "rails server", "rake spec"
111
72
  end
112
73
  end
113
74
 
114
- namespace :run do
115
- task :all do
116
- start_server_and_invoke_test('test:spec:all')
117
- puts "Execution integration tests... (task test:integration)"
118
- Rake::Task["test:integration"].invoke()
119
- Rake::Task["test:examples"].invoke()
120
- end
121
- task :common do
122
- start_server_and_invoke_test('test:spec:common')
123
- end
124
- task :client do
125
- start_server_and_invoke_test('test:spec:client')
126
- end
127
- task :server do
128
- start_server_and_invoke_test('test:spec:server')
129
- end
130
- task :rcov do
131
- start_server_and_invoke_test('test:rcov:rcov')
132
- end
133
- end
134
-
135
- desc "runs all example tests"
136
- task :examples do
137
- Rake::Task["install"].invoke()
75
+ end
138
76
 
139
- target_dir = "full-examples/rest_from_scratch/part_3"
140
- system "cd #{target_dir} && rake db:reset db:seed"
77
+ # optionally loads a task if the required gems exist
78
+ def optionally
79
+ begin
80
+ yield
81
+ rescue LoadError; end
82
+ end
141
83
 
142
- IO.popen("ruby #{target_dir}/script/server") do |pipe|
143
- wait_server
144
- system "cd #{target_dir} && rake spec"
145
- Process.kill 'INT', pipe.pid
84
+ namespace :test do
85
+
86
+ task :spec do
87
+ FakeServer.start_sinatra do
88
+ FakeServer.start_server_and_run_spec "tests"
146
89
  end
147
-
148
90
  end
149
-
91
+
92
+ task :integration do
93
+ FakeServer.start_server_and_run_spec "full-examples/rest_from_scratch/part_1"
94
+ FakeServer.start_server_and_run_spec "full-examples/rest_from_scratch/part_2"
95
+ FakeServer.start_server_and_run_spec "full-examples/rest_from_scratch/part_3"
96
+ end
97
+
98
+ task :all => ["spec","integration"]
99
+
100
+ # namespace :rcov do
101
+ # Spec::Rake::SpecTask.new('rcov') do |t|
102
+ # t.spec_opts = %w(-fs --color)
103
+ # t.spec_files = FileList['spec/units/**/*_spec.rb']
104
+ # t.rcov = true
105
+ # t.rcov_opts = ["-e", "/Library*", "-e", "~/.rvm", "-e", "spec", "-i", "bin"]
106
+ # end
107
+ # desc 'Run coverage test with fake server'
108
+ # task :run do
109
+ # start_server_and_invoke_test('test:rcov:rcov')
110
+ # end
111
+ # end
112
+
150
113
  end
151
114
 
152
115
  Rake::GemPackageTask.new(spec) do |pkg|
@@ -177,8 +140,8 @@ task :make_spec do
177
140
  end
178
141
 
179
142
  desc "Builds the project"
180
- task :build => :spec
143
+ task :build => ["install", "test:spec"]
181
144
 
182
145
  desc "Default build will run specs"
183
- task :default => ['test:run:all']
146
+ task :default => :build
184
147
 
@@ -28,15 +28,16 @@ module Restfulie
28
28
  defined?(Restfulie::Server::ActionController::Base) && self.include?(Restfulie::Server::ActionController::Base)
29
29
  end
30
30
  end
31
-
32
- protected
33
31
 
34
32
  # If your controller inherits from Restfulie::Server::Controller::Base,
35
33
  # it will have an :atom option, very similar to render :xml
36
34
  def render(options = nil, extra_options = {}, &block)
37
35
  if options && atom = options[:atom]
38
36
  response.content_type ||= Mime::ATOM
39
- render_for_text(atom.respond_to?(:to_atom) ? atom.to_atom.to_xml : atom.to_xml, options[:status])
37
+ representation = atom.respond_to?(:to_atom) ? atom.to_atom.to_xml : atom.to_xml
38
+ options[:text] = representation
39
+ options[:atom] = nil
40
+ super options
40
41
  else
41
42
  super
42
43
  end
@@ -56,14 +56,20 @@ module Restfulie
56
56
  super
57
57
  end
58
58
  end
59
+
60
+ private
59
61
 
60
62
  def set_public_cache_control!
61
- cache_control = controller.response.headers["Cache-Control"].split(",").map {|k| k.strip }
63
+ cache_control = cache_control_headers.split(",").map {|k| k.strip }
62
64
  cache_control.delete("private")
63
65
  cache_control.delete("no-cache")
64
66
  cache_control << "public"
65
67
  controller.response.headers["Cache-Control"] = cache_control.join(', ')
66
68
  end
69
+
70
+ def cache_control_headers
71
+ controller.response.headers["Cache-Control"] || ""
72
+ end
67
73
 
68
74
  end
69
75
  end
@@ -6,7 +6,7 @@ module Restfulie
6
6
  module CreatedResponder
7
7
 
8
8
  def to_format
9
- if [201, :created].include? options[:status]
9
+ if (options[:status] == 201) || (options[:status] == :created)
10
10
  head :status => 201, :location => controller.url_for(resource)
11
11
  else
12
12
  super
@@ -1,10 +1,73 @@
1
1
  module Restfulie
2
2
  module Server
3
3
  module ActionController
4
+
5
+ # This class is just a proxy for the extension point offered by ActionDispatch::ParamsParser
6
+ class ParamsParser3
7
+
8
+ def register(content_type, representation)
9
+ ActionDispatch::ParamsParser::DEFAULT_PARSERS[Mime::Type.lookup(content_type)] = representation.method(:to_hash).to_proc
10
+ end
11
+
12
+ def unregister(content_type)
13
+ ActionDispatch::ParamsParser::DEFAULT_PARSERS.delete(Mime::Type.lookup(content_type))
14
+ end
15
+ end
16
+
17
+ # This class is just a proxy for the extension point offered by ActionController::Base
18
+ class ParamsParser2
19
+
20
+ def param_parsers
21
+ ::ActionController::Base.param_parsers
22
+ end
23
+
24
+ def register(content_type, representation)
25
+ param_parsers[Mime::Type.lookup(content_type)] = representation.method(:to_hash).to_proc
26
+ end
27
+
28
+ def unregister(content_type)
29
+ param_parsers.delete(Mime::Type.lookup(content_type))
30
+ end
31
+ end
32
+
33
+
4
34
  class ParamsParser
5
- # This class is just a proxy for the extension point offered by ActionController::Base
6
- @@param_parsers = ::ActionController::Base.param_parsers
35
+
36
+ def self.rails3?
37
+ defined?(::ActionDispatch) && defined?(::ActionDispatch::ParamsParser)
38
+ end
39
+
40
+ if rails3?
41
+ @parser = ParamsParser3.new
42
+ else
43
+ @parser = ParamsParser2.new
44
+ # This monkey patch is needed because Rails 2.3.5 doesn't support
45
+ # a way of use rescue_from ActionController handling to return
46
+ # bad request status when trying to parse an invalid body request
47
+ #
48
+ # In Rails 3 this won't be necessary, because all exception handling
49
+ # extensions are handled by the Rack stack
50
+ #
51
+ # TODO Change this when porting this code to Rails 3
52
+ ::ActionController::ParamsParser.class_eval do
53
+ def call(env)
54
+ begin
55
+ if params = parse_formatted_parameters(env)
56
+ env["action_controller.request.request_parameters"] = params
57
+ elsif !(env["CONTENT_TYPE"] == "application/x-www-form-urlencoded") #do not override rails default behaviour for this media type, it's dangerous... (o.O)
58
+ if env["CONTENT_LENGTH"] && (env["CONTENT_LENGTH"] != "0")
59
+ env["action_controller.restfulie.response"] = [415, {'Content-Type' => 'text/html'}, ["<html><body><h1>415 Unsupported Media Type</h1></body></html>"]]
60
+ end
61
+ end
62
+ rescue
63
+ env["action_controller.restfulie.response"] = [400, {'Content-Type' => 'text/html'}, ["<html><body><h1>400 Bad Request</h1></body></html>"]]
64
+ end
7
65
 
66
+ @app.call(env)
67
+ end
68
+ end
69
+ end
70
+
8
71
  ##
9
72
  # :singleton-method:
10
73
  # Use it to register param parsers on the server side.
@@ -15,9 +78,9 @@ module Restfulie
15
78
  # Restfulie::Server::ActionController::ParamsParser.register('application/atom+xml', Atom)
16
79
  #
17
80
  def self.register(content_type, representation)
18
- @@param_parsers[Mime::Type.lookup(content_type)] = representation.method(:to_hash).to_proc
81
+ @parser.register(content_type, representation)
19
82
  end
20
-
83
+
21
84
  ##
22
85
  # :singleton-method:
23
86
  # Use it to unregister param parsers on the server side.
@@ -27,36 +90,11 @@ module Restfulie
27
90
  # Restfulie::Server::ActionController::ParamsParser.unregister('application/atom+xml')
28
91
  #
29
92
  def self.unregister(content_type)
30
- @@param_parsers.delete(Mime::Type.lookup(content_type))
93
+ @parser.unregister(content_type)
31
94
  end
32
95
  end
96
+
33
97
  end
34
98
  end
35
99
  end
36
100
 
37
- # This monkey patch is needed because Rails 2.3.5 doesn't support
38
- # a way of use rescue_from ActionController handling to return
39
- # bad request status when trying to parse an invalid body request
40
- #
41
- # In Rails 3 this won't be necessary, because all exception handling
42
- # extensions are handled by the Rack stack
43
- #
44
- # TODO Change this when porting this code to Rails 3
45
- ::ActionController::ParamsParser.class_eval do
46
- def call(env)
47
- begin
48
- if params = parse_formatted_parameters(env)
49
- env["action_controller.request.request_parameters"] = params
50
- elsif !(env["CONTENT_TYPE"] == "application/x-www-form-urlencoded") #do not override rails default behaviour for this media type, it's dangerous... (o.O)
51
- if env["CONTENT_LENGTH"] && (env["CONTENT_LENGTH"] != "0")
52
- env["action_controller.restfulie.response"] = [415, {'Content-Type' => 'text/html'}, ["<html><body><h1>415 Unsupported Media Type</h1></body></html>"]]
53
- end
54
- end
55
- rescue
56
- env["action_controller.restfulie.response"] = [400, {'Content-Type' => 'text/html'}, ["<html><body><h1>400 Bad Request</h1></body></html>"]]
57
- end
58
-
59
- @app.call(env)
60
- end
61
- end
62
-
@@ -25,8 +25,6 @@ module Restfulie
25
25
  # end
26
26
  #
27
27
  def partial(partial_path, caller_binding = nil)
28
- template = _pick_partial_template(partial_path)
29
-
30
28
  # Create a context to assing variables
31
29
  if caller_binding.kind_of?(Hash)
32
30
  Proc.new do
@@ -42,6 +40,7 @@ module Restfulie
42
40
  partial(partial_path, binding)
43
41
  end.call
44
42
  else
43
+ template = _pick_partial_template(partial_path)
45
44
  eval(template.source, caller_binding, template.path)
46
45
  end
47
46
  end
@@ -4,20 +4,25 @@ module Restfulie
4
4
  module TemplateHandlers #:nodoc:
5
5
  autoload :Tokamak, 'restfulie/server/action_view/template_handlers/tokamak'
6
6
 
7
- # It is needed to explicitly call 'activate!' to install the Tokamak
8
- # template handler
9
- def self.activate!
7
+ def self.template_registry
10
8
  if defined? ::ActionView::Template and
11
9
  ::ActionView::Template.respond_to?(:register_template_handler)
12
10
  ::ActionView::Template
13
11
  else
14
12
  ::ActionView::Base
15
- end.register_template_handler(:tokamak,
13
+ end
14
+ end
15
+
16
+ # It is needed to explicitly call 'activate!' to install the Tokamak
17
+ # template handler
18
+ def self.activate!
19
+ template_registry.register_template_handler(:tokamak,
16
20
  Restfulie::Server::ActionView::TemplateHandlers::Tokamak)
17
21
 
18
- if defined? ::ActionController::Base
19
- ::ActionController::Base.exempt_from_layout :tokamak
20
- end
22
+ # TODO unsure if it can be removed. check feedback prior to 1.0.0
23
+ # if defined?(::ActionController::Base) && ::ActionController::Base.respond_to?(:exempt_from_layout)
24
+ # ::ActionController::Base.exempt_from_layout :tokamak
25
+ # end
21
26
  end
22
27
  end
23
28
  end
@@ -42,10 +42,20 @@ class Array
42
42
  # albums.updated_at(:created_at)
43
43
  #
44
44
  def updated_at(field = :updated_at)
45
- map { |item| item.send(field) if item.respond_to?(field) }.compact.max || Time.now
45
+ max = max_by{|o| o.send(field)}
46
+ if max
47
+ max.send(field)
48
+ else
49
+ Time.now
50
+ end
46
51
  end
47
52
 
48
53
  def published_at(field = :published_at)
49
- map { |item| item.send(field) if item.respond_to?(field) }.compact.min || Time.now
54
+ min = min_by{|o| o.send(field)}
55
+ if min
56
+ min.send(field)
57
+ else
58
+ Time.now
59
+ end
50
60
  end
51
61
  end
@@ -1,5 +1,4 @@
1
1
  require 'restfulie/common'
2
- require 'responders_backport'
3
2
 
4
3
  module Restfulie
5
4
  module Server
@@ -2,7 +2,7 @@ module Restfulie
2
2
  module VERSION #:nodoc:
3
3
  MAJOR = 0
4
4
  MINOR = 9
5
- TINY = 1
5
+ TINY = 3
6
6
 
7
7
  STRING = [MAJOR, MINOR, TINY].join('.')
8
8
 
data/lib/restfulie.rb CHANGED
@@ -1,6 +1,7 @@
1
1
  $:.unshift(File.dirname(__FILE__)) unless $:.include?(File.dirname(__FILE__))
2
2
 
3
3
  require 'restfulie/version'
4
+ require 'restfulie/common'
4
5
  require 'restfulie/client'
5
6
  require 'restfulie/server'
6
7
 
metadata CHANGED
@@ -1,21 +1,21 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: restfulie
3
3
  version: !ruby/object:Gem::Version
4
- hash: 57
4
+ hash: 61
5
5
  prerelease: false
6
6
  segments:
7
7
  - 0
8
8
  - 9
9
- - 1
10
- version: 0.9.1
9
+ - 3
10
+ version: 0.9.3
11
11
  platform: ruby
12
12
  authors:
13
- - Guilherme Silveira, Caue Guerra, Luis Cipriani, Everton Ribeiro, George Guimaraes, Paulo Ahagon
13
+ - Guilherme Silveira, Caue Guerra, Luis Cipriani, Everton Ribeiro, George Guimaraes, Paulo Ahagon, Several contributors
14
14
  autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2010-08-22 00:00:00 -03:00
18
+ date: 2010-08-31 00:00:00 -03:00
19
19
  default_executable:
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency
@@ -66,26 +66,10 @@ dependencies:
66
66
  version: 2.3.2
67
67
  type: :runtime
68
68
  version_requirements: *id003
69
- - !ruby/object:Gem::Dependency
70
- name: responders_backport
71
- prerelease: false
72
- requirement: &id004 !ruby/object:Gem::Requirement
73
- none: false
74
- requirements:
75
- - - ~>
76
- - !ruby/object:Gem::Version
77
- hash: 27
78
- segments:
79
- - 0
80
- - 1
81
- - 0
82
- version: 0.1.0
83
- type: :runtime
84
- version_requirements: *id004
85
69
  - !ruby/object:Gem::Dependency
86
70
  name: json_pure
87
71
  prerelease: false
88
- requirement: &id005 !ruby/object:Gem::Requirement
72
+ requirement: &id004 !ruby/object:Gem::Requirement
89
73
  none: false
90
74
  requirements:
91
75
  - - ">="
@@ -97,7 +81,7 @@ dependencies:
97
81
  - 4
98
82
  version: 1.2.4
99
83
  type: :runtime
100
- version_requirements: *id005
84
+ version_requirements: *id004
101
85
  description:
102
86
  email: guilherme.silveira@caelum.com.br
103
87
  executables: []
@@ -206,6 +190,7 @@ files:
206
190
  - lib/restfulie/version.rb
207
191
  - lib/restfulie.rb
208
192
  - Gemfile
193
+ - Gemfile.lock
209
194
  - LICENSE
210
195
  - Rakefile
211
196
  - README.textile