roar-rails 0.0.2 → 0.0.3

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.
data/.gitignore CHANGED
@@ -1,4 +1,7 @@
1
1
  *.gem
2
+ *.swp
3
+ *.swo
4
+ bin
2
5
  .bundle
3
6
  Gemfile.lock
4
7
  pkg/*
data/.travis.yml ADDED
@@ -0,0 +1,6 @@
1
+ language: ruby
2
+ rvm:
3
+ - 1.9.2
4
+ gemfile:
5
+ - Gemfile
6
+ - gemfiles/Gemfile.rails3-0
data/CHANGES.markdown ADDED
@@ -0,0 +1,3 @@
1
+ h2. 0.0.3
2
+
3
+ * Works with Rails 3.0 now, too. Fixed the `mounted_helpers` import.
data/Gemfile CHANGED
@@ -1,6 +1,4 @@
1
1
  source "http://rubygems.org"
2
2
 
3
- #gem 'actionpack', :path => "../rayls-vor-rebase"
4
-
5
3
  # Specify your gem's dependencies in roar-rails.gemspec
6
4
  gemspec
data/README.markdown CHANGED
@@ -4,26 +4,92 @@ _Makes using Roar's representers in your Rails app fun._
4
4
 
5
5
  ## Features
6
6
 
7
- ### URL Helpers
7
+ * Rendering with responders
8
+ * URL helpers in representers
9
+ * Better tests
10
+ * Autoloading
11
+
12
+ ## Rendering with #respond_with
13
+
14
+ Easily render resources using representers with the built-in responder.
15
+
16
+ ```ruby
17
+ class SingersController < ApplicationController
18
+ respond_to :json
19
+
20
+ def show
21
+ singer = Singer.find_by_id(params[:id])
22
+ respond_with singer
23
+ end
24
+
25
+ def self.responder
26
+ Class.new(super).send :include, Roar::Rails::Responder
27
+ end
28
+
29
+ end
30
+ ```
31
+
32
+ Need to use a representer with a different name than your model? Pass it in using the `:with_representer` option:
33
+
34
+ ```ruby
35
+ class SingersController < ApplicationController
36
+ respond_to :json
37
+
38
+ def show
39
+ singer = Musician.find_by_id(params[:id])
40
+ respond_with singer, :with_representer => SingerRepresenter
41
+ end
42
+
43
+ def self.responder
44
+ Class.new(super).send :include, Roar::Rails::Responder
45
+ end
46
+
47
+ end
48
+ ```
49
+
50
+ Goes great with [Jose Valim's responders gem][responders]!
51
+
52
+ ```ruby
53
+ class SingersController < ApplicationController
54
+ respond_to :json
55
+
56
+ responders Roar::Rails::Responder
57
+
58
+ def show
59
+ singer = Singer.find_by_id(params[:id])
60
+ respond_with singer
61
+ end
62
+
63
+ end
64
+ ```
65
+
66
+ ## URL Helpers
8
67
 
9
68
  Any URL helpers from the Rails app are automatically available in representers.
10
69
 
11
70
  ```ruby
12
71
  module FruitRepresenter
13
72
  include Roar::Representer::JSON
14
-
73
+
15
74
  link :self do
16
75
  fruit_url self
17
76
  end
18
77
  ```
78
+ To get the hyperlinks up and running, please make sure to set the right _host name_ in your environment files (config/environments):
19
79
 
20
- ### Testing
80
+ ```ruby
81
+ config.representer.default_url_options = {:host => "127.0.0.1:3000"}
82
+ ```
21
83
 
22
- ### Autoloading
84
+ ## Testing
23
85
 
86
+ ## Autoloading
24
87
 
88
+ Put your representers in `app/representers` and they will be autoloaded by Rails. Also, frequently used modules as media representers and features don't need to be required manually.
25
89
 
26
90
 
27
91
  ## Contributors
28
92
 
29
- * [Railslove](http://www.railslove.de) and especially Michael Bumann [bumi] have heavily supported development of roar-rails ("resource :singers").
93
+ * [Railslove](http://www.railslove.de) and especially Michael Bumann [bumi] have heavily supported development of roar-rails ("resource :singers").
94
+
95
+ [responders]: https://github.com/plataformatec/responders
@@ -0,0 +1,6 @@
1
+ source "http://rubygems.org"
2
+
3
+ # Specify your gem's dependencies in roar-rails.gemspec
4
+ gemspec path: '../'
5
+
6
+ gem 'railties', '~> 3.0.11'
data/lib/roar-rails.rb CHANGED
@@ -1,5 +1,6 @@
1
1
  require "roar/rails/version"
2
2
  require "roar/representer"
3
+ require "roar/rails/responder"
3
4
  require "roar/rails/railtie"
4
5
 
5
6
  module Roar::Representer
@@ -9,7 +9,7 @@ module Roar
9
9
  initializer "roar.set_configs" do |app|
10
10
  ::Roar::Representer.module_eval do
11
11
  include app.routes.url_helpers
12
- include app.routes.mounted_helpers
12
+ include app.routes.mounted_helpers unless ::Rails::VERSION::MINOR == 0
13
13
 
14
14
  include UrlMethods # provide an initial #default_url_options.
15
15
  end
@@ -0,0 +1,23 @@
1
+ module Roar::Rails
2
+ module Responder
3
+ def extend_with_representer!(resource, representer=nil)
4
+ representer ||= representer_for_resource(resource)
5
+ resource.extend(representer)
6
+ end
7
+ def display(resource, given_options={})
8
+ if resource.respond_to?(:map!)
9
+ resource.map! do |r|
10
+ extend_with_representer!(r)
11
+ r.to_hash
12
+ end
13
+ else
14
+ extend_with_representer!(resource, options.delete(:with_representer))
15
+ end
16
+ super
17
+ end
18
+ private
19
+ def representer_for_resource(resource)
20
+ (resource.class.name + "Representer").constantize
21
+ end
22
+ end
23
+ end
@@ -4,30 +4,30 @@ module Roar
4
4
  def get(action, *args)
5
5
  process(action, "GET", *args)
6
6
  end
7
-
7
+
8
8
  def post(action, *args)
9
9
  process(action, "POST", *args)
10
10
  end
11
-
11
+
12
12
  def put(action, *args)
13
13
  process(action, "PUT", *args)
14
14
  end
15
-
15
+
16
16
  def delete(action, *args)
17
17
  process(action, "DELETE", *args)
18
18
  end
19
-
19
+
20
20
  def process(action, http_method, document="", params={})
21
21
  if document.is_a?(Hash)
22
22
  params = document
23
23
  document = ""
24
24
  end
25
-
25
+
26
26
  request.env['RAW_POST_DATA'] = document
27
-
27
+
28
28
  super(action, params, nil, nil, http_method) # FIXME: for Rails <=3.1, only.
29
29
  end
30
-
30
+
31
31
  module Assertions
32
32
  require 'test_xml/test_unit'
33
33
  def assert_body(body, options={})
@@ -35,7 +35,7 @@ module Roar
35
35
  assert_equal body, response.body
36
36
  end
37
37
  end
38
-
38
+
39
39
  include Assertions
40
40
  end
41
41
  end
@@ -3,7 +3,7 @@
3
3
  module Roar::Rails
4
4
  module UrlMethods
5
5
  def default_url_options
6
- Rails.application.config.representer.default_url_options
6
+ Rails.application.config.representer.default_url_options or {}
7
7
  end
8
8
  end
9
9
  end
@@ -0,0 +1,25 @@
1
+ require 'representable/json/collection'
2
+ require 'representable/json/hash'
3
+
4
+ # Represents a validators hash for a model.
5
+ module ValidatorsRepresenter
6
+ class ValidatorClient
7
+ attr_accessor :kind, :options
8
+ end
9
+
10
+ # Represents a single Validator instance.
11
+ module ValidatorRepresenter
12
+ include Roar::Representer::JSON
13
+ property :kind
14
+ hash :options
15
+ end
16
+
17
+ # Represents an array of validators for an attribute.
18
+ module AttributeValidators
19
+ include Representable::JSON::Collection
20
+ items :extend => ValidatorRepresenter, :class => ValidatorClient
21
+ end
22
+
23
+ include Representable::JSON::Hash
24
+ values :extend => AttributeValidators, :class => Array
25
+ end
@@ -1,5 +1,5 @@
1
1
  module Roar
2
2
  module Rails
3
- VERSION = "0.0.2"
3
+ VERSION = "0.0.3"
4
4
  end
5
5
  end
data/roar-rails.gemspec CHANGED
@@ -18,7 +18,7 @@ Gem::Specification.new do |s|
18
18
  s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
19
19
  s.require_paths = ["lib"]
20
20
 
21
- s.add_runtime_dependency "roar", "~> 0.9.1"
21
+ s.add_runtime_dependency "roar", "~> 0.9.2"
22
22
  s.add_runtime_dependency "test_xml"
23
23
  s.add_runtime_dependency "actionpack", "~> 3.0"
24
24
  s.add_runtime_dependency "railties", "~> 3.0"
@@ -1,9 +1,9 @@
1
1
  module SingerRepresenter
2
2
  include Roar::Representer::JSON
3
3
  include Roar::Representer::Feature::Hypermedia
4
-
4
+
5
5
  property :name
6
-
6
+
7
7
  link :self do
8
8
  singer_url(name)
9
9
  end
@@ -2,12 +2,26 @@ require 'test_helper'
2
2
 
3
3
  class RepresenterTest < ActionController::TestCase
4
4
  include Roar::Rails::TestCase
5
-
5
+
6
6
  tests SingersController
7
-
7
+
8
8
  test "representers can use URL helpers" do
9
9
  get :show, :id => "bumi"
10
10
  assert_body "{\"name\":\"Bumi\",\"links\":[{\"rel\":\"self\",\"href\":\"http://http://roar.apotomo.de/singers/Bumi\"}]}"
11
+ end
11
12
 
13
+ test "it works with uninitialized config.representer.default_url_options" do
14
+ url_options = Rails.application.config.representer.default_url_options
15
+
16
+ begin
17
+ Rails.application.config.representer.default_url_options = nil
18
+ assert_raises RuntimeError, ArgumentError do
19
+ get :show, :id => "bumi"
20
+ end
21
+ assert $!.message =~ /Missing host to link to/
22
+ rescue
23
+ ensure
24
+ Rails.application.config.representer.default_url_options = url_options
25
+ end
12
26
  end
13
27
  end
@@ -0,0 +1,57 @@
1
+ require 'test_helper'
2
+
3
+ Singer = Struct.new(:name)
4
+ class SingersController < ActionController::Base
5
+ respond_to :json
6
+
7
+ def explicit_representer
8
+ singer = Musician.new("Bumi")
9
+ respond_with singer, :with_representer => SingerRepresenter
10
+ end
11
+
12
+ def implicit_representer
13
+ singer = Singer.new("Bumi")
14
+ respond_with singer
15
+ end
16
+
17
+ def collection_of_representers
18
+ singers = [Singer.new("Bumi"), Singer.new("Bjork"), Singer.new("Sinead")]
19
+ respond_with singers
20
+ end
21
+
22
+ def self.responder
23
+ Class.new(super).send :include, Roar::Rails::Responder
24
+ end
25
+
26
+ end
27
+
28
+ class ResponderTest < ActionController::TestCase
29
+ include Roar::Rails::TestCase
30
+
31
+ tests SingersController
32
+
33
+ test "responder allows specifying representer" do
34
+ get :explicit_representer, :format => 'json'
35
+ assert_equal singer.to_json, @response.body
36
+ end
37
+
38
+ test "responder finds representer by convention" do
39
+ get :implicit_representer, :format => 'json'
40
+ assert_equal singer.to_json, @response.body
41
+ end
42
+
43
+ test "responder works with collections" do
44
+ get :collection_of_representers, :format => 'json'
45
+ assert_equal singers.map(&:to_hash).to_json, @response.body
46
+ end
47
+
48
+ def singer(name="Bumi")
49
+ singer = Musician.new(name)
50
+ singer.extend SingerRepresenter
51
+ end
52
+
53
+ def singers
54
+ [singer("Bumi"), singer("Bjork"), singer("Sinead")]
55
+ end
56
+
57
+ end
@@ -0,0 +1,34 @@
1
+ require 'test_helper'
2
+ require 'active_model'
3
+ require 'roar/rails/validations_representer'
4
+
5
+
6
+ class ValidationsTest < MiniTest::Spec
7
+ class Comment
8
+ include ActiveModel::Validations
9
+ validates :name, :presence => true
10
+ end
11
+
12
+ describe "ValidatorRepresenter" do
13
+ it "renders a representation in #to_json" do
14
+ assert_equal "{\"kind\":\"presence\",\"options\":{}}", Comment._validators[:name].first.extend(ValidatorsRepresenter::ValidatorRepresenter).to_json
15
+ end
16
+
17
+ it "parses validator config in #from_json" do
18
+ validator = ValidatorsRepresenter::ValidatorClient.new.extend(ValidatorsRepresenter::ValidatorRepresenter).from_json("{\"kind\":\"presence\",\"attributes\":[\"name\"],\"options\":{}}")
19
+ assert_equal "presence", validator.kind
20
+ assert_equal({}, validator.options)
21
+ end
22
+ end
23
+
24
+ describe "ValidatorsRepresenter" do
25
+ it "renders a collection in #to_json" do
26
+ assert_equal "{\"name\":[{\"kind\":\"presence\",\"options\":{}}]}", Comment._validators.extend(ValidatorsRepresenter).to_json
27
+ end
28
+
29
+ it "parses validators in #from_json" do
30
+ validations = {}.extend(ValidatorsRepresenter).from_json("{\"name\":[{\"kind\":\"presence\",\"options\":[]}]}")
31
+ assert_equal "presence", validations["name"].first.kind
32
+ end
33
+ end
34
+ end
metadata CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
5
5
  segments:
6
6
  - 0
7
7
  - 0
8
- - 2
9
- version: 0.0.2
8
+ - 3
9
+ version: 0.0.3
10
10
  platform: ruby
11
11
  authors:
12
12
  - Nick Sutterer
@@ -14,7 +14,7 @@ autorequire:
14
14
  bindir: bin
15
15
  cert_chain: []
16
16
 
17
- date: 2012-01-05 00:00:00 +01:00
17
+ date: 2012-02-17 00:00:00 +01:00
18
18
  default_executable:
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency
@@ -28,8 +28,8 @@ dependencies:
28
28
  segments:
29
29
  - 0
30
30
  - 9
31
- - 1
32
- version: 0.9.1
31
+ - 2
32
+ version: 0.9.2
33
33
  type: :runtime
34
34
  version_requirements: *id001
35
35
  - !ruby/object:Gem::Dependency
@@ -112,13 +112,18 @@ extra_rdoc_files: []
112
112
 
113
113
  files:
114
114
  - .gitignore
115
+ - .travis.yml
116
+ - CHANGES.markdown
115
117
  - Gemfile
116
118
  - README.markdown
117
119
  - Rakefile
120
+ - gemfiles/Gemfile.rails3-0
118
121
  - lib/roar-rails.rb
119
122
  - lib/roar/rails/railtie.rb
123
+ - lib/roar/rails/responder.rb
120
124
  - lib/roar/rails/test_case.rb
121
125
  - lib/roar/rails/url_methods.rb
126
+ - lib/roar/rails/validations_representer.rb
122
127
  - lib/roar/rails/version.rb
123
128
  - roar-rails.gemspec
124
129
  - test/dummy/Rakefile
@@ -156,8 +161,10 @@ files:
156
161
  - test/dummy/tmp/app/cells/blog/post/latest.html.erb
157
162
  - test/dummy/tmp/app/cells/blog/post_cell.rb
158
163
  - test/representer_test.rb
164
+ - test/responder_test.rb
159
165
  - test/test_case_test.rb
160
166
  - test/test_helper.rb
167
+ - test/validations_test.rb
161
168
  has_rdoc: true
162
169
  homepage: ""
163
170
  licenses: []