yodatra 0.1.5 → 0.1.6

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/Gemfile CHANGED
@@ -5,7 +5,6 @@ group :test do
5
5
  gem 'rspec', :require => false
6
6
  gem 'simplecov', :require => false
7
7
  gem 'coveralls', :require => false
8
- gem 'mocha', :require => false
9
8
  end
10
9
 
11
10
  gemspec
@@ -15,6 +15,8 @@ module Yodatra
15
15
 
16
16
  status, headers, response = @block.yield(status, headers, response) unless @block.nil?
17
17
 
18
+ headers['Content-Length'] = response.first.length.to_s unless response.nil? || response.first.nil?
19
+
18
20
  [status, headers, response]
19
21
  end
20
22
 
data/lib/yodatra/base.rb CHANGED
@@ -3,6 +3,7 @@ require 'sinatra/reloader'
3
3
 
4
4
  require File.expand_path '../boot', __FILE__
5
5
  require File.expand_path '../initializers', __FILE__
6
+ require File.expand_path '../utils', __FILE__
6
7
 
7
8
 
8
9
  module Yodatra
@@ -1,5 +1,5 @@
1
1
  module Yodatra
2
- class ModelController < Sinatra::Base
2
+ class ModelsController < Sinatra::Base
3
3
 
4
4
  before do
5
5
  content_type 'application/json'
@@ -8,7 +8,7 @@ module Yodatra
8
8
  READ_ALL = :read_all
9
9
  get "/*s" do
10
10
  no_route if disabled? READ_ALL
11
- model_name.constantize.all.to_json
11
+ model_name.constantize.all.as_json(read_scope).to_json
12
12
  end
13
13
 
14
14
  READ_ONE = :read
@@ -16,17 +16,17 @@ module Yodatra
16
16
  no_route if disabled? READ_ONE
17
17
 
18
18
  @one = model_name.constantize.find params[:id]
19
- @one.to_json
19
+ @one.as_json(read_scope).to_json
20
20
  end
21
21
 
22
22
  CREATE_ONE = :create
23
23
  post "/*s" do
24
24
  no_route if disabled? CREATE_ONE
25
25
 
26
- @one = model_name.constantize.new params
26
+ @one = model_name.constantize.new self.send("#{model_name.underscore}_params".to_sym)
27
27
 
28
28
  if @one.save
29
- @one.to_json
29
+ @one.as_json(read_scope).to_json
30
30
  else
31
31
  status 400
32
32
  @one.errors.full_messages.to_json
@@ -40,7 +40,7 @@ module Yodatra
40
40
  @one = model_name.constantize.find params[:id]
41
41
 
42
42
  if !@one.nil? && @one.update_attributes(params)
43
- @one.to_json
43
+ @one.as_json(read_scope).to_json
44
44
  else
45
45
  status 400
46
46
  if !@one.nil?
@@ -58,25 +58,41 @@ module Yodatra
58
58
  @one = model_name.constantize.find params[:id]
59
59
 
60
60
  if @one.destroy
61
- @one.to_json
61
+ @one.as_json(read_scope).to_json
62
62
  else
63
63
  status 400
64
64
  @one.errors.full_messages.to_json
65
65
  end
66
66
  end
67
67
 
68
+ class << self
69
+ def model_name
70
+ self.name.split('::').last.gsub(/sController/, '')
71
+ end
72
+
73
+ def route_name
74
+ self.model_name.underscore
75
+ end
76
+ end
77
+
68
78
  private
69
79
 
70
- def model_params
80
+ # read_scope defaults to all attrs of the model
81
+ def read_scope
82
+ {}
83
+ end
84
+
85
+ # create/update scope defaults to all data given in the POST/PUT
86
+ define_method "#{model_name.underscore}_params".to_sym do
71
87
  params
72
88
  end
73
89
 
74
90
  def model_name
75
- self.class.name.split('::').last.gsub(/sController/, '')
91
+ self.class.model_name
76
92
  end
77
93
 
78
94
  def route_name
79
- self.send(:model_name).underscore
95
+ self.class.route_name
80
96
  end
81
97
 
82
98
  def disabled? key
