Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
fixing many things.
  • Loading branch information
apotonick committed Dec 7, 2016
1 parent 8a1a402 commit 9ec75c0
Show file tree
Hide file tree
Showing 7 changed files with 49 additions and 62 deletions.
2 changes: 1 addition & 1 deletion Gemfile
Expand Up @@ -8,6 +8,6 @@ gem "multi_json"
gem "minitest-line"

gem "trailblazer", path: "../trailblazer"
gem "trailblazer-operation", path: "../operation"
# gem "trailblazer-operation", path: "../operation"

gem "dry-validation"
31 changes: 13 additions & 18 deletions Gemfile.lock
@@ -1,19 +1,11 @@
PATH
remote: ../operation
specs:
trailblazer-operation (2.0.0)
declarative
pipetree (>= 0.0.2, < 0.1.0)
uber (>= 0.0.15)

PATH
remote: ../trailblazer
specs:
trailblazer (2.0.0)
trailblazer (2.0.0.beta1)
declarative
reform (>= 2.0.0, < 3.0.0)
reform (>= 2.2.0, < 3.0.0)
trailblazer-operation
uber (>= 0.0.15)
uber (>= 0.1.0, < 0.2.0)

PATH
remote: .
Expand Down Expand Up @@ -65,16 +57,20 @@ GEM
minitest-line (0.6.3)
minitest (~> 5.0)
multi_json (1.12.1)
pipetree (0.0.3)
pipetree (0.0.4)
rake (11.3.0)
reform (2.2.1)
reform (2.2.3)
disposable (>= 0.3.0, < 0.4.0)
representable (>= 2.4.0, < 3.1.0)
uber (~> 0.0.11)
representable (3.0.0)
uber (>= 0.0.15, < 0.2.0)
representable (3.0.2)
declarative (~> 0.0.5)
uber (~> 0.0.15)
uber (0.0.15)
uber (>= 0.0.15, < 0.2.0)
trailblazer-operation (0.0.6)
declarative
pipetree (>= 0.0.4, < 0.1.0)
uber (>= 0.1.0, < 0.2.0)
uber (0.1.0)

PLATFORMS
ruby
Expand All @@ -88,7 +84,6 @@ DEPENDENCIES
rake
trailblazer!
trailblazer-endpoint!
trailblazer-operation!

BUNDLED WITH
1.12.5
7 changes: 4 additions & 3 deletions lib/trailblazer/endpoint.rb
Expand Up @@ -12,20 +12,21 @@ class Endpoint
match: ->(result) { result.success? },
resolve: ->(result) { result }),
created: Dry::Matcher::Case.new(
match: ->(result) { result.success? && result["model.action"] == :create }, # the "model.action" doesn't mean you need Model.
match: ->(result) { result.success? && result["model.action"] == :new }, # the "model.action" doesn't mean you need Model.
resolve: ->(result) { result }),
not_found: Dry::Matcher::Case.new(
match: ->(result) { result.failure? && result["result.model"] && result["result.model"].failure? },
resolve: ->(result) { result }),
# TODO: we could add unauthorized here.
unauthenticated: Dry::Matcher::Case.new(
match: ->(result) { result.failure? && result["result.policy"].failure? }, # FIXME: we might need a &. here ;)
match: ->(result) { result.failure? && result["result.policy.default"].failure? }, # FIXME: we might need a &. here ;)
resolve: ->(result) { result }),
invalid: Dry::Matcher::Case.new(
match: ->(result) { result.failure? && result["result.contract"] },
match: ->(result) { result.failure? && result["result.contract.default"] && result["result.contract.default"].failure? },
resolve: ->(result) { result })
)

# `call`s the operation.
def self.call(operation_class, handlers, *args, &block)
result = operation_class.(*args)
new.(result, handlers, &block)
Expand Down
2 changes: 1 addition & 1 deletion lib/trailblazer/endpoint/rails.rb
Expand Up @@ -20,7 +20,7 @@ def call
m.present { |result| controller.render json: result["representer.serializer.class"].new(result['model']), status: 200 }
m.created { |result| controller.head 201, location: "#{@path}/#{result["model"].id}" }#, result["representer.serializer.class"].new(result["model"]).to_json
m.success { |result| controller.head 200, location: "#{@path}/#{result["model"].id}" }
m.invalid { |result| controller.render json: result["representer.errors.class"].new(result['result.contract'].errors), status: 422 }
m.invalid { |result| controller.render json: result["representer.errors.class"].new(result['result.contract.default'].errors).to_json, status: 422 }
end
end
end
Expand Down
43 changes: 17 additions & 26 deletions test/endpoint_test.rb
Expand Up @@ -2,11 +2,7 @@

require "reform"
require "trailblazer"
require "trailblazer/operation/model"
require "reform/form/dry"
require "trailblazer/operation/contract"
require "trailblazer/operation/representer"
require "trailblazer/operation/guard"
require "trailblazer/endpoint"
require "trailblazer/endpoint/rails"

Expand Down Expand Up @@ -43,8 +39,7 @@ class Deserializer < Representable::Decorator
# present
class Show < Trailblazer::Operation
extend Representer::DSL
include Model
model Song, :find_by
step Model( Song, :find_by )
representer :serializer, Serializer
end

Expand All @@ -66,8 +61,7 @@ class Show < Trailblazer::Operation


class Create < Trailblazer::Operation
include Policy::Guard
policy ->(*) { self["user.current"] == ::Module }
step Policy::Guard ->(options) { options["user.current"] == ::Module }

