imperator-ext 0.2.0
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/.document +5 -0
- data/.rspec +1 -0
- data/Gemfile +16 -0
- data/Gemfile.lock +69 -0
- data/LICENSE.txt +20 -0
- data/README.md +339 -0
- data/Rakefile +49 -0
- data/VERSION +1 -0
- data/docs/Design.md +197 -0
- data/imperator-ext.gemspec +90 -0
- data/lib/imperator/command/class_factory.rb +121 -0
- data/lib/imperator/command/macros.rb +13 -0
- data/lib/imperator/command/method_factory.rb +17 -0
- data/lib/imperator/command/rest.rb +7 -0
- data/lib/imperator/command/rest_helper.rb +78 -0
- data/lib/imperator/command-ext.rb +14 -0
- data/lib/imperator/factory.rb +3 -0
- data/lib/imperator/mongoid/attribute_helper.rb +29 -0
- data/lib/imperator/mongoid/command/rest.rb +9 -0
- data/lib/imperator/mongoid/command.rb +21 -0
- data/lib/imperator/mongoid.rb +6 -0
- data/lib/imperator-ext.rb +5 -0
- data/spec/imperator-ext/command/class_factory_spec.rb +186 -0
- data/spec/imperator-ext/command/macros_spec.rb +32 -0
- data/spec/imperator-ext/command/method_factory_spec.rb +64 -0
- data/spec/imperator-ext/command/rest_helper_spec.rb +7 -0
- data/spec/imperator-ext/command/rest_spec.rb +8 -0
- data/spec/imperator-ext/mongoid/command_spec.rb +10 -0
- data/spec/imperator-ext/mongoid/rest_command_spec.rb +8 -0
- data/spec/imperator-ext/shared_ex/attribute_helper_ex.rb +54 -0
- data/spec/imperator-ext/shared_ex/command_ex.rb +0 -0
- data/spec/imperator-ext/shared_ex/rest_helper_ex.rb +15 -0
- data/spec/spec_helper.rb +11 -0
- metadata +195 -0
@@ -0,0 +1,90 @@
|
|
1
|
+
# Generated by jeweler
|
2
|
+
# DO NOT EDIT THIS FILE DIRECTLY
|
3
|
+
# Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
|
4
|
+
# -*- encoding: utf-8 -*-
|
5
|
+
|
6
|
+
Gem::Specification.new do |s|
|
7
|
+
s.name = "imperator-ext"
|
8
|
+
s.version = "0.2.0"
|
9
|
+
|
10
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
|
+
s.authors = ["Kristian Mandrup"]
|
12
|
+
s.date = "2012-08-14"
|
13
|
+
s.description = "Factories, Macros, REST helpers and Mongoid integration"
|
14
|
+
s.email = "kmandrup@gmail.com"
|
15
|
+
s.extra_rdoc_files = [
|
16
|
+
"LICENSE.txt",
|
17
|
+
"README.md"
|
18
|
+
]
|
19
|
+
s.files = [
|
20
|
+
".document",
|
21
|
+
".rspec",
|
22
|
+
"Gemfile",
|
23
|
+
"Gemfile.lock",
|
24
|
+
"LICENSE.txt",
|
25
|
+
"README.md",
|
26
|
+
"Rakefile",
|
27
|
+
"VERSION",
|
28
|
+
"docs/Design.md",
|
29
|
+
"imperator-ext.gemspec",
|
30
|
+
"lib/imperator-ext.rb",
|
31
|
+
"lib/imperator/command-ext.rb",
|
32
|
+
"lib/imperator/command/class_factory.rb",
|
33
|
+
"lib/imperator/command/macros.rb",
|
34
|
+
"lib/imperator/command/method_factory.rb",
|
35
|
+
"lib/imperator/command/rest.rb",
|
36
|
+
"lib/imperator/command/rest_helper.rb",
|
37
|
+
"lib/imperator/factory.rb",
|
38
|
+
"lib/imperator/mongoid.rb",
|
39
|
+
"lib/imperator/mongoid/attribute_helper.rb",
|
40
|
+
"lib/imperator/mongoid/command.rb",
|
41
|
+
"lib/imperator/mongoid/command/rest.rb",
|
42
|
+
"spec/imperator-ext/command/class_factory_spec.rb",
|
43
|
+
"spec/imperator-ext/command/macros_spec.rb",
|
44
|
+
"spec/imperator-ext/command/method_factory_spec.rb",
|
45
|
+
"spec/imperator-ext/command/rest_helper_spec.rb",
|
46
|
+
"spec/imperator-ext/command/rest_spec.rb",
|
47
|
+
"spec/imperator-ext/mongoid/command_spec.rb",
|
48
|
+
"spec/imperator-ext/mongoid/rest_command_spec.rb",
|
49
|
+
"spec/imperator-ext/shared_ex/attribute_helper_ex.rb",
|
50
|
+
"spec/imperator-ext/shared_ex/command_ex.rb",
|
51
|
+
"spec/imperator-ext/shared_ex/rest_helper_ex.rb",
|
52
|
+
"spec/spec_helper.rb"
|
53
|
+
]
|
54
|
+
s.homepage = "http://github.com/kristianmandrup/imperator-ext"
|
55
|
+
s.licenses = ["MIT"]
|
56
|
+
s.require_paths = ["lib"]
|
57
|
+
s.rubygems_version = "1.8.24"
|
58
|
+
s.summary = "Various extensions for Imperator"
|
59
|
+
|
60
|
+
if s.respond_to? :specification_version then
|
61
|
+
s.specification_version = 3
|
62
|
+
|
63
|
+
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
64
|
+
s.add_runtime_dependency(%q<virtus>, [">= 0"])
|
65
|
+
s.add_runtime_dependency(%q<imperator>, [">= 0"])
|
66
|
+
s.add_development_dependency(%q<rspec>, [">= 2.8.0"])
|
67
|
+
s.add_development_dependency(%q<rdoc>, [">= 3.12"])
|
68
|
+
s.add_development_dependency(%q<bundler>, [">= 1.0.0"])
|
69
|
+
s.add_development_dependency(%q<jeweler>, ["~> 1.8.4"])
|
70
|
+
s.add_development_dependency(%q<simplecov>, [">= 0.5"])
|
71
|
+
else
|
72
|
+
s.add_dependency(%q<virtus>, [">= 0"])
|
73
|
+
s.add_dependency(%q<imperator>, [">= 0"])
|
74
|
+
s.add_dependency(%q<rspec>, [">= 2.8.0"])
|
75
|
+
s.add_dependency(%q<rdoc>, [">= 3.12"])
|
76
|
+
s.add_dependency(%q<bundler>, [">= 1.0.0"])
|
77
|
+
s.add_dependency(%q<jeweler>, ["~> 1.8.4"])
|
78
|
+
s.add_dependency(%q<simplecov>, [">= 0.5"])
|
79
|
+
end
|
80
|
+
else
|
81
|
+
s.add_dependency(%q<virtus>, [">= 0"])
|
82
|
+
s.add_dependency(%q<imperator>, [">= 0"])
|
83
|
+
s.add_dependency(%q<rspec>, [">= 2.8.0"])
|
84
|
+
s.add_dependency(%q<rdoc>, [">= 3.12"])
|
85
|
+
s.add_dependency(%q<bundler>, [">= 1.0.0"])
|
86
|
+
s.add_dependency(%q<jeweler>, ["~> 1.8.4"])
|
87
|
+
s.add_dependency(%q<simplecov>, [">= 0.5"])
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
@@ -0,0 +1,121 @@
|
|
1
|
+
require 'imperator/command/rest_helper'
|
2
|
+
require 'imperator/command/rest'
|
3
|
+
|
4
|
+
class Imperator::Command
|
5
|
+
# http://johnragan.wordpress.com/2010/02/18/ruby-metaprogramming-dynamically-defining-classes-and-methods/
|
6
|
+
class ClassFactory
|
7
|
+
class << self
|
8
|
+
def use &block
|
9
|
+
yield self
|
10
|
+
end
|
11
|
+
|
12
|
+
def default_parent clazz
|
13
|
+
@default_parent ||= clazz
|
14
|
+
end
|
15
|
+
|
16
|
+
def get_default_parent
|
17
|
+
@default_parent ||= ::Imperator::Command
|
18
|
+
end
|
19
|
+
|
20
|
+
# Usage:
|
21
|
+
# Imperator::Command::ClassFactory.create :update, Post, parent: Imperator::Mongoid::Command do
|
22
|
+
# ..
|
23
|
+
# end
|
24
|
+
def build_command action, model, options = {}, &block
|
25
|
+
clazz_name = "#{action.to_s.camelize}#{model.to_s.camelize}Command"
|
26
|
+
parent = options[:parent] || get_default_parent
|
27
|
+
clazz = parent ? Class.new(parent) : Class.new
|
28
|
+
Object.const_set clazz_name, clazz
|
29
|
+
clazz = self.const_get(clazz_name)
|
30
|
+
if options[:auto_attributes]
|
31
|
+
clazz.instance_eval do
|
32
|
+
if respond_to? :attributes_for
|
33
|
+
attributes_for(model, :except => options[:except], :only => options[:only])
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
if block_given?
|
38
|
+
clazz.instance_eval &block
|
39
|
+
end
|
40
|
+
clazz
|
41
|
+
end
|
42
|
+
|
43
|
+
# Usage:
|
44
|
+
# Imperator::Command::ClassFactory.create_rest :all, Post, parent: Imperator::Mongoid::Command do
|
45
|
+
# ..
|
46
|
+
# end
|
47
|
+
def rest_command action, model, options = {}, &block
|
48
|
+
options.reverse_merge! default_options
|
49
|
+
options[:parent] ||= get_default_rest_class(model)
|
50
|
+
rest_commands_for(model, options, &block) and return if action.to_sym == :all
|
51
|
+
if rest_actions.include? action.to_sym
|
52
|
+
action_name = "#{action}_command_for"
|
53
|
+
send action_name, model, options, &block
|
54
|
+
else
|
55
|
+
raise ArgumentError, "Not a supported REST action. Must be one of #{rest_actions}, was #{action}"
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
attr_writer :default_rest_class
|
60
|
+
|
61
|
+
def get_default_rest_class model
|
62
|
+
model.ancestors.include?(Mongoid::Document) ? default_mongoid_rest_class : default_rest_class
|
63
|
+
end
|
64
|
+
|
65
|
+
def default_rest_class
|
66
|
+
@default_rest_class ||= Imperator::Command::Rest
|
67
|
+
end
|
68
|
+
|
69
|
+
def default_mongoid_rest_class
|
70
|
+
@default_mongoid_rest_class ||= Imperator::Mongoid::Command::Rest
|
71
|
+
end
|
72
|
+
|
73
|
+
def reset_rest_class
|
74
|
+
@default_rest_class = Imperator::Command::Rest
|
75
|
+
end
|
76
|
+
|
77
|
+
attr_writer :default_options
|
78
|
+
|
79
|
+
def default_options
|
80
|
+
@default_options ||= {}
|
81
|
+
end
|
82
|
+
|
83
|
+
|
84
|
+
protected
|
85
|
+
|
86
|
+
def rest_actions
|
87
|
+
[:create, :update, :delete]
|
88
|
+
end
|
89
|
+
|
90
|
+
def create_command_for model, options = {}, &block
|
91
|
+
options[:parent] ||= default_rest_class
|
92
|
+
c = build_command :create, model, options do
|
93
|
+
create_action
|
94
|
+
end
|
95
|
+
c.class_eval &block if block_given?
|
96
|
+
end
|
97
|
+
|
98
|
+
def update_command_for model, options = {}, &block
|
99
|
+
options[:parent] ||= default_rest_class
|
100
|
+
c = build_command :update, model, options do
|
101
|
+
update_action
|
102
|
+
end
|
103
|
+
c.class_eval &block if block_given?
|
104
|
+
end
|
105
|
+
|
106
|
+
def delete_command_for model, options = {}, &block
|
107
|
+
options[:parent] ||= default_rest_class
|
108
|
+
c = build_command :delete, model, options do
|
109
|
+
delete_action
|
110
|
+
end
|
111
|
+
c.class_eval &block if block_given?
|
112
|
+
end
|
113
|
+
|
114
|
+
def rest_commands_for model, options = {}, &block
|
115
|
+
rest_actions.each do |action|
|
116
|
+
send "#{action}_command_for", model, options, &block
|
117
|
+
end
|
118
|
+
end
|
119
|
+
end
|
120
|
+
end
|
121
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
# Global macro methods
|
2
|
+
|
3
|
+
def imperator_class_factory
|
4
|
+
Imperator::Command::ClassFactory
|
5
|
+
end
|
6
|
+
|
7
|
+
def build_command action, model, options = {}, &block
|
8
|
+
imperator_class_factory.build_command action, model, options = {}, &block
|
9
|
+
end
|
10
|
+
|
11
|
+
def build_rest_command action, model, options = {}, &block
|
12
|
+
imperator_class_factory.rest_command action, model, options = {}, &block
|
13
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
class Imperator::Command
|
2
|
+
module MethodFactory
|
3
|
+
def command_method command, options = {}
|
4
|
+
namespace = (options[:ns] || '').to_s
|
5
|
+
namespace.sub! /Controller$/, ''
|
6
|
+
define_method "#{command}_command" do
|
7
|
+
instance_var = "@#{command}_command"
|
8
|
+
unless instance_variable_get(instance_var)
|
9
|
+
clazz = [namespace, "#{command.to_s.camelize}Command"].join('::').constantize
|
10
|
+
instance_variable_set instance_var, clazz.new(options.merge initiator: self)
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
extend self
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,78 @@
|
|
1
|
+
class Imperator::ResourceNotFoundError < StandardError; end
|
2
|
+
|
3
|
+
class Imperator::Command
|
4
|
+
module RestHelper
|
5
|
+
extend ActiveSupport::Concern
|
6
|
+
|
7
|
+
included do
|
8
|
+
attr_writer :object_class
|
9
|
+
end
|
10
|
+
|
11
|
+
module ClassMethods
|
12
|
+
def create_action &block
|
13
|
+
action do
|
14
|
+
object_class.create attribute_set if object_class
|
15
|
+
instance_eval &block if block_given?
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
def update_action &block
|
20
|
+
action do
|
21
|
+
begin
|
22
|
+
find_object.update_attributes attribute_set if find_object
|
23
|
+
instance_eval &block if block_given?
|
24
|
+
rescue Imperator::ResourceNotFoundError => e
|
25
|
+
on_error e
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
def delete_action &block
|
31
|
+
action do
|
32
|
+
find_object.delete
|
33
|
+
instance_eval &block if block_given?
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
def on_error &block
|
38
|
+
define_method(:on_error, &block)
|
39
|
+
end
|
40
|
+
|
41
|
+
def for_class clazz
|
42
|
+
@object_class = clazz
|
43
|
+
end
|
44
|
+
|
45
|
+
def object_class
|
46
|
+
@object_class ||= filtered_class_name
|
47
|
+
end
|
48
|
+
|
49
|
+
protected
|
50
|
+
|
51
|
+
# convert to underscore format, fx UpdatePostCommand becomes update_post_command
|
52
|
+
# remove 'create', 'update' or 'delete' in the front of name: _post_command
|
53
|
+
# then remove command at the back: _post_
|
54
|
+
# then remove any '_': post
|
55
|
+
def filtered_class_name
|
56
|
+
self.class.name.underscore.sub(/^(create|update|delete)/, '').sub(/command$/, '').sub(/_/, '')
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
def object_class
|
61
|
+
self.class.object_class
|
62
|
+
end
|
63
|
+
|
64
|
+
def on_error exception
|
65
|
+
raise Imperator::InvalidCommandError, "The Command #{self} caused an error: #{exception}"
|
66
|
+
end
|
67
|
+
|
68
|
+
def find_object
|
69
|
+
object ||= object_class.find(self.id)
|
70
|
+
rescue
|
71
|
+
find_object_error
|
72
|
+
end
|
73
|
+
|
74
|
+
def find_object_error
|
75
|
+
raise Imperator::ResourceNotFoundError, "The resource #{self.id} could not be found"
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
class Imperator::Command
|
2
|
+
# the main object this command works on
|
3
|
+
attribute :object, Object
|
4
|
+
|
5
|
+
# object that initiated the command.
|
6
|
+
# Can be used for method delegation etc
|
7
|
+
attribute :initiator, Object
|
8
|
+
|
9
|
+
def to_s
|
10
|
+
str = "Command: #{id}"
|
11
|
+
str << " - #{object}" if object
|
12
|
+
str
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
module Imperator
|
2
|
+
module Mongoid
|
3
|
+
module AttributeHelper
|
4
|
+
extend ActiveSupport::Concern
|
5
|
+
|
6
|
+
module ClassMethods
|
7
|
+
def attributes_for clazz, options = {}
|
8
|
+
use_attributes = clazz.attribute_names
|
9
|
+
|
10
|
+
unless options[:except].blank?
|
11
|
+
use_attributes = use_attributes - [options[:except]].flatten.map(&:to_s)
|
12
|
+
end
|
13
|
+
unless options[:only].blank?
|
14
|
+
use_attributes = use_attributes & [options[:only]].flatten.map(&:to_s) # intersection
|
15
|
+
end
|
16
|
+
|
17
|
+
clazz.fields.each do |key, field|
|
18
|
+
name = key
|
19
|
+
type = field.type
|
20
|
+
# skip if this field is excluded for use in command
|
21
|
+
next unless use_attributes.include? name.to_s
|
22
|
+
|
23
|
+
attribute field.name, field.type, :default => field.default_val
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
require 'imperator/mongoid/attribute_helper'
|
2
|
+
|
3
|
+
# Usage
|
4
|
+
|
5
|
+
# class UpdatePostCommand < Imperator::Mongoid::Command
|
6
|
+
# attributes_for Post, except: [:state]
|
7
|
+
# attributes :title, :author
|
8
|
+
|
9
|
+
# validates_presence_of :object
|
10
|
+
|
11
|
+
# action do
|
12
|
+
# object = SomeObject.find(id)
|
13
|
+
# object.authored_by(author)
|
14
|
+
# end
|
15
|
+
# end
|
16
|
+
|
17
|
+
module Imperator::Mongoid
|
18
|
+
class Command < Imperator::Command
|
19
|
+
include Imperator::Mongoid::AttributeHelper
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,186 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
class UpdateRestCommand < Imperator::Command::Rest
|
4
|
+
end
|
5
|
+
class CreateRestCommand < Imperator::Command::Rest
|
6
|
+
end
|
7
|
+
class DeleteRestCommand < Imperator::Command::Rest
|
8
|
+
end
|
9
|
+
|
10
|
+
class Post
|
11
|
+
end
|
12
|
+
|
13
|
+
class Article
|
14
|
+
end
|
15
|
+
|
16
|
+
class Account
|
17
|
+
end
|
18
|
+
|
19
|
+
class User
|
20
|
+
end
|
21
|
+
|
22
|
+
class Foo
|
23
|
+
end
|
24
|
+
|
25
|
+
class Payment
|
26
|
+
end
|
27
|
+
|
28
|
+
describe Imperator::Command::ClassFactory do
|
29
|
+
subject { Imperator::Command::ClassFactory }
|
30
|
+
|
31
|
+
describe '.rest_command' do
|
32
|
+
context 'update' do
|
33
|
+
before :all do
|
34
|
+
subject.default_rest_class = Imperator::Command::Rest
|
35
|
+
subject.rest_command :update, Article, :parent => UpdateRestCommand, :auto_attributes => true do
|
36
|
+
def hello
|
37
|
+
"hello"
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
context 'UpdateArticleCommand created' do
|
43
|
+
let(:command) { UpdateArticleCommand.new }
|
44
|
+
|
45
|
+
specify { UpdateArticleCommand.superclass.should == UpdateRestCommand }
|
46
|
+
specify { command.hello.should == "hello" }
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
context 'create' do
|
51
|
+
before :all do
|
52
|
+
subject.default_rest_class = Imperator::Command::Rest
|
53
|
+
subject.rest_command :create, Article, :parent => CreateRestCommand, :auto_attributes => true do
|
54
|
+
def hello
|
55
|
+
"hello"
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
context 'CreateArticleCommand created' do
|
61
|
+
let(:command) { CreateArticleCommand.new }
|
62
|
+
|
63
|
+
specify { CreateArticleCommand.superclass.should == CreateRestCommand }
|
64
|
+
specify { command.hello.should == "hello" }
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
context 'delete' do
|
69
|
+
before :all do
|
70
|
+
subject.default_rest_class = Imperator::Command::Rest
|
71
|
+
subject.rest_command :delete, Article, :parent => DeleteRestCommand, :auto_attributes => true do
|
72
|
+
def hello
|
73
|
+
"hello"
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
context 'DeleteArticleCommand created' do
|
79
|
+
let(:command) { DeleteArticleCommand.new }
|
80
|
+
|
81
|
+
specify { DeleteArticleCommand.superclass.should == DeleteRestCommand }
|
82
|
+
specify { command.hello.should == "hello" }
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
describe Imperator::Command::ClassFactory do
|
89
|
+
|
90
|
+
subject { Imperator::Command::ClassFactory }
|
91
|
+
|
92
|
+
describe '.build_command' do
|
93
|
+
before :all do
|
94
|
+
subject.build_command :show, Post
|
95
|
+
end
|
96
|
+
|
97
|
+
its(:get_default_parent) { should == Imperator::Command }
|
98
|
+
specify { ShowPostCommand.superclass.should == Imperator::Command }
|
99
|
+
end
|
100
|
+
|
101
|
+
describe '.rest_command' do
|
102
|
+
before :all do
|
103
|
+
subject.rest_command :update, Payment
|
104
|
+
end
|
105
|
+
|
106
|
+
specify { UpdatePaymentCommand.superclass.should == Imperator::Command::Rest }
|
107
|
+
|
108
|
+
describe ':all' do
|
109
|
+
before :all do
|
110
|
+
subject.rest_command :all, Foo
|
111
|
+
end
|
112
|
+
|
113
|
+
specify { CreateFooCommand.superclass.should == Imperator::Command::Rest }
|
114
|
+
specify { UpdateFooCommand.superclass.should == Imperator::Command::Rest }
|
115
|
+
specify { DeleteFooCommand.superclass.should == Imperator::Command::Rest }
|
116
|
+
end
|
117
|
+
end
|
118
|
+
|
119
|
+
describe '.default_rest_class' do
|
120
|
+
describe 'default class' do
|
121
|
+
its(:default_rest_class) { should == Imperator::Command::Rest }
|
122
|
+
end
|
123
|
+
|
124
|
+
describe 'set default_rest_class to UpdateRestCommand' do
|
125
|
+
before :all do
|
126
|
+
subject.default_rest_class = UpdateRestCommand
|
127
|
+
end
|
128
|
+
|
129
|
+
its(:default_rest_class) { should == UpdateRestCommand }
|
130
|
+
end
|
131
|
+
end
|
132
|
+
|
133
|
+
describe '.default_options' do
|
134
|
+
before do
|
135
|
+
subject.default_options = {hi: 'hello' }
|
136
|
+
end
|
137
|
+
|
138
|
+
its(:default_options) { should == {hi: 'hello' } }
|
139
|
+
end
|
140
|
+
end
|
141
|
+
|
142
|
+
describe 'private methods' do
|
143
|
+
describe Imperator::Command::ClassFactory do
|
144
|
+
subject { Imperator::Command::ClassFactory }
|
145
|
+
|
146
|
+
describe 'rest command builders' do
|
147
|
+
describe '.create_command_for' do
|
148
|
+
before do
|
149
|
+
subject.reset_rest_class
|
150
|
+
subject.send :create_command_for, Post
|
151
|
+
end
|
152
|
+
|
153
|
+
specify { CreatePostCommand.superclass.should == Imperator::Command::Rest }
|
154
|
+
end
|
155
|
+
|
156
|
+
describe '.update_command_for' do
|
157
|
+
before do
|
158
|
+
subject.default_rest_class = UpdateRestCommand
|
159
|
+
subject.send :update_command_for, Account
|
160
|
+
end
|
161
|
+
|
162
|
+
specify { UpdateAccountCommand.superclass.should == UpdateRestCommand }
|
163
|
+
end
|
164
|
+
|
165
|
+
describe '.delete_command_for' do
|
166
|
+
before do
|
167
|
+
subject.reset_rest_class
|
168
|
+
subject.send :delete_command_for, Account
|
169
|
+
end
|
170
|
+
|
171
|
+
specify { DeleteAccountCommand.superclass.should == Imperator::Command::Rest }
|
172
|
+
end
|
173
|
+
|
174
|
+
describe '.rest_commands_for' do
|
175
|
+
before :all do
|
176
|
+
subject.send :rest_commands_for, User
|
177
|
+
end
|
178
|
+
|
179
|
+
specify { CreateUserCommand.superclass.should == Imperator::Command::Rest }
|
180
|
+
specify { UpdateUserCommand.superclass.should == Imperator::Command::Rest }
|
181
|
+
specify { DeleteUserCommand.superclass.should == Imperator::Command::Rest }
|
182
|
+
end
|
183
|
+
end
|
184
|
+
end
|
185
|
+
end
|
186
|
+
|
@@ -0,0 +1,32 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'imperator/command/macros'
|
3
|
+
|
4
|
+
class Message
|
5
|
+
end
|
6
|
+
|
7
|
+
|
8
|
+
describe 'Imperator command macros' do
|
9
|
+
describe '.imperator_class_factory' do
|
10
|
+
specify { imperator_class_factory.should == Imperator::Command::ClassFactory }
|
11
|
+
end
|
12
|
+
|
13
|
+
describe '.build_command' do
|
14
|
+
before do
|
15
|
+
build_command :update, Message
|
16
|
+
end
|
17
|
+
|
18
|
+
specify do
|
19
|
+
UpdateMessageCommand.superclass.should == Imperator::Command
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
describe '.build_rest_command' do
|
24
|
+
before do
|
25
|
+
build_rest_command :delete, Message
|
26
|
+
end
|
27
|
+
|
28
|
+
specify do
|
29
|
+
DeleteMessageCommand.superclass.should == Imperator::Command::Rest
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|