@@ -0,0 +1,16 @@
1
+ module Yodatra
2
+ class Utils
3
+ end
4
+ end
5
+
6
+ class String
7
+ def underscore
8
+ word = self.dup
9
+ word.gsub!(/::/, '/')
10
+ word.gsub!(/([A-Z]+)([A-Z][a-z])/,'\1_\2')
11
+ word.gsub!(/([a-z\d])([A-Z])/,'\1_\2')
12
+ word.tr!("-", "_")
13
+ word.downcase!
14
+ word
15
+ end
16
+ end
@@ -1,3 +1,3 @@
1
1
  module Yodatra
2
- VERSION = '0.1.5'
2
+ VERSION = '0.1.6'
3
3
  end
data/spec/spec_helper.rb CHANGED
@@ -7,14 +7,14 @@ require 'rack/test'
7
7
  require 'rspec'
8
8
 
9
9
  require File.expand_path '../../lib/yodatra.rb', __FILE__
10
- require File.expand_path '../../lib/yodatra/model_controller.rb', __FILE__
10
+ require File.expand_path '../../lib/yodatra/models_controller.rb', __FILE__
11
11
 
12
12
  module RSpecMixin
13
13
  include Rack::Test::Methods
14
14
  def app
15
15
  Sinatra.new {
16
16
  use Yodatra::Base
17
- use Yodatra::ModelController
17
+ use Yodatra::ModelsController
18
18
  }
19
19
  end
20
20
  end
@@ -1,13 +1,11 @@
1
1
  require File.expand_path '../../spec_helper.rb', __FILE__
2
- require 'mocha/setup'
3
- require 'mocha/api'
4
2
 
5
3
  # Mock model constructed for the tests
6
- class TestModel
4
+ class Model
7
5
  ALL = %w(a b c)
8
6
  class << self
9
- def all; ALL.map{ |e| TestModel.new({:data=> e }) }; end
10
- def find(id); TestModel.new({:data => ALL[id.to_i]}); end
7
+ def all; ALL.map{ |e| Model.new({:data=> e }) }; end
8
+ def find(id); Model.new({:data => ALL[id.to_i]}); end
11
9
  end
12
10
  def initialize(param); @data = param[:data]; end
13
11
  def save
@@ -30,30 +28,29 @@ class TestModel
30
28
  end
31
29
 
32
30
  describe 'Model controller' do
31
+
33
32
  before do
34
- @any_model = 'TestModel'
35
33
  @errors = ['error']
36
- Yodatra::ModelController.any_instance.stubs(:model_name).returns(@any_model)
37
- Array.any_instance.stubs(:full_messages).returns(@errors)
34
+ allow_any_instance_of(Array).to receive(:full_messages).and_return(@errors)
38
35
  end
39
36
 
40
37
  describe 'Getting a collection of the Model' do
41
38
  context 'default' do
42
39
  it 'should have a GET all route' do
43
- get '/test_models'
40
+ get '/models'
44
41
 
45
42
  last_response.should be_ok
46
- expect(last_response.body).to eq(TestModel::ALL.map{|e| {:data => e} }.to_json)
43
+ expect(last_response.body).to eq(Model::ALL.map{|e| {:data => e} }.to_json)
47
44
  end
48
45
  end
49
46
  context 'forced GET all route disabled' do
50
47
  before do
51
- class Yodatra::ModelController
48
+ class Yodatra::ModelsController
52
49
  disable :read_all
53
50
  end
54
51
  end
55
52
  it 'should fail with no route available' do
56
- get '/test_models'
53
+ get '/models'
57
54
 
58
55
  last_response.should_not be_ok
59
56
  end
@@ -61,19 +58,19 @@ describe 'Model controller' do
61
58
  end
62
59
  describe 'getting an specific Model instance' do
63
60
  it 'should have a GET one route' do
64
- get '/test_models/2'
61
+ get '/models/2'
65
62
 
66
63
  last_response.should be_ok
67
64
  expect(last_response.body).to eq({ :data => 'c'}.to_json)
68
65
  end
69
66
  context 'forced GET one route disabled' do
70
67
  before do
71
- class Yodatra::ModelController
68
+ class Yodatra::ModelsController
72
69
  disable :read
73
70
  end
74
71
  end
