yodatra 0.1.5 → 0.1.6

Sign up to get free protection for your applications and to get access to all the features.
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