moon 0.0.1 → 0.0.2

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.
Files changed (67) hide show
  1. data/README.rdoc +2 -0
  2. data/Rakefile +10 -3
  3. data/lib/moon.rb +0 -2
  4. data/lib/moon/action.rb +4 -3
  5. data/lib/moon/action/inject_timestamps.rb +44 -0
  6. data/lib/moon/action/model.rb +1 -2
  7. data/lib/moon/action/model/destroy.rb +4 -26
  8. data/lib/moon/action/model/index.rb +10 -17
  9. data/lib/moon/action/model/show.rb +9 -23
  10. data/lib/moon/action/model/store.rb +20 -0
  11. data/lib/moon/action/models/finder.rb +14 -14
  12. data/lib/moon/action/models/initializer.rb +6 -5
  13. data/lib/moon/action/models/updater.rb +1 -4
  14. data/lib/moon/action/rebuild_arrays.rb +1 -4
  15. data/lib/moon/action/{reference_object.rb → reference.rb} +1 -1
  16. data/lib/moon/action/respond_blank.rb +9 -0
  17. data/lib/moon/action/transfer.rb +30 -0
  18. data/lib/moon/action/valid_models_required.rb +13 -6
  19. data/lib/moon/application.rb +12 -7
  20. data/lib/moon/application/configuration.rb +55 -0
  21. data/lib/moon/application/rack.rb +17 -7
  22. data/lib/moon/context.rb +1 -1
  23. data/lib/moon/formatter.rb +4 -13
  24. data/lib/moon/formatter/generic.rb +17 -4
  25. data/lib/moon/response/json.rb +1 -0
  26. data/lib/moon/response/json/blank.rb +9 -0
  27. data/lib/moon/response/json/collection.rb +2 -2
  28. data/lib/moon/response/json/model.rb +3 -3
  29. data/lib/moon/validator.rb +17 -45
  30. data/lib/moon/validator/format.rb +4 -23
  31. data/lib/moon/validator/length.rb +8 -33
  32. data/lib/moon/validator/presence.rb +4 -17
  33. data/spec/lib/moon/action/inject_timestamps_spec.rb +46 -0
  34. data/spec/lib/moon/action/model/destroy_spec.rb +6 -44
  35. data/spec/lib/moon/action/model/index_spec.rb +8 -25
  36. data/spec/lib/moon/action/model/show_spec.rb +33 -25
  37. data/spec/lib/moon/action/model/store_spec.rb +77 -0
  38. data/spec/lib/moon/action/models/finder_spec.rb +25 -11
  39. data/spec/lib/moon/action/models/initializer_spec.rb +7 -5
  40. data/spec/lib/moon/action/models/updater_spec.rb +5 -3
  41. data/spec/lib/moon/action/rebuild_arrays_spec.rb +3 -3
  42. data/spec/lib/moon/action/{reference_object_spec.rb → reference_spec.rb} +1 -1
  43. data/spec/lib/moon/action/respond_blank_spec.rb +24 -0
  44. data/spec/lib/moon/action/transfer_spec.rb +30 -0
  45. data/spec/lib/moon/action/valid_models_required_spec.rb +19 -17
  46. data/spec/lib/moon/application/configuration_spec.rb +75 -0
  47. data/spec/lib/moon/application/rack_spec.rb +6 -5
  48. data/spec/lib/moon/formatter/generic_spec.rb +13 -3
  49. data/spec/lib/moon/formatter_spec.rb +4 -10
  50. data/spec/lib/moon/response/json/blank_spec.rb +19 -0
  51. data/spec/lib/moon/response/json/collection_spec.rb +5 -4
  52. data/spec/lib/moon/response/json/model_spec.rb +5 -4
  53. data/spec/lib/moon/validator/format_spec.rb +8 -25
  54. data/spec/lib/moon/validator/length_spec.rb +10 -36
  55. data/spec/lib/moon/validator/presence_spec.rb +11 -28
  56. data/spec/lib/moon/validator_spec.rb +10 -59
  57. metadata +34 -28
  58. data/lib/moon/action/base.rb +0 -16
  59. data/lib/moon/action/model/create.rb +0 -45
  60. data/lib/moon/action/model/update.rb +0 -42
  61. data/lib/moon/application/routes.rb +0 -16
  62. data/lib/moon/formatter/base.rb +0 -15
  63. data/spec/lib/moon/action/base_spec.rb +0 -29
  64. data/spec/lib/moon/action/model/create_spec.rb +0 -111
  65. data/spec/lib/moon/action/model/update_spec.rb +0 -91
  66. data/spec/lib/moon/application/routes_spec.rb +0 -26
  67. data/spec/lib/moon/formatter/base_spec.rb +0 -30
