decent_exposure 3.0.0 → 3.0.1

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 2f8425a920206dc8af5e761d2f3f3783a7a7c6b4
4
- data.tar.gz: b3f21e7fb044bf0b554cc26918d40ce84aa5b188
3
+ metadata.gz: 2c22278ff98a7439d7b4a8b1f6cde9f9a1dc9a9a
4
+ data.tar.gz: 7a781674c590dbf7d1d200895babf9633b49c733
5
5
  SHA512:
6
- metadata.gz: fbe1b3c1f9806de47df1a8ce1700d9ab5908c1981bc92fd1f63e528f4d60896556e9c9ede8b73b1966a047916158aaa33a141a3451aa4577a4cadf9da092ee2f
7
- data.tar.gz: f50003ad917244794fdd3a767d9e18dc3d40ab22914a60f8efb7d77639facdf09e02436647821df43a0157ff0bb4f2332005275db419f784ab18dfc21a25bcad
6
+ metadata.gz: 8aa99377c24ced53c356cbb1fbf7c37b261085011de8eb0c104c2fdbfef54f3befed765f5aabf3bffaee6e900b948e640b84891c9b51b22378a98b9a3ffcdddc
7
+ data.tar.gz: 97a5d39339fd28c51c003e1aa216c1174bcfbaa85d80f25c0ce87db98ecaf82dac2521ae3a89c6b271d470d5dcb460d795acc5f5c33b5194756a10ac1d4341a8
data/CHANGELOG.md ADDED
@@ -0,0 +1,16 @@
1
+ # DecentExposure History/Changelog
2
+
3
+ All notable changes to this project will be documented in this file.
4
+ This project adheres to [Semantic Versioning](http://semver.org/).
5
+
6
+
7
+ ## 3.0.1
8
+
9
+ * Allow exposures with a question mark (?).
10
+ * Remove setter from view helper.
11
+ * Fix undefined `helper_method` error
12
+
13
+ ## 3.0.0
14
+
15
+ * New codebase, see [api changes document](https://github.com/hashrocket/decent_exposure/wiki/Api-changes-in-version-3).
16
+
data/README.md CHANGED
@@ -334,18 +334,15 @@ Mailers and Controllers use the save decent_exposure dsl.
334
334
 
335
335
  ```ruby
336
336
  class PostMailer < ApplicationMailer
337
- attr_accessor :post_id
338
-
339
337
  expose(:posts, -> { Post.last(10) })
340
- expose(:post, id: -> { post_id })
338
+ expose(:post)
341
339
 
342
340
  def top_posts
343
341
  @greeting = "Top Posts"
344
342
  mail to: "to@example.org"
345
343
  end
346
344
 
347
- def featured_post(post_id = nil)
348
- self.post_id = post_id
345
+ def featured_post(id:)
349
346
  @greeting = "Featured Post"
350
347
  mail to: "to@example.org"
351
348
  end
@@ -24,5 +24,6 @@ Gem::Specification.new do |spec|
24
24
 
25
25
  spec.add_dependency "activesupport", ">= 4.0"
26
26
  spec.add_development_dependency "railties", ">= 4.0"
27
+ spec.add_development_dependency "actionmailer"
27
28
  spec.add_development_dependency "rspec-rails", "~> 3.0"
28
29
  end
@@ -4,6 +4,7 @@ require "generators/decent_exposure/scaffold_templates_generator"
4
4
 
5
5
  module DecentExposure
6
6
  autoload :Controller, "decent_exposure/controller"
7
+ autoload :Mailer, "decent_exposure/mailer"
7
8
  autoload :Exposure, "decent_exposure/exposure"
8
9
  autoload :Attribute, "decent_exposure/attribute"
9
10
  autoload :Context, "decent_exposure/context"
@@ -16,5 +17,6 @@ module DecentExposure
16
17
 
17
18
  ActiveSupport.on_load :action_mailer do
18
19
  include Controller
20
+ include Mailer
19
21
  end
20
22
  end
@@ -51,7 +51,7 @@ module DecentExposure
51
51
  end
52
52
 
53
53
  def ivar_name
54
- "@#{attribute.ivar_name}"
54
+ "@#{attribute.ivar_name.gsub('?', '_question_mark_')}"
55
55
  end
56
56
 
57
57
  def fetch_value
@@ -67,8 +67,9 @@ module DecentExposure
67
67
  end
68
68
 
69
69
  def expose_helper_methods!
70
- helper_methods = [ attribute.getter_method_name, attribute.setter_method_name ]
71
- controller.helper_method *helper_methods
70
+ return unless controller.respond_to?(:helper_method)
71
+
72
+ controller.helper_method attribute.getter_method_name
72
73
  end
73
74
 
74
75
  def normalize_options
@@ -0,0 +1,14 @@
1
+ module DecentExposure
2
+ module Mailer
3
+ def self.included(base)
4
+ base.class_eval do
5
+ attr_accessor :params
6
+
7
+ def process_action(*args)
8
+ self.params = args.second.stringify_keys() if args.second
9
+ super
10
+ end
11
+ end
12
+ end
13
+ end
14
+ end
@@ -1,3 +1,3 @@
1
1
  module DecentExposure
2
- VERSION = "3.0.0"
2
+ VERSION = "3.0.1"
3
3
  end
@@ -1,6 +1,6 @@
1
1
  require "spec_helper"
2
2
 
3
- describe DecentExposure::Controller do
3
+ RSpec.describe DecentExposure::Controller do
4
4
  class Thing; end
5
5
  class DifferentThing; end
6
6
 
@@ -41,8 +41,13 @@ describe DecentExposure::Controller do
41
41
  end
42
42
 
43
43
  context "helper methods" do
44
- it "exposes getter and setter as controller helper methods" do
45
- expect(controller_klass).to receive(:helper_method).with(:thing, :thing=)
44
+ it "exposes getter as controller helper methods" do
45
+ expect(controller_klass).to receive(:helper_method).with(:thing)
46
+ expose :thing
47
+ end
48
+
49
+ it "does not expose setter as controller helper methods" do
50
+ expect(controller_klass).to_not receive(:helper_method).with(:thing=)
46
51
  expose :thing
47
52
  end
48
53
  end
@@ -0,0 +1,70 @@
1
+ require "spec_helper"
2
+ require "support/rails_app"
3
+ require "rspec/rails"
4
+
5
+ RSpec.describe Api::BirdsController, type: :controller do
6
+ let(:bird){ Bird.new }
7
+
8
+ context 'when birds relation is exposed' do
9
+ class Api::BirdsController
10
+ expose :birds, ->{ Bird.all }
11
+ end
12
+
13
+ it "fetches all birds" do
14
+ expect(Bird).to receive(:all).and_return([bird])
15
+ get :index
16
+ expect(controller.birds).to eq([bird])
17
+ end
18
+ end
19
+
20
+ context 'when a bird is exposed' do
21
+ class Api::BirdsController
22
+ expose :bird
23
+ end
24
+
25
+ it "finds model by id" do
26
+ expect(Bird).to receive(:find).with("bird-id").and_return(bird)
27
+ get :show, request_params(id: "bird-id")
28
+ expect(controller.bird).to eq(bird)
29
+ end
30
+
31
+ it "finds model by bird_id" do
32
+ expect(Bird).to receive(:find).with("bird-id").and_return(bird)
33
+ get :new, request_params(bird_id: "bird-id")
34
+ expect(controller.bird).to eq(bird)
35
+ end
36
+
37
+ it "builds bird if id is not provided" do
38
+ get :new
39
+ expect(controller.bird).to be_a(Bird)
40
+ end
41
+ end
42
+
43
+ context "when bird_params is defined" do
44
+ class Api::BirdsController
45
+ expose :bird
46
+
47
+ def bird_params
48
+ params.require(:bird).permit(:name)
49
+ end
50
+ end
51
+
52
+ it "bird is build with params set" do
53
+ post :create, request_params(bird: { name: "crow" })
54
+ expect(controller.bird.name).to eq("crow")
55
+ end
56
+ end
57
+
58
+ context 'when a bird? with a question mark is exposed' do
59
+ class Api::BirdsController
60
+ expose :bird
61
+ expose :bird?, -> { bird.present? }
62
+ end
63
+
64
+ it "exposes bird?" do
65
+ expect(Bird).to receive(:find).with("bird-id").and_return(bird)
66
+ get :show, request_params(id: "bird-id")
67
+ expect(controller.bird?).to be true
68
+ end
69
+ end
70
+ end
@@ -0,0 +1,70 @@
1
+ require "spec_helper"
2
+ require "support/rails_app"
3
+ require "rspec/rails"
4
+
5
+ RSpec.describe BirdsController, type: :controller do
6
+ let(:bird){ Bird.new }
7
+
8
+ context 'when birds relation is exposed' do
9
+ class BirdsController
10
+ expose :birds, ->{ Bird.all }
11
+ end
12
+
13
+ it "fetches all birds" do
14
+ expect(Bird).to receive(:all).and_return([bird])
15
+ get :index
16
+ expect(controller.birds).to eq([bird])
17
+ end
18
+ end
19
+
20
+ context 'when a bird is exposed' do
21
+ class BirdsController
22
+ expose :bird
23
+ end
24
+
25
+ it "finds model by id" do
26
+ expect(Bird).to receive(:find).with("bird-id").and_return(bird)
27
+ get :show, request_params(id: "bird-id")
28
+ expect(controller.bird).to eq(bird)
29
+ end
30
+
31
+ it "finds model by bird_id" do
32
+ expect(Bird).to receive(:find).with("bird-id").and_return(bird)
33
+ get :new, request_params(bird_id: "bird-id")
34
+ expect(controller.bird).to eq(bird)
35
+ end
36
+
37
+ it "builds bird if id is not provided" do
38
+ get :new
39
+ expect(controller.bird).to be_a(Bird)
40
+ end
41
+ end
42
+
43
+ context "when bird_params is defined" do
44
+ class BirdsController
45
+ expose :bird
46
+
47
+ def bird_params
48
+ params.require(:bird).permit(:name)
49
+ end
50
+ end
51
+
52
+ it "bird is build with params set" do
53
+ post :create, request_params(bird: { name: "crow" })
54
+ expect(controller.bird.name).to eq("crow")
55
+ end
56
+ end
57
+
58
+ context 'when a bird? with a question mark is exposed' do
59
+ class BirdsController
60
+ expose :bird
61
+ expose :bird?, -> { bird.present? }
62
+ end
63
+
64
+ it "exposes bird?" do
65
+ expect(Bird).to receive(:find).with("bird-id").and_return(bird)
66
+ get :show, request_params(id: "bird-id")
67
+ expect(controller.bird?).to be true
68
+ end
69
+ end
70
+ end
@@ -0,0 +1,44 @@
1
+ require "spec_helper"
2
+ require "support/rails_app"
3
+ require "rspec/rails"
4
+ require "action_mailer"
5
+
6
+ class BirdsMailer < ActionMailer::Base
7
+ end
8
+
9
+ RSpec.describe BirdsMailer, type: :mailer do
10
+ let(:bird){ double :bird }
11
+ let(:birds) { double :birds }
12
+
13
+ context "when birds relation is exposed" do
14
+ class BirdsMailer
15
+ expose(:birds, -> { Bird.all })
16
+
17
+ def hello_birds
18
+ mail { |format| format.text { render plain: "Hello #{birds}" } }
19
+ end
20
+ end
21
+
22
+ it "sends the email with exposed birds" do
23
+ expect(Bird).to receive(:all).and_return(birds)
24
+ expect(described_class.hello_birds.body.to_s)
25
+ .to include("Hello #{birds}")
26
+ end
27
+ end
28
+
29
+ context "when bird is exposed" do
30
+ class BirdsMailer
31
+ expose(:bird)
32
+
33
+ def hello_bird(id:)
34
+ mail { |format| format.text { render plain: "Hello #{bird}" } }
35
+ end
36
+ end
37
+
38
+ it "sends the email with exposed bird" do
39
+ expect(Bird).to receive(:find).with('some-id').and_return(bird)
40
+ expect(described_class.hello_bird(id: 'some-id').body.to_s)
41
+ .to include("Hello #{bird}")
42
+ end
43
+ end
44
+ end
@@ -1,8 +1,11 @@
1
- require "active_support/all"
2
1
  require "action_controller"
3
- require "action_dispatch"
4
2
  require "rails"
5
3
 
4
+ def request_params(params)
5
+ return params if Rails::VERSION::MAJOR < 5
6
+ { params: params }
7
+ end
8
+
6
9
  module Rails
7
10
  class App
8
11
  def env_config; {} end
@@ -10,28 +13,55 @@ module Rails
10
13
  def routes
11
14
  @routes ||= ActionDispatch::Routing::RouteSet.new.tap do |routes|
12
15
  routes.draw do
13
- resource :birds
16
+ resources :birds
17
+
18
+ namespace :api do
19
+ resources :birds
20
+ end
14
21
  end
15
22
  end
16
23
  end
17
24
  end
18
25
 
26
+ def self.root
27
+ ''
28
+ end
29
+
19
30
  def self.application
20
31
  @app ||= App.new
21
32
  end
22
33
  end
23
34
 
24
35
  class Bird
36
+ attr_accessor :name
37
+ def initialize(options = {})
38
+ options.each { |k, v| self.public_send("#{k}=", v) }
39
+ end
25
40
  end
26
41
 
27
42
  class ApplicationController < ActionController::Base
28
43
  include Rails.application.routes.url_helpers
29
44
  end
30
45
 
46
+ def base_api_class
47
+ return ApplicationController if Rails::VERSION::MAJOR < 5
48
+ ActionController::API
49
+ end
50
+
31
51
  class BirdsController < ApplicationController
32
- expose :bird
52
+ %i(index show edit new create update).each do |action|
53
+ define_method action do
54
+ head :ok
55
+ end
56
+ end
57
+ end
33
58
 
34
- def show
35
- head :ok
59
+ module Api
60
+ class BirdsController < base_api_class
61
+ %i(index show edit new create update).each do |action|
62
+ define_method action do
63
+ head :ok
64
+ end
65
+ end
36
66
  end
37
67
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: decent_exposure
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.0.0
4
+ version: 3.0.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Pavel Pravosud
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2016-07-01 00:00:00.000000000 Z
12
+ date: 2016-10-26 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: activesupport
@@ -39,6 +39,20 @@ dependencies:
39
39
  - - ">="
40
40
  - !ruby/object:Gem::Version
41
41
  version: '4.0'
42
+ - !ruby/object:Gem::Dependency
43
+ name: actionmailer
44
+ requirement: !ruby/object:Gem::Requirement
45
+ requirements:
46
+ - - ">="
47
+ - !ruby/object:Gem::Version
48
+ version: '0'
49
+ type: :development
50
+ prerelease: false
51
+ version_requirements: !ruby/object:Gem::Requirement
52
+ requirements:
53
+ - - ">="
54
+ - !ruby/object:Gem::Version
55
+ version: '0'
42
56
  - !ruby/object:Gem::Dependency
43
57
  name: rspec-rails
44
58
  requirement: !ruby/object:Gem::Requirement
@@ -67,6 +81,7 @@ extra_rdoc_files: []
67
81
  files:
68
82
  - ".gitignore"
69
83
  - ".travis.yml"
84
+ - CHANGELOG.md
70
85
  - Gemfile
71
86
  - LICENSE.txt
72
87
  - README.md
@@ -83,6 +98,7 @@ files:
83
98
  - lib/decent_exposure/controller.rb
84
99
  - lib/decent_exposure/exposure.rb
85
100
  - lib/decent_exposure/flow.rb
101
+ - lib/decent_exposure/mailer.rb
86
102
  - lib/decent_exposure/version.rb
87
103
  - lib/generators/decent_exposure/USAGE
88
104
  - lib/generators/decent_exposure/scaffold_templates_generator.rb
@@ -97,9 +113,11 @@ files:
97
113
  - lib/generators/decent_exposure/templates/new.html.haml
98
114
  - lib/generators/decent_exposure/templates/show.html.erb
99
115
  - lib/generators/decent_exposure/templates/show.html.haml
100
- - spec/controller_spec.rb
116
+ - spec/decent_exposure/controller_spec.rb
117
+ - spec/features/api_birds_controller_spec.rb
118
+ - spec/features/birds_controller_spec.rb
119
+ - spec/features/birds_mailer_spec.rb
101
120
  - spec/generators/decent_exposure/scaffold_templates_generator_spec.rb
102
- - spec/integration_spec.rb
103
121
  - spec/spec_helper.rb
104
122
  - spec/support/rails_app.rb
105
123
  homepage: https://github.com/hashrocket/decent_exposure
@@ -127,8 +145,10 @@ signing_key:
127
145
  specification_version: 4
128
146
  summary: A helper for creating declarative interfaces in controllers
129
147
  test_files:
130
- - spec/controller_spec.rb
148
+ - spec/decent_exposure/controller_spec.rb
149
+ - spec/features/api_birds_controller_spec.rb
150
+ - spec/features/birds_controller_spec.rb
151
+ - spec/features/birds_mailer_spec.rb
131
152
  - spec/generators/decent_exposure/scaffold_templates_generator_spec.rb
132
- - spec/integration_spec.rb
133
153
  - spec/spec_helper.rb
134
154
  - spec/support/rails_app.rb
@@ -1,26 +0,0 @@
1
- require "spec_helper"
2
- require "support/rails_app"
3
- require "rspec/rails"
4
-
5
- describe BirdsController, type: :controller do
6
- context "finds bird by id" do
7
- let(:mockingbird){ double("Bird") }
8
- before{ expect(Bird).to receive(:find).with("mockingbird").once.and_return(mockingbird) }
9
- after{ expect(controller.bird).to eq(mockingbird) }
10
-
11
- it "finds model by id" do
12
- get :show, { id: "mockingbird" }
13
- end
14
-
15
- it "finds model by bird_id" do
16
- get :show, { bird_id: "mockingbird" }
17
- end
18
- end
19
-
20
- it "builds bird if id is not provided" do
21
- bird = double("Bird")
22
- expect(Bird).to receive(:new).with({}).and_return(bird)
23
- get :show
24
- expect(controller.bird).to eq(bird)
25
- end
26
- end