cathode 0.0.1 → 0.1.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.
- checksums.yaml +4 -4
- data/README.md +346 -125
- data/Rakefile +1 -0
- data/app/controllers/cathode/base_controller.rb +28 -45
- data/app/models/cathode/token.rb +21 -0
- data/config/routes.rb +16 -0
- data/db/migrate/20140425164100_create_cathode_tokens.rb +11 -0
- data/lib/cathode.rb +0 -13
- data/lib/cathode/_version.rb +2 -1
- data/lib/cathode/action.rb +197 -39
- data/lib/cathode/action_dsl.rb +60 -0
- data/lib/cathode/base.rb +81 -12
- data/lib/cathode/create_request.rb +21 -0
- data/lib/cathode/custom_request.rb +5 -0
- data/lib/cathode/debug.rb +25 -0
- data/lib/cathode/destroy_request.rb +13 -0
- data/lib/cathode/engine.rb +9 -0
- data/lib/cathode/exceptions.rb +20 -0
- data/lib/cathode/index_request.rb +40 -0
- data/lib/cathode/object_collection.rb +49 -0
- data/lib/cathode/query.rb +24 -0
- data/lib/cathode/railtie.rb +21 -0
- data/lib/cathode/request.rb +139 -7
- data/lib/cathode/resource.rb +50 -19
- data/lib/cathode/resource_dsl.rb +46 -0
- data/lib/cathode/show_request.rb +13 -0
- data/lib/cathode/update_request.rb +26 -0
- data/lib/cathode/version.rb +112 -23
- data/lib/tasks/cathode_tasks.rake +5 -4
- data/spec/dummy/app/api/api.rb +0 -0
- data/spec/dummy/app/models/payment.rb +3 -0
- data/spec/dummy/app/models/product.rb +1 -0
- data/spec/dummy/app/models/sale.rb +5 -0
- data/spec/dummy/app/models/salesperson.rb +3 -0
- data/spec/dummy/db/development.sqlite3 +0 -0
- data/spec/dummy/db/migrate/20140409183635_create_sales.rb +11 -0
- data/spec/dummy/db/migrate/20140423172419_create_salespeople.rb +11 -0
- data/spec/dummy/db/migrate/20140424181343_create_payments.rb +10 -0
- data/spec/dummy/db/schema.rb +31 -1
- data/spec/dummy/db/test.sqlite3 +0 -0
- data/spec/dummy/log/development.log +1167 -0
- data/spec/dummy/log/test.log +180602 -0
- data/spec/dummy/spec/factories/payments.rb +8 -0
- data/spec/dummy/spec/factories/products.rb +1 -1
- data/spec/dummy/spec/factories/sales.rb +9 -0
- data/spec/dummy/spec/factories/salespeople.rb +7 -0
- data/spec/dummy/spec/requests/requests_spec.rb +434 -0
- data/spec/lib/cathode/action_spec.rb +136 -0
- data/spec/lib/cathode/base_spec.rb +34 -0
- data/spec/lib/cathode/create_request_spec.rb +40 -0
- data/spec/lib/cathode/custom_request_spec.rb +31 -0
- data/spec/lib/cathode/debug_spec.rb +25 -0
- data/spec/lib/cathode/destroy_request_spec.rb +28 -0
- data/spec/lib/cathode/index_request_spec.rb +62 -0
- data/spec/lib/cathode/object_collection_spec.rb +66 -0
- data/spec/lib/cathode/query_spec.rb +28 -0
- data/spec/lib/cathode/request_spec.rb +58 -0
- data/spec/lib/cathode/resource_spec.rb +482 -0
- data/spec/lib/cathode/show_request_spec.rb +23 -0
- data/spec/lib/cathode/update_request_spec.rb +41 -0
- data/spec/lib/cathode/version_spec.rb +416 -0
- data/spec/models/cathode/token_spec.rb +62 -0
- data/spec/spec_helper.rb +8 -2
- data/spec/support/factories/payments.rb +3 -0
- data/spec/support/factories/sale.rb +3 -0
- data/spec/support/factories/salespeople.rb +3 -0
- data/spec/support/factories/token.rb +3 -0
- data/spec/support/helpers.rb +13 -2
- metadata +192 -47
- data/app/helpers/cathode/application_helper.rb +0 -4
- data/spec/dummy/app/api/dummy_api.rb +0 -4
- data/spec/integration/api_spec.rb +0 -88
- data/spec/lib/action_spec.rb +0 -140
- data/spec/lib/base_spec.rb +0 -28
- data/spec/lib/request_spec.rb +0 -5
- data/spec/lib/resources_spec.rb +0 -78
- data/spec/lib/versioning_spec.rb +0 -104
@@ -1,88 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
def make_request(method, path, params = nil, version = '1.0.0')
|
4
|
-
send(method, path, params, { 'Accept-Version' => version })
|
5
|
-
end
|
6
|
-
|
7
|
-
describe 'API' do
|
8
|
-
context 'with the default API (all actions)' do
|
9
|
-
before(:all) do
|
10
|
-
use_api do
|
11
|
-
version 1.5 do
|
12
|
-
resource :products, actions: [:all]
|
13
|
-
end
|
14
|
-
end
|
15
|
-
end
|
16
|
-
|
17
|
-
let!(:products) { create_list(:product, 5) }
|
18
|
-
|
19
|
-
describe 'GET #index' do
|
20
|
-
subject { make_request :get, 'api/products' }
|
21
|
-
|
22
|
-
it 'responds with all records' do
|
23
|
-
subject
|
24
|
-
expect(response.body).to eq(products.to_json)
|
25
|
-
end
|
26
|
-
end
|
27
|
-
|
28
|
-
describe 'GET #show' do
|
29
|
-
subject { make_request :get, 'api/products/1', nil, '1.5' }
|
30
|
-
|
31
|
-
it 'responds with the record' do
|
32
|
-
subject
|
33
|
-
expect(response.body).to eq(products.first.to_json)
|
34
|
-
end
|
35
|
-
end
|
36
|
-
|
37
|
-
describe 'POST #create' do
|
38
|
-
subject { make_request :post, 'api/products', product: { title: 'hello', cost: 1900 } }
|
39
|
-
|
40
|
-
it 'responds with the new record' do
|
41
|
-
subject
|
42
|
-
expect(response.body).to eq(Product.new(title: 'hello', cost: 1900).to_json)
|
43
|
-
end
|
44
|
-
end
|
45
|
-
|
46
|
-
describe 'DELETE #destroy' do
|
47
|
-
subject { make_request :delete, 'api/products/1' }
|
48
|
-
|
49
|
-
it 'responds with success' do
|
50
|
-
expect(subject).to eq(200)
|
51
|
-
end
|
52
|
-
end
|
53
|
-
end
|
54
|
-
|
55
|
-
context 'with an access filter' do
|
56
|
-
subject { make_request :get, 'api/products/1' }
|
57
|
-
|
58
|
-
let!(:products) { create_list(:product, 5) }
|
59
|
-
|
60
|
-
context 'when inaccessible' do
|
61
|
-
before(:all) do
|
62
|
-
use_api do
|
63
|
-
resource :products do
|
64
|
-
action(:show) { access_filter { false } }
|
65
|
-
end
|
66
|
-
end
|
67
|
-
end
|
68
|
-
|
69
|
-
it 'responds with unauthorized' do
|
70
|
-
expect(subject).to eq(401)
|
71
|
-
end
|
72
|
-
end
|
73
|
-
|
74
|
-
context 'when accessible' do
|
75
|
-
before(:all) do
|
76
|
-
use_api do
|
77
|
-
resource :products do
|
78
|
-
action(:show) { access_filter { true } }
|
79
|
-
end
|
80
|
-
end
|
81
|
-
end
|
82
|
-
|
83
|
-
it 'responds with success' do
|
84
|
-
expect(subject).to eq(200)
|
85
|
-
end
|
86
|
-
end
|
87
|
-
end
|
88
|
-
end
|
data/spec/lib/action_spec.rb
DELETED
@@ -1,140 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
describe Cathode::Action do
|
4
|
-
describe '.create' do
|
5
|
-
subject { Cathode::Action.create(action, :products) }
|
6
|
-
|
7
|
-
context 'with :index' do
|
8
|
-
let(:action) { :index }
|
9
|
-
|
10
|
-
it 'creates a IndexAction' do
|
11
|
-
expect(subject.class).to eq(Cathode::IndexAction)
|
12
|
-
end
|
13
|
-
end
|
14
|
-
|
15
|
-
context 'with :show' do
|
16
|
-
let(:action) { :show }
|
17
|
-
|
18
|
-
it 'creates a ShowAction' do
|
19
|
-
expect(subject.class).to eq(Cathode::ShowAction)
|
20
|
-
end
|
21
|
-
end
|
22
|
-
|
23
|
-
context 'with :create' do
|
24
|
-
let(:action) { :create }
|
25
|
-
|
26
|
-
it 'creates a CreateAction' do
|
27
|
-
expect(subject.class).to eq(Cathode::CreateAction)
|
28
|
-
end
|
29
|
-
end
|
30
|
-
|
31
|
-
context 'with :update' do
|
32
|
-
let(:action) { :update }
|
33
|
-
|
34
|
-
it 'creates an UpdateAction' do
|
35
|
-
expect(subject.class).to eq(Cathode::UpdateAction)
|
36
|
-
end
|
37
|
-
end
|
38
|
-
|
39
|
-
context 'with :destroy' do
|
40
|
-
let(:action) { :destroy }
|
41
|
-
|
42
|
-
it 'creates a DestroyAction' do
|
43
|
-
expect(subject.class).to eq(Cathode::DestroyAction)
|
44
|
-
end
|
45
|
-
end
|
46
|
-
end
|
47
|
-
|
48
|
-
describe '#perform' do
|
49
|
-
let!(:products) { create_list(:product, 5) }
|
50
|
-
|
51
|
-
subject { Cathode::Action.create(action, :products).perform(params) }
|
52
|
-
|
53
|
-
context ':index' do
|
54
|
-
let(:action) { :index }
|
55
|
-
let(:params) { {} }
|
56
|
-
|
57
|
-
it 'sets status as ok' do
|
58
|
-
expect(subject[:status]).to eq(:ok)
|
59
|
-
end
|
60
|
-
|
61
|
-
it 'sets body as all resource records' do
|
62
|
-
expect(subject[:body]).to eq(Product.all)
|
63
|
-
end
|
64
|
-
end
|
65
|
-
|
66
|
-
context ':show' do
|
67
|
-
let(:action) { :show }
|
68
|
-
let(:params) { { :id => 3 } }
|
69
|
-
|
70
|
-
subject { Cathode::Action.create(action, :products, &block).perform(params) }
|
71
|
-
|
72
|
-
context 'with access filter' do
|
73
|
-
context 'when accessible' do
|
74
|
-
let(:block) { proc { access_filter(&proc { true }) } }
|
75
|
-
|
76
|
-
it 'sets status as ok' do
|
77
|
-
expect(subject[:status]).to eq(:ok)
|
78
|
-
end
|
79
|
-
|
80
|
-
it 'sets body as the record' do
|
81
|
-
expect(subject[:body]).to eq(products[2])
|
82
|
-
end
|
83
|
-
end
|
84
|
-
|
85
|
-
context 'when inaccessible' do
|
86
|
-
let(:block) { proc { access_filter(&proc { false }) } }
|
87
|
-
|
88
|
-
it 'sets status as unauthorized' do
|
89
|
-
expect(subject[:status]).to eq(:unauthorized)
|
90
|
-
end
|
91
|
-
|
92
|
-
it 'sets body as nil' do
|
93
|
-
expect(subject[:body]).to be_nil
|
94
|
-
end
|
95
|
-
end
|
96
|
-
end
|
97
|
-
end
|
98
|
-
|
99
|
-
context ':create' do
|
100
|
-
let(:action) { :create }
|
101
|
-
let(:params) { { :title => 'cool product' } }
|
102
|
-
|
103
|
-
it 'sets status as ok' do
|
104
|
-
expect(subject[:status]).to eq(:ok)
|
105
|
-
end
|
106
|
-
|
107
|
-
it 'sets body as the new record' do
|
108
|
-
expect(subject[:body].title).to eq('cool product')
|
109
|
-
end
|
110
|
-
end
|
111
|
-
|
112
|
-
context ':update' do
|
113
|
-
let(:action) { :update }
|
114
|
-
let(:params) { { :id => product.id, :title => 'cooler product' } }
|
115
|
-
let(:product) { create(:product, title: 'cool product') }
|
116
|
-
|
117
|
-
it 'sets status as ok' do
|
118
|
-
expect(subject[:status]).to eq(:ok)
|
119
|
-
end
|
120
|
-
|
121
|
-
it 'sets body as the updated record' do
|
122
|
-
expect(subject[:body].title).to eq('cooler product')
|
123
|
-
end
|
124
|
-
end
|
125
|
-
|
126
|
-
context ':destroy' do
|
127
|
-
let(:action) { :destroy }
|
128
|
-
let(:params) { { :id => product.id } }
|
129
|
-
let!(:product) { create(:product) }
|
130
|
-
|
131
|
-
it 'sets status as ok' do
|
132
|
-
expect(subject[:status]).to eq(:ok)
|
133
|
-
end
|
134
|
-
|
135
|
-
it 'removes the record' do
|
136
|
-
expect { subject }.to change { Product.count }.by(-1)
|
137
|
-
end
|
138
|
-
end
|
139
|
-
end
|
140
|
-
end
|
data/spec/lib/base_spec.rb
DELETED
@@ -1,28 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
describe Cathode::Base do
|
4
|
-
describe '#version' do
|
5
|
-
subject { Cathode::Base.version 1.5 do
|
6
|
-
resource :products
|
7
|
-
end }
|
8
|
-
|
9
|
-
it 'creates a new version' do
|
10
|
-
expect(subject.version).to eq('1.5.0')
|
11
|
-
end
|
12
|
-
|
13
|
-
it 'contains the resources' do
|
14
|
-
expect(subject.resources.keys).to eq([:products])
|
15
|
-
end
|
16
|
-
end
|
17
|
-
|
18
|
-
describe '#resource' do
|
19
|
-
context 'with resource name' do
|
20
|
-
subject { Cathode::Base.resource(:products) }
|
21
|
-
|
22
|
-
it 'initializes version 1.0.0' do
|
23
|
-
subject
|
24
|
-
expect(Cathode::Version.all['1.0.0'].resources[:products]).to_not be_nil
|
25
|
-
end
|
26
|
-
end
|
27
|
-
end
|
28
|
-
end
|
data/spec/lib/request_spec.rb
DELETED
data/spec/lib/resources_spec.rb
DELETED
@@ -1,78 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
describe Cathode::Resource do
|
4
|
-
describe '.new' do
|
5
|
-
context 'with a nonexistent resource' do
|
6
|
-
subject { Cathode::Resource.new(:boxes, [:all]) }
|
7
|
-
|
8
|
-
it 'raises an error' do
|
9
|
-
expect { subject }.to raise_error(Cathode::UnknownResourceError)
|
10
|
-
end
|
11
|
-
end
|
12
|
-
|
13
|
-
context 'with an existing resource' do
|
14
|
-
context 'with all methods' do
|
15
|
-
subject { Cathode::Resource.new(:products, actions: [:all]) }
|
16
|
-
|
17
|
-
it 'creates a controller' do
|
18
|
-
subject
|
19
|
-
expect(Cathode::ProductsController).to_not be_nil
|
20
|
-
end
|
21
|
-
|
22
|
-
it 'adds index, create, update, show, delete routes' do
|
23
|
-
subject
|
24
|
-
expect(Cathode::Engine.routes.recognize_path('products', method: :get)).to be_true
|
25
|
-
expect(Cathode::Engine.routes.recognize_path('products/1', method: :get)).to be_true
|
26
|
-
expect(Cathode::Engine.routes.recognize_path('products', method: :post)).to be_true
|
27
|
-
expect(Cathode::Engine.routes.recognize_path('products/1', method: :put)).to be_true
|
28
|
-
expect(Cathode::Engine.routes.recognize_path('products/1', method: :delete)).to be_true
|
29
|
-
end
|
30
|
-
|
31
|
-
it 'does not add the edit route' do
|
32
|
-
expect { Cathode::Engine.routes.recognize_path('products/1/edit', method: :get) }.to raise_error
|
33
|
-
end
|
34
|
-
end
|
35
|
-
|
36
|
-
context 'with subset of methods' do
|
37
|
-
subject { Cathode::Resource.new(:products, actions: [:index, :show]) }
|
38
|
-
|
39
|
-
it 'creates a controller' do
|
40
|
-
subject
|
41
|
-
expect(Cathode::ProductsController).to_not be_nil
|
42
|
-
end
|
43
|
-
|
44
|
-
it 'adds routes only for the defined actions' do
|
45
|
-
subject
|
46
|
-
expect(Cathode::Engine.routes.recognize_path('products', method: :get)).to be_true
|
47
|
-
expect(Cathode::Engine.routes.recognize_path('products/1', method: :get)).to be_true
|
48
|
-
end
|
49
|
-
|
50
|
-
it 'does not add the other routes' do
|
51
|
-
subject
|
52
|
-
expect { Cathode::Engine.routes.recognize_path('products/1/edit', method: :get) }.to raise_error
|
53
|
-
expect { Cathode::Engine.routes.recognize_path('products', method: :post) }.to raise_error
|
54
|
-
expect { Cathode::Engine.routes.recognize_path('products/1', method: :put) }.to raise_error
|
55
|
-
expect { Cathode::Engine.routes.recognize_path('products/1', method: :delete) }.to raise_error
|
56
|
-
end
|
57
|
-
end
|
58
|
-
|
59
|
-
context 'with a block action' do
|
60
|
-
subject { Cathode::Resource.new(:products, &block) }
|
61
|
-
|
62
|
-
context 'and plain actions' do
|
63
|
-
let(:block) { proc { action :index } }
|
64
|
-
|
65
|
-
it 'adds the route' do
|
66
|
-
subject
|
67
|
-
expect(Cathode::Engine.routes.recognize_path('products', method: :get)).to be_true
|
68
|
-
end
|
69
|
-
|
70
|
-
it 'does not add other actions' do
|
71
|
-
subject
|
72
|
-
expect { Cathode::Engine.routes.recognize_path('products', method: :post) }.to raise_error
|
73
|
-
end
|
74
|
-
end
|
75
|
-
end
|
76
|
-
end
|
77
|
-
end
|
78
|
-
end
|
data/spec/lib/versioning_spec.rb
DELETED
@@ -1,104 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
describe Cathode::Version do
|
4
|
-
describe '.new' do
|
5
|
-
subject { Cathode::Version.new(version, &block) }
|
6
|
-
|
7
|
-
describe 'creation of semvers with flexible version input' do
|
8
|
-
let(:block) { nil }
|
9
|
-
|
10
|
-
context 'with bad version number' do
|
11
|
-
let(:version) { 'a' }
|
12
|
-
|
13
|
-
it 'raises an error' do
|
14
|
-
expect { subject }.to raise_error(ArgumentError)
|
15
|
-
end
|
16
|
-
end
|
17
|
-
|
18
|
-
context 'with good version' do
|
19
|
-
context 'with integer' do
|
20
|
-
let(:version) { 1 }
|
21
|
-
|
22
|
-
it 'sets the semantic version' do
|
23
|
-
expect(subject.version).to eq('1.0.0')
|
24
|
-
end
|
25
|
-
end
|
26
|
-
|
27
|
-
context 'with float' do
|
28
|
-
let(:version) { 1.5 }
|
29
|
-
|
30
|
-
it 'sets the semantic version' do
|
31
|
-
expect(subject.version).to eq('1.5.0')
|
32
|
-
end
|
33
|
-
end
|
34
|
-
|
35
|
-
context 'with string' do
|
36
|
-
let(:version) { '1.5.1' }
|
37
|
-
|
38
|
-
it 'sets the semantic version' do
|
39
|
-
expect(subject.version).to eq('1.5.1')
|
40
|
-
end
|
41
|
-
end
|
42
|
-
|
43
|
-
context 'with prerelease' do
|
44
|
-
let(:version) { '1.6.0-pre' }
|
45
|
-
|
46
|
-
it 'sets the semantic version' do
|
47
|
-
expect(subject.version).to eq('1.6.0-pre')
|
48
|
-
end
|
49
|
-
end
|
50
|
-
end
|
51
|
-
end
|
52
|
-
|
53
|
-
describe 'creation of resources' do
|
54
|
-
let(:version) { 1 }
|
55
|
-
|
56
|
-
context 'with no params or block' do
|
57
|
-
let(:block) { proc do
|
58
|
-
resource :products
|
59
|
-
end }
|
60
|
-
|
61
|
-
it 'creates the resource' do
|
62
|
-
expect(Cathode::Resource).to receive(:new) do |resource, params, &block|
|
63
|
-
expect(resource).to eq(:products)
|
64
|
-
expect(params).to be_nil
|
65
|
-
expect(block).to be_nil
|
66
|
-
end
|
67
|
-
subject
|
68
|
-
end
|
69
|
-
end
|
70
|
-
|
71
|
-
context 'with params' do
|
72
|
-
let(:block) { proc do
|
73
|
-
resource :sales, actions: [:index, :create]
|
74
|
-
end }
|
75
|
-
|
76
|
-
it 'creates the resource' do
|
77
|
-
expect(Cathode::Resource).to receive(:new) do |resource, params, &block|
|
78
|
-
expect(resource).to eq(:sales)
|
79
|
-
expect(params).to eq(actions: [:index, :create])
|
80
|
-
expect(block).to be_nil
|
81
|
-
end
|
82
|
-
subject
|
83
|
-
end
|
84
|
-
end
|
85
|
-
|
86
|
-
context 'with params and block' do
|
87
|
-
let(:block) { proc do
|
88
|
-
resource :salespeople, actions: [:index] do
|
89
|
-
action :create
|
90
|
-
end
|
91
|
-
end }
|
92
|
-
|
93
|
-
it 'creates the resource' do
|
94
|
-
expect(Cathode::Resource).to receive(:new) do |resource, params, &block|
|
95
|
-
expect(resource).to eq(:salespeople)
|
96
|
-
expect(params).to eq(actions: [:index])
|
97
|
-
expect(block).to_not be_nil
|
98
|
-
end
|
99
|
-
subject
|
100
|
-
end
|
101
|
-
end
|
102
|
-
end
|
103
|
-
end
|
104
|
-
end
|