extend Representer::DSL
representer :serializer, Serializer
Expand All @@ -76,11 +70,8 @@ class Create < Trailblazer::Operation
# self["representer.serializer.class"] = Representer
# self["representer.deserializer.class"] = Deserializer

include Model
model Song, :create

include Contract::Step
include Representer::Deserializer::JSON
extend Contract::DSL
contract do
property :title
property :length
Expand All @@ -91,20 +82,21 @@ class Create < Trailblazer::Operation
end
end

def process(params)
validate(params) do |f|
f.sync
self["model"].id = 9
end
end
step Model( Song, :new )
step Contract::Build()
step Contract::Validate( representer: self["representer.deserializer.class"] )
step Persist( method: :sync )
step ->(options) { options["model"].id = 9 }
end

let (:controller) { self }
let (:_data) { [] }
def head(*args); _data << [:head, *args] end

let(:handlers) { Trailblazer::Endpoint::Handlers::Rails.new(self, path: "/songs").() }

def render(options)
_data << options
end
# not authenticated, 401
it do
result = Create.( { id: 1 }, "user.current" => false )
Expand All @@ -117,20 +109,20 @@ def head(*args); _data << [:head, *args] end
# created
# length is ignored as it's not defined in the deserializer.
it do
result = Create.( '{"id": 9, "title": "Encores", "length": 999 }', "user.current" => ::Module )
result = Create.( {}, "user.current" => ::Module, "document" => '{"id": 9, "title": "Encores", "length": 999 }' )
# puts "@@@@@ #{result.inspect}"

Trailblazer::Endpoint.new.(result, handlers)
_data.inspect.must_equal '[[:head, 201, {:location=>"/songs/9"}]]'
end

class Update < Create
action :find_by
self.~ Model( :find_by )
end

# 404
it do
result = Update.( id: nil, song: '{"id": 9, "title": "Encores", "length": 999 }', "user.current" => ::Module )
result = Update.({ id: nil }, "user.current" => ::Module, "document" => '{"id": 9, "title": "Encores", "length": 999 }' )

Trailblazer::Endpoint.new.(result, handlers)
_data.inspect.must_equal '[[:head, 404]]'
Expand All @@ -140,10 +132,9 @@ class Update < Create
# validation failure 422
# success
it do
result = Create.('{ "title": "" }', "user.current" => ::Module)
# puts "@@@@@ #{result.inspect}"
result = Create.({}, "user.current" => ::Module, "document" => '{ "title": "" }')
Trailblazer::Endpoint.new.(result, handlers)
_data.inspect.must_equal '[[:head, 422, "{\"messages\":{\"title\":[\"can\'t be blank\"]}}"]]'
_data.inspect.must_equal '[{:json=>"{\\"messages\\":{\\"title\\":[\\"must be filled\\"]}}", :status=>422}]'
end


Expand All @@ -166,7 +157,7 @@ class Update < Create
it do
invoked = nil

endpoint(Update, { id: nil }) do |res|
endpoint( Update, { id: nil }, args: {"user.current" => ::Module} ) do |res|
res.invalid { invoked = "my invalid!" }
end

Expand Down
24 changes: 12 additions & 12 deletions test/rails-app/Gemfile.lock
@@ -1,19 +1,19 @@
PATH
remote: ../../../operation
specs:
trailblazer-operation (2.0.0)
trailblazer-operation (0.0.6)
declarative
pipetree (>= 0.0.2, < 0.1.0)
uber (>= 0.0.15)
pipetree (>= 0.0.4, < 0.1.0)
uber (>= 0.1.0, < 0.2.0)

PATH
remote: ../../../trailblazer
specs:
trailblazer (2.0.0)
trailblazer (2.0.0.beta1)
declarative
reform (>= 2.0.0, < 3.0.0)
reform (>= 2.2.0, < 3.0.0)
trailblazer-operation
uber (>= 0.0.15)
uber (>= 0.1.0, < 0.2.0)

PATH
remote: ../../.
Expand Down Expand Up @@ -89,7 +89,7 @@ GEM
nio4r (1.2.1)
nokogiri (1.6.8.1)
mini_portile2 (~> 2.1.0)
pipetree (0.0.3)
pipetree (0.0.4)
rack (2.0.1)
rack-test (0.6.3)
rack (>= 1.0)
Expand Down Expand Up @@ -117,13 +117,13 @@ GEM
rake (>= 0.8.7)
thor (>= 0.18.1, < 2.0)
rake (11.3.0)
reform (2.2.1)
reform (2.2.3)
disposable (>= 0.3.0, < 0.4.0)
representable (>= 2.4.0, < 3.1.0)
uber (~> 0.0.11)
representable (3.0.0)
uber (>= 0.0.15, < 0.2.0)
representable (3.0.2)
declarative (~> 0.0.5)
uber (~> 0.0.15)
uber (>= 0.0.15, < 0.2.0)
sprockets (3.7.0)
concurrent-ruby (~> 1.0)
rack (> 1, < 3)
Expand All @@ -136,7 +136,7 @@ GEM
thread_safe (0.3.5)
tzinfo (1.2.2)
thread_safe (~> 0.1)
uber (0.0.15)
uber (0.1.0)
websocket-driver (0.6.4)
websocket-extensions (>= 0.1.0)
websocket-extensions (0.1.2)
Expand Down
2 changes: 1 addition & 1 deletion test/test_helper.rb
@@ -1,3 +1,3 @@
require "minitest/autorun"
require "trailblazer/operation"
require "trailblazer"
require "trailblazer/endpoint"

0 comments on commit 9ec75c0

Please sign in to comment.