roar-rails 0.1.3 → 0.1.4

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 959d27a6419a5834a092dede37f188173746d65c
4
- data.tar.gz: eed0474a1b20ac29b46ac80d748c961ac77e6112
3
+ metadata.gz: e2c494afb7574bfff6fcd23e35e7a2748fe9a9e1
4
+ data.tar.gz: 1bac4790fcb074bda7d834c879707f909ca10a7f
5
5
  SHA512:
6
- metadata.gz: 3120c16e48935d683aea818094fbcb0f65354fc923b7e08e4051ae8dcab2a7f2475b0af976e8830b18f610dd6c60028165f5ecbde12b6214919302cdc05e57f5
7
- data.tar.gz: e6a4eec501b766ef532d1d91ee03e7441e1f085b0cbeeae6228730ba360a4df9fbb7b9198b844fa57fe411d161b4189960f931a275d0a25762ffdf79f052c574
6
+ metadata.gz: 3f10afc52cf7f202fde0e71fdabeda3eff795608ee5c494c955cbbb5f0b22aa2b1e08797c2e008fd4c91a7d07511c549e3ce44cd12b1ca958dc2cd7b42a79e58
7
+ data.tar.gz: f7ab0351b2e51a8d5d198f48e2e7c9ac77b3c0ce33803121b450890b073fa145b5487ec89d30a6fc6438ae5f90ee459ae7b9a7554357a969c23cd14547b5acb4
data/.gitignore CHANGED
@@ -6,4 +6,5 @@ bin
6
6
  Gemfile*.lock