75
72
  it 'should fail with no route available' do
76
- get '/test_models/1'
73
+ get '/models/1'
77
74
 
78
75
  last_response.should_not be_ok
79
76
  end
@@ -83,8 +80,8 @@ describe 'Model controller' do
83
80
  context 'with correct model params' do
84
81
  it 'adds creates an instance, saves it and succeed' do
85
82
  expect{
86
- post '/test_models', {:data => 'd'}
87
- }.to change(TestModel::ALL, :length).by(1)
83
+ post '/models', {:data => 'd'}
84
+ }.to change(Model::ALL, :length).by(1)
88
85
 
89
86
  last_response.should be_ok
90
87
  end
@@ -92,8 +89,8 @@ describe 'Model controller' do
92
89
  context 'with incorrect params' do
93
90
  it 'doesn t create an instance and fails' do
94
91
  expect{
95
- post '/test_models', {}
96
- }.to change(TestModel::ALL, :length).by(0)
92
+ post '/models', {}
93
+ }.to change(Model::ALL, :length).by(0)
97
94
 
98
95
  last_response.should_not be_ok
99
96
  expect(last_response.body).to eq(@errors.to_json)
@@ -101,12 +98,12 @@ describe 'Model controller' do
101
98
  end
102
99
  context 'when the creation route is disabled' do
103
100
  before do
104
- class Yodatra::ModelController
101
+ class Yodatra::ModelsController
105
102
  disable :create
106
103
  end
107
104
  end
108
105
  it 'should fail with no route available' do
109
- post '/test_models', {:data => 'd'}
106
+ post '/models', {:data => 'd'}
110
107
 
111
108
  last_response.should_not be_ok
112
109
  end
@@ -116,8 +113,8 @@ describe 'Model controller' do
116
113
  context 'targeting an existing instance' do
117
114
  it 'deletes the instance and succeed' do
118
115
  expect{
119
- delete '/test_models/1'
120
- }.to change(TestModel::ALL, :length).by(-1)
116
+ delete '/models/1'
117
+ }.to change(Model::ALL, :length).by(-1)
121
118
 
122
119
  last_response.should be_ok
123
120
  end
@@ -125,20 +122,20 @@ describe 'Model controller' do
125
122
  context 'targeting a not existing instance' do
126
123
  it 'does not delete any instance and fails' do
127
124
  expect{
128
- delete '/test_models/6'
129
- }.to change(TestModel::ALL, :length).by(0)
125
+ delete '/models/6'
126
+ }.to change(Model::ALL, :length).by(0)
130
127
 
131
128
  last_response.should_not be_ok
132
129
  end
133
130
  end
134
131
  context 'when the deletion route is disabled' do
135
132
  before do
136
- class Yodatra::ModelController
133
+ class Yodatra::ModelsController
137
134
  disable :delete
138
135
  end
139
136
  end
140
137
  it 'should fail with no route available' do
141
- delete '/test_models/2'
138
+ delete '/models/2'
142
139
 
143
140
  last_response.should_not be_ok
144
141
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: yodatra
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.5
4
+ version: 0.1.6
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2014-02-07 00:00:00.000000000 Z
12
+ date: 2014-02-09 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rack
@@ -138,10 +138,11 @@ files:
138
138
  - lib/yodatra/crypto.rb
139
139
  - lib/yodatra/initializers.rb
140
140
  - lib/yodatra/logger.rb
141
- - lib/yodatra/model_controller.rb
141
+ - lib/yodatra/models_controller.rb
142
+ - lib/yodatra/utils.rb
142
143
  - lib/yodatra/version.rb
143
144
  - spec/spec_helper.rb
144
- - spec/unit/model_controller_spec.rb
145
+ - spec/unit/models_controller_spec.rb
145
146
  - yodatra.gemspec
146
147
  homepage: http://squareteam.github.io/yodatra
147
148
  licenses:
@@ -176,4 +177,4 @@ signing_key:
176
177
  specification_version: 3
177
178
  summary: Classy backend development with the speed of Sinatra and the power of ActiveRecord
178
179
  test_files:
179
- - spec/unit/model_controller_spec.rb
180
+ - spec/unit/models_controller_spec.rb