@@ -1,16 +0,0 @@
1
-
2
- # Base class for all actions. It simply forces subclasses to implement a 'perform' method
3
- # and makes the context available.
4
- class Moon::Action::Base
5
-
6
- attr_reader :context
7
-
8
- def initialize(context)
9
- @context = context
10
- end
11
-
12
- def perform
13
- raise NotImplementedError, "method perform should be implemented in #{self.class}"
14
- end
15
-
16
- end
@@ -1,45 +0,0 @@
1
-
2
- # Generic model create action. Stores the initialized model to the configured storage.
3
- class Moon::Action::Model::Create
4
-
5
- def initialize(context)
6
- @context = context
7
- end
8
-
9
- def perform
10
- model = self.model
11
- if model
12
- GOM::Storage.store model, @context.storage_name
13
- Moon::Response::JSON::Model.new self.class.model_symbol, model
14
- else
15
- Moon::Response::JSON::Message.new 200, "No model initialized."
16
- end
17
- end
18
-
19
- def model
20
- @context.models[self.class.model_symbol]
21
- end
22
-
23
- def self.model_symbol
24
- Moon::Utility::String.underscore(model_class.to_s).split("/").last.to_sym
25
- end
26
-
27
- def self.model_class=(value)
28
- @model_class = value
29
- end
30
-
31
- def self.model_class
32
- @model_class
33
- end
34
-
35
- def self.perform(context)
36
- new(context).perform
37
- end
38
-
39
- def self.[](model_class)
40
- klass = self.dup
41
- klass.model_class = model_class
42
- klass
43
- end
44
-
45
- end
@@ -1,42 +0,0 @@
1
-
2
- # Generic model update action. Stores the specified model to the storage.
3
- class Moon::Action::Model::Update
4
-
5
- def initialize(context)
6
- @context = context
7
- end
8
-
9
- def perform
10
- model = self.model
11
- if model
12
- storage_name = GOM::Object.storage_name model
13
- GOM::Storage.store model, storage_name
14
- Moon::Response::JSON::Message.new 200, "#{@model_symbol} updated."
15
- else
16
- Moon::Response::JSON::Message.new 401, "#{@model_symbol} update failed."
17
- end
18
- end
19
-
20
- def model
21
- @context.models[self.class.model_symbol]
22
- end
23
-
24
- def self.model_symbol=(value)
25
- @model_symbol = value
26
- end
27
-
28
- def self.model_symbol
29
- @model_symbol
30
- end
31
-
32
- def self.perform(context)
33
- new(context).perform
34
- end
35
-
36
- def self.[](model_symbol)
37
- klass = self.dup
38
- klass.model_symbol = model_symbol
39
- klass
40
- end
41
-
42
- end
@@ -1,16 +0,0 @@
1
- require 'configure'
2
-
3
- # Handler for the application routes.
4
- class Moon::Application::Routes
5
-
6
- attr_reader :rack
7
-
8
- def initialize
9
- @rack = Moon::Application::Rack.new
10
- end
11
-
12
- def define(&block)
13
- @rack.routes = [ Configure.process(&block)[:route] ].flatten
14
- end
15
-
16
- end
@@ -1,15 +0,0 @@
1
-
2
- # Base class for a formatters.
3
- class Moon::Formatter::Base
4
-
5
- attr_accessor :model
6
-
7
- def initialize(model)
8
- @model = model
9
- end
10
-
11
- def hash
12
- raise NotImplementedError, "method :hash has not been implemented"
13
- end
14
-
15
- end
@@ -1,29 +0,0 @@
1
- require File.expand_path(File.join(File.dirname(__FILE__), "..", "..", "..", "spec_helper"))
2
-
3
- describe Moon::Action::Base do
4
-
5
- before :each do
6
- @context = mock Moon::Context
7
-
8
- @action = described_class.new @context
9
- end
10
-
11
- describe "context" do
12
-
13
- it "should return the context" do
14
- @action.context.should == @context
15
- end
16
-
17
- end
18
-
19
- describe "perform" do
20
-
21
- it "should raise a #{NotImplementedError}" do
22
- lambda do
23
- @action.perform
24
- end.should raise_error(NotImplementedError)
25
- end
26
-
27
- end
28
-
29
- end
@@ -1,111 +0,0 @@
1
- require File.expand_path(File.join(File.dirname(__FILE__), "..", "..", "..", "..", "spec_helper"))
2
-
3
- describe Moon::Action::Model::Create do
4
-
5
- before :each do
6
- @model_class = mock Class, :to_s => "Model"
7
- @model = mock Object, :class => @model_class
8
-
9
- @context = Moon::Context.new
10
- @context.storage_name = :dump
11
- @context.models[:model] = @model
12
-
13
- described_class.model_class = @model_class
14
- @action = described_class.new @context
15
- end
16
-
17
- describe "perform" do
18
-
19
- before :each do
20
- GOM::Storage.stub :store
21
- GOM::Object.stub :id => "test:object_1"
22
-
23
- @model_response = mock Moon::Response::JSON::Model
24
- Moon::Response::JSON::Model.stub :new => @model_response
25
-
26
- @message_response = mock Moon::Response::JSON::Message
27
- Moon::Response::JSON::Message.stub :new => @message_response
28
- end
29
-
30
- it "should store the model on the right storage" do
31
- GOM::Storage.should_receive(:store).with(@model, :dump)
32
- @action.perform
33
- end
34
-
35
- it "should initialize #{Moon::Response::JSON::Model}" do
36
- Moon::Response::JSON::Model.should_receive(:new).with(:model, @model).and_return(@model_response)
37
- @action.perform
38
- end
39
-
40
- it "should return the model response" do
41
- response = @action.perform
42
- response.should == @model_response
43
- end
44
-
45
- it "should do nothing if the model isn't initialized" do
46
- @context.models[:model] = nil
47
- GOM::Storage.should_not_receive(:store)
48
- @action.perform
49
- end
50
-
51
- it "should initialize the 'failed' message response if the model isn't initialized" do
52
- @context.models[:model] = nil
53
- Moon::Response::JSON::Message.should_receive(:new).with(200, "No model initialized.").and_return(@message_response)
54
- @action.perform
55
- end
56
-
57
- it "should return 'failed' message response if the model isn't initialized" do
58
- @context.models[:model] = nil
59
- response = @action.perform
60
- response.should == @message_response
61
- end
62
-
63
- end
64
-
65
- describe "model" do
66
-
67
- it "should return the model" do
68
- model = @action.model
69
- model.should == @model
70
- end
71
-
72
- end
73
-
74
- describe "self.model_symbol" do
75
-
76
- it "should return the model symbol" do
77
- model_symbol = described_class.model_symbol
78
- model_symbol.should == :model
79
- end
80
-
81
- end
82
-
83
- describe "self.model_class" do
84
-
85
- it "should return the model class" do
86
- model_class = described_class.model_class
87
- model_class.should == @model_class
88
- end
89
-
90
- end
91
-
92
- describe "self.[]" do
93
-
94
- it "should return a class" do
95
- result = described_class[Object]
96
- result.should be_instance_of(Class)
97
- end
98
-
99
- it "should return a different class" do
100
- result = described_class[Object]
101
- result.should_not == described_class
102
- end
103
-
104
- it "should return a class connected to the given model class" do
105
- result = described_class[Object]
106
- result.model_class.should == Object
107
- end
108
-
109
- end
110
-
111
- end
@@ -1,91 +0,0 @@
1
- require File.expand_path(File.join(File.dirname(__FILE__), "..", "..", "..", "..", "spec_helper"))
2
-
3
- describe Moon::Action::Model::Update do
4
-
5
- before :each do
6
- @model = mock Object
7
-
8
- @context = Moon::Context.new
9
- @context.storage_name = :dump
10
- @context.models[:model] = @model
11
-
12
- described_class.model_symbol = :model
13
- @action = described_class.new @context
14
- end
15
-
16
- describe "perform" do
17
-
18
- before :each do
19
- GOM::Storage.stub :store => nil
20
- GOM::Object.stub :storage_name => :test
21
- end
22
-
23
- it "should fetch the storage name of the model" do
24
- GOM::Object.should_receive(:storage_name).with(@model).and_return(:test)
25
- @action.perform
26
- end
27
-
28
- it "should store the model on the right storage" do
29
- GOM::Storage.should_receive(:store).with(@model, :test)
30
- @action.perform
31
- end
32
-
33
- it "should return 'ok' message response" do
34
- response = @action.perform
35
- response.should be_instance_of(Moon::Response::JSON::Message)
36
- response.status.should == 200
37
- end
38
-
39
- it "should do nothing if the model isn't initialized" do
40
- @context.models[:model] = nil
41
- GOM::Storage.should_not_receive(:store)
42
- @action.perform
43
- end
44
-
45
- it "should return 'failed' message response if model isn't initialized" do
46
- @context.models[:model] = nil
47
- response = @action.perform
48
- response.should be_instance_of(Moon::Response::JSON::Message)
49
- response.status.should == 401
50
- end
51
-
52
- end
53
-
54
- describe "model" do
55
-
56
- it "should return the model" do
57
- model = @action.model
58
- model.should == @model
59
- end
60
-
61
- end
62
-
63
- describe "self.model_symbol" do
64
-
65
- it "should return the model symbol" do
66
- model_symbol = described_class.model_symbol
67
- model_symbol.should == :model
68
- end
69
-
70
- end
71
-
72
- describe "self.[]" do
73
-
74
- it "should return a class" do
75
- result = described_class[:model]
76
- result.should be_instance_of(Class)
77
- end
78
-
79
- it "should return a different class" do
80
- result = described_class[:model]
81
- result.should_not == described_class
82
- end
83
-
84
- it "should return a class connected to the given model symbol" do
85
- result = described_class[:model]
86
- result.model_symbol.should == :model
87
- end
88
-
89
- end
90
-
91
- end
@@ -1,26 +0,0 @@
1
- require File.expand_path(File.join(File.dirname(__FILE__), "..", "..", "..", "spec_helper"))
2
-
3
- describe Moon::Application::Routes do
4
-
5
- before :each do
6
- @rack = mock Moon::Application::Rack
7
- Moon::Application::Rack.stub :new => @rack
8
-
9
- @routes = described_class.new
10
- end
11
-
12
- describe "#define" do
13
-
14
- it "should pass the routes to rack" do
15
- @rack.should_receive(:routes=).with([ { :http_method => :get, :path => "/test" } ])
16
- @routes.define do
17
- route {
18
- http_method :get
19
- path "/test"
20
- }
21
- end
22
- end
23
-
24
- end
25
-
26
- end
@@ -1,30 +0,0 @@
1
- require File.expand_path(File.join(File.dirname(__FILE__), "..", "..", "..", "spec_helper"))
2
-
3
- describe Moon::Formatter::Base do
4
-
5
- before :each do
6
- @model = mock Object
7
-
8
- @formatter = described_class.new @model
9
- end
10
-
11
- describe "model" do
12
-
13
- it "should return the model" do
14
- model = @formatter.model
15
- model.should == @model
16
- end
17
-
18
- end
19
-
20
- describe "hash" do
21
-
22
- it "should raise an #{NotImplementedError}" do
23
- lambda do
24
- @formatter.hash
25
- end.should raise_error(NotImplementedError)
26
- end
27
-
28
- end
29
-
30
- end