7
7
  pkg/*
8
8
  test/dummy/log/*
9
+ test/dummy/tmp/*
9
10
  .rvmrc
data/CHANGES.markdown CHANGED
@@ -1,3 +1,8 @@
1
+ h2. 0.1.4
2
+
3
+ * Added a generator to create modules from the command-line. Thanks to Guilherme Cavalcanti <guiocavalcanti> for working on this.
4
+ * We always use `request.body.read` now, however, we call `rewind` beforehand.
5
+
1
6
  h2. 0.1.3
2
7
 
3
8
  * Fix a bug where `TestCase` wouldn't work in 3.2.
data/README.markdown CHANGED
@@ -11,13 +11,44 @@ Roar is a framework for parsing and rendering REST documents. For a better overv
11
11
  * URL helpers in representers
12
12
  * Better tests
13
13
  * Autoloading
14
+ * Generators
14
15
 
15
16
  This gem works with all Rails >= 3.x.
16
17
 
18
+
19
+ ## Generators
20
+
21
+ The generator will create the representer modules in `app/representers` for you.
22
+
23
+ Here's an example.
24
+
25
+ ```shell
26
+ rails g representer Band id name
27
+ ```
28
+
29
+ This will create the file `app/representers/band_representer.rb` with the following content,
30
+
31
+ ```ruby
32
+ module BandRepresenter
33
+ include Roar::Representer::JSON
34
+
35
+ property :id
36
+ property :name
37
+ end
38
+ ```
39
+
40
+ You can change the format (e.g. XML), and pass arbitrary options to customize the generated representer. For all available options, just run
41
+
42
+ ```shell
43
+ rails g representer
44
+ ```
45
+
46
+
17
47
  ## Rendering with #respond_with
18
48
 
19
49
  roar-rails provides a number of baked-in rendering methods.
20
50
 
51
+
21
52
  ### Conventional Rendering
22
53
 
23
54
  Easily render resources using representers with the built-in responder.
@@ -129,6 +160,7 @@ end
129
160
 
130
161
  In decorators' link blocks you currently have to use `represented` to get the actual represented model (this is `self` in module representers).
131
162
 
163
+
132
164
  ## Passing Options
133
165
 
134
166
  Both rendering and consuming support passing user options to the representer.
@@ -0,0 +1,42 @@
1
+ Description:
2
+ Creates a new Representer and its properties.
3
+
4
+ This generates a representer module in app/representers directory.
5
+
6
+ Examples:
7
+
8
+ rails g representer Band id name
9
+
10
+ This will create a representer as follows:
11
+
12
+ module BandRepresenter
13
+ include Roar::Representer::JSON
14
+
15
+ property :id
16
+ property :name
17
+ end
18
+
19
+ You can pass :class and :extend property options:
20
+
21
+ rails g singer id instrument:equipament:instrument_representer
22
+
23
+ This will add property options:
24
+
25
+ module SingerRepresenter
26
+ include Roar::Representer::JSON
27
+
28
+ property :id
29
+ property :instrument, :class => Equipament, :extend => InstrumentRepresenter
30
+ end
31
+
32
+ You can also choose representer format with --format option
33
+
34
+ rails g representer Band id name --format=xml
35
+
36
+ module BandRepresenter
37
+ include Roar::Representer::XML
38
+
39
+ property :id
40
+ property :name
41
+ end
42
+
@@ -0,0 +1,70 @@
1
+ module Rails
2
+ module Generators
3
+ class RepresenterGenerator < Rails::Generators::NamedBase
4
+ source_root File.expand_path("../templates", __FILE__)
5
+
6
+ argument :properties, :type => :array, :default => [],
7
+ :banner => "property[:class[:extend]] property[:class[:extend]]"
8
+
9
+ class_option :format, :default => :json, :banner => "--format=JSON",
10
+ :desc => "Use different formats JSON, JSON::HAL or XML"
11
+
12
+ def generate_representer_file
13
+ template('representer.rb', file_path)
14
+ end
15
+
16
+ private
17
+
18
+ def format
19
+ options[:format].upcase
20
+ end
21
+
22
+ def property_options
23
+ PropertyBuilder.new(properties)
24
+ end
25
+
26
+ def file_path
27
+ base_path = 'app/representers'
28
+ File.join(base_path, class_path, "#{file_name}_representer.rb")
29
+ end
30
+
31
+ class PropertyBuilder
32
+ include Enumerable
33
+
34
+ def initialize(properties)
35
+ @raw = properties
36
+ end
37
+
38
+ def each(&block)
39
+ properties_with_options.each(&block)
40
+ end
41
+
42
+ private
43
+
44
+ def properties_with_options
45
+ properties.map do |(name, klass, representer)|
46
+ p = [name_option(name)]
47
+ p << hash_option(:class, klass)
48
+ p << hash_option(:extend, representer)
49
+
50
+ p.compact.join(', ')
51
+ end
52
+ end
53
+
54
+ def name_option(name)
55
+ return unless name
56
+ "property :#{name}"
57
+ end
58
+
59
+ def hash_option(key, value)
60
+ return unless key && value
61
+ ":#{key} => #{value.classify}"
62
+ end
63
+
64
+ def properties
65
+ @raw.map { |p| p.split(':') }
66
+ end
67
+ end
68
+ end
69
+ end
70
+ end
@@ -0,0 +1,6 @@
1
+ module <%= class_name %>Representer
2
+ include Roar::Representer::<%= format %>
3
+ <% property_options.each do |property| %>
4
+ <%= property -%>
5
+ <% end %>
6
+ end
@@ -49,9 +49,7 @@ module Roar::Rails
49
49
 
50
50
  def incoming_string
51
51
  body = request.body
52
-
53
- # this is my first respond_to? ever and i hate it (thanks, Rails :)
54
- return body.string if body.respond_to?(:string)
52
+ body.rewind
55
53
  body.read
56
54
  end
57
55
 
@@ -1,5 +1,5 @@
1
1
  module Roar
2
2
  module Rails
3
- VERSION = "0.1.3"
3
+ VERSION = "0.1.4"
4
4
  end
5
5
  end
data/test/consume_test.rb CHANGED
@@ -72,17 +72,15 @@ class ConsumeWithOptionsOverridingConfigurationTest < ActionController::TestCase
72
72
  end
73
73
 
74
74
  class RequestBodyStringTest < ConsumeTest
75
- test "allows Request instances supporting #string instead of #read" do
75
+ test "#read rewinds before reading" do
76
76
  @request.instance_eval do
77
77
  def body
78
- Object.new.instance_eval do
79
- def read; ""; end
80
- def string; "{\"name\": \"Bumi\"}"; end # in rails 4, for whatever reasons, #read doesn't work as expected.
81
-
82
- self
83
- end
78
+ incoming = super
79
+ incoming.read
80
+ incoming
84
81
  end
85
82
  end
83
+
86
84
  post :consume_json, "{\"name\": \"Bumi\"}", :format => 'json'
87
85
  assert_equal %{#<struct Singer name="Bumi">}, @response.body
88
86
  end
@@ -0,0 +1,57 @@
1
+ require 'test_helper'
2
+ require 'rails/generators'
3
+
4
+ require 'generators/rails/representer_generator'
5
+
6
+ class RepresentetGeneratorTest < Rails::Generators::TestCase
7
+ destination File.join(Rails.root, "tmp")
8
+ setup :prepare_destination
9
+ tests Rails::Generators::RepresenterGenerator
10
+
11
+ test "create a representer with correct class_name" do
12
+ run_generator %w(singer)
13
+
14
+ assert_file representer_path('singer'), /module SingerRepresenter/
15
+ end
16
+
17
+ test "create a representer with correct properties" do
18
+ run_generator %w(singer name id)
19
+
20
+ assert_file representer_path('singer'), /property :name/
21
+ assert_file representer_path('singer'), /property :id/
22
+ end
23
+
24
+ test "create a representer with default json support" do
25
+ run_generator %w(singer)
26
+
27
+ assert_file representer_path('singer'), /include Roar::Representer::JSON/
28
+ end
29
+
30
+ test "create a representer with different format support" do
31
+ run_generator %w(singer --format=XML)
32
+
33
+ assert_file representer_path('singer'), /include Roar::Representer::XML/
34
+ end
35
+
36
+ test "create a representer with property, class and exnted" do
37
+ run_generator %w(singer band:band:group_representer instrument:equipament:instrument_representer)
38
+
39
+ assert_file representer_path('singer'),
40
+ /property :band, :class => Band, :extend => GroupRepresenter/
41
+ assert_file representer_path('singer'),
42
+ /property :instrument, :class => Equipament, :extend => InstrumentRepresenter/
43
+ end
44
+
45
+ test "create a representer with property and class only" do
46
+ run_generator %w(singer band:band instrument:equipament)
47
+
48
+ assert_file representer_path('singer'),
49
+ /property :band, :class => Band/
50
+ assert_file representer_path('singer'),
51
+ /property :instrument, :class => Equipament/
52
+ end
53
+
54
+ def representer_path(name)
55
+ "app/representers/#{name}_representer.rb"
56
+ end
57
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: roar-rails
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.3
4
+ version: 0.1.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Nick Sutterer
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-08-09 00:00:00.000000000 Z
11
+ date: 2013-08-22 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: roar
@@ -167,6 +167,9 @@ files:
167
167
  - gemfiles/Gemfile.rails3-0
168
168
  - gemfiles/Gemfile.rails3-2
169
169
  - gemfiles/Gemfile.rails4-0
170
+ - lib/generators/rails/USAGE
171
+ - lib/generators/rails/representer_generator.rb
172
+ - lib/generators/rails/templates/representer.rb
170
173
  - lib/roar-rails.rb
171
174
  - lib/roar/rails/controller_additions.rb
172
175
  - lib/roar/rails/hal.rb
@@ -218,10 +221,9 @@ files:
218
221
  - test/dummy/public/javascripts/rails.js
219
222
  - test/dummy/public/stylesheets/.gitkeep
220
223
  - test/dummy/script/rails
221
- - test/dummy/tmp/app/cells/blog/post/latest.html.erb
222
- - test/dummy/tmp/app/cells/blog/post_cell.rb
223
224
  - test/json_hal_renderer_test.rb
224
225
  - test/representer_computer_test.rb
226
+ - test/representer_generator_test.rb
225
227
  - test/representer_test.rb
226
228
  - test/responder_test.rb
227
229
  - test/test_case_test.rb
@@ -1,7 +0,0 @@
1
- <h1>
2
- Blog::Post#latest
3
- </h1>
4
-
5
- <p>
6
- Find me in app/cells/blog/post/latest.html.erb
7
- </p>
@@ -1,7 +0,0 @@
1
- class Blog::PostCell < Cell::Rails
2
-
3
- def latest
4
- render
5
- end
6
-
7
- end