rack-core-data 0.1.0 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- data/Gemfile.lock +16 -10
- data/README.md +8 -1
- data/lib/rack/core-data/version.rb +1 -1
- data/lib/rack/core-data.rb +59 -20
- data/rack-core-data.gemspec +2 -0
- metadata +33 -47
- data/rack-core-data-0.0.3.gem +0 -0
data/Gemfile.lock
CHANGED
@@ -1,33 +1,39 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
rack-core-data (0.
|
4
|
+
rack-core-data (0.2.0)
|
5
5
|
activesupport (~> 3.2.6)
|
6
6
|
nokogiri (~> 1.4)
|
7
7
|
rack (~> 1.4)
|
8
|
+
rack-contrib (~> 1.1.0)
|
8
9
|
sequel (~> 3.37.0)
|
9
10
|
sinatra (~> 1.3.2)
|
11
|
+
sinatra-param (~> 0.1.1)
|
10
12
|
|
11
13
|
GEM
|
12
14
|
remote: http://rubygems.org/
|
13
15
|
specs:
|
14
|
-
activesupport (3.2.
|
16
|
+
activesupport (3.2.12)
|
15
17
|
i18n (~> 0.6)
|
16
18
|
multi_json (~> 1.0)
|
17
19
|
i18n (0.6.1)
|
18
|
-
multi_json (1.
|
19
|
-
nokogiri (1.5.
|
20
|
-
rack (1.
|
21
|
-
rack-
|
20
|
+
multi_json (1.6.1)
|
21
|
+
nokogiri (1.5.6)
|
22
|
+
rack (1.5.2)
|
23
|
+
rack-contrib (1.1.0)
|
24
|
+
rack (>= 0.9.1)
|
25
|
+
rack-protection (1.4.0)
|
22
26
|
rack
|
23
27
|
rake (0.9.2.2)
|
24
28
|
rspec (0.6.4)
|
25
29
|
sequel (3.37.0)
|
26
|
-
sinatra (1.3.
|
27
|
-
rack (~> 1.
|
28
|
-
rack-protection (~> 1.
|
30
|
+
sinatra (1.3.5)
|
31
|
+
rack (~> 1.4)
|
32
|
+
rack-protection (~> 1.3)
|
29
33
|
tilt (~> 1.3, >= 1.3.3)
|
30
|
-
|
34
|
+
sinatra-param (0.1.2)
|
35
|
+
sinatra (~> 1.3)
|
36
|
+
tilt (1.3.4)
|
31
37
|
|
32
38
|
PLATFORMS
|
33
39
|
ruby
|
data/README.md
CHANGED
@@ -31,10 +31,17 @@ Simply point `Rack::CoreData` at your Core Data model file, and a RESTful webser
|
|
31
31
|
|
32
32
|
## Usage
|
33
33
|
|
34
|
+
> The easiest way to use Rack::CoreData is to deploy to Heroku using the [Core Data Buildpack](https://github.com/mattt/heroku-buildpack-core-data). Just `git push` your `.xcdatamodel` file to Heroku, and you'll have a REST webservice up and running in a matter of seconds.
|
35
|
+
|
34
36
|
### Gemfile
|
35
37
|
|
36
38
|
```Ruby
|
37
|
-
|
39
|
+
source :rubygems
|
40
|
+
|
41
|
+
gem 'rack-core-data', :require => 'rack/core-data'
|
42
|
+
|
43
|
+
gem 'thin'
|
44
|
+
gem 'pg'
|
38
45
|
```
|
39
46
|
|
40
47
|
### config.ru
|
data/lib/rack/core-data.rb
CHANGED
@@ -1,5 +1,7 @@
|
|
1
1
|
require 'rack'
|
2
|
+
require 'rack/contrib'
|
2
3
|
require 'sinatra/base'
|
4
|
+
require 'sinatra/param'
|
3
5
|
|
4
6
|
require 'sequel'
|
5
7
|
require 'active_support/inflector'
|
@@ -12,17 +14,38 @@ end
|
|
12
14
|
|
13
15
|
module Rack
|
14
16
|
def self.CoreData(xcdatamodel)
|
17
|
+
model = CoreData::DataModel.new(xcdatamodel)
|
18
|
+
|
19
|
+
# Create each model class before implementing, in order to correctly set up relationships
|
20
|
+
model.entities.each do |entity|
|
21
|
+
klass = Rack::CoreData::Models.const_set(entity.name.capitalize, Class.new(Sequel::Model))
|
22
|
+
end
|
23
|
+
|
15
24
|
app = Class.new(Sinatra::Base) do
|
25
|
+
use Rack::PostBodyContentTypeParser
|
26
|
+
|
16
27
|
before do
|
17
28
|
content_type :json
|
18
29
|
end
|
19
|
-
end
|
20
30
|
|
21
|
-
|
31
|
+
helpers Sinatra::Param
|
22
32
|
|
23
|
-
|
24
|
-
|
25
|
-
|
33
|
+
options '/' do
|
34
|
+
links = []
|
35
|
+
model.entities.each do |entity|
|
36
|
+
links << %{</#{entity.name.downcase.pluralize}>; rel="resource"}
|
37
|
+
end
|
38
|
+
|
39
|
+
response['Link'] = links.join("\n")
|
40
|
+
|
41
|
+
model.entities.collect{ |entity|
|
42
|
+
{
|
43
|
+
name: entity.name,
|
44
|
+
url: "/#{entity.name.downcase.pluralize}",
|
45
|
+
columns: entity.attributes.collect(&:name)
|
46
|
+
}
|
47
|
+
}.to_json
|
48
|
+
end
|
26
49
|
end
|
27
50
|
|
28
51
|
model.entities.each do |entity|
|
@@ -33,12 +56,12 @@ module Rack
|
|
33
56
|
self.strict_param_setting = false
|
34
57
|
self.raise_on_save_failure = false
|
35
58
|
|
36
|
-
plugin :json_serializer, :
|
59
|
+
plugin :json_serializer, naked: true, include: [:url]
|
37
60
|
plugin :schema
|
38
61
|
plugin :validation_helpers
|
39
62
|
|
40
63
|
def url
|
41
|
-
"/#{self.class.table_name}/#{
|
64
|
+
"/#{self.class.table_name}/#{self[primary_key]}"
|
42
65
|
end
|
43
66
|
|
44
67
|
entity.relationships.each do |relationship|
|
@@ -76,7 +99,7 @@ module Rack
|
|
76
99
|
else :varchar
|
77
100
|
end
|
78
101
|
|
79
|
-
column attribute.name, type, options
|
102
|
+
column attribute.name.to_sym, type, options
|
80
103
|
end
|
81
104
|
|
82
105
|
entity.relationships.each do |relationship|
|
@@ -104,7 +127,6 @@ module Rack
|
|
104
127
|
when "String"
|
105
128
|
validates_min_length attribute.minimum_value, attribute.name if attribute.minimum_value
|
106
129
|
validates_max_length attribute.maximum_value, attribute.name if attribute.maximum_value
|
107
|
-
validates_min_length attribute.minimum_value, attribute.name if attribute.minimum_value
|
108
130
|
end
|
109
131
|
end
|
110
132
|
end
|
@@ -115,37 +137,54 @@ module Rack
|
|
115
137
|
|
116
138
|
disable :raise_errors, :show_exceptions
|
117
139
|
|
118
|
-
get "/#{
|
119
|
-
|
140
|
+
get "/#{klass.table_name}/?" do
|
141
|
+
if params[:page] or params[:per_page]
|
142
|
+
param :page, Integer, default: 1, min: 1
|
143
|
+
param :per_page, Integer, default: 100, in: (1..100)
|
144
|
+
|
145
|
+
{
|
146
|
+
"#{klass.table_name}" => klass.limit(params[:per_page], (params[:page] - 1) * params[:per_page]),
|
147
|
+
page: params[:page],
|
148
|
+
total: klass.count
|
149
|
+
}.to_json
|
150
|
+
else
|
151
|
+
param :limit, Integer, default: 100, in: (1..100)
|
152
|
+
param :offset, Integer, default: 0, min: 0
|
153
|
+
|
154
|
+
{
|
155
|
+
"#{klass.table_name}" => klass.limit(params[:limit], params[:offset])
|
156
|
+
}.to_json
|
157
|
+
end
|
120
158
|
end
|
121
159
|
|
122
|
-
post "/#{
|
160
|
+
post "/#{klass.table_name}/?" do
|
123
161
|
record = klass.new(params)
|
124
162
|
if record.save
|
125
163
|
status 201
|
126
|
-
record.to_json
|
164
|
+
{entity.name.downcase => record}.to_json
|
127
165
|
else
|
128
166
|
status 406
|
129
167
|
{errors: record.errors}.to_json
|
130
168
|
end
|
131
169
|
end
|
132
170
|
|
133
|
-
get "/#{
|
134
|
-
klass[params[:id]]
|
171
|
+
get "/#{klass.table_name}/:id/?" do
|
172
|
+
record = klass[params[:id]] or halt 404
|
173
|
+
{entity.name.downcase => record}.to_json
|
135
174
|
end
|
136
175
|
|
137
|
-
put "/#{
|
176
|
+
put "/#{klass.table_name}/:id/?" do
|
138
177
|
record = klass[params[:id]] or halt 404
|
139
178
|
if record.update(params)
|
140
179
|
status 200
|
141
|
-
record.to_json
|
180
|
+
{entity.name.downcase => record}.to_json
|
142
181
|
else
|
143
182
|
status 406
|
144
183
|
{errors: record.errors}.to_json
|
145
184
|
end
|
146
185
|
end
|
147
186
|
|
148
|
-
delete "/#{
|
187
|
+
delete "/#{klass.table_name}/:id/?" do
|
149
188
|
record = klass[params[:id]] or halt 404
|
150
189
|
if record.destroy
|
151
190
|
status 200
|
@@ -158,8 +197,8 @@ module Rack
|
|
158
197
|
entity.relationships.each do |relationship|
|
159
198
|
next unless relationship.to_many?
|
160
199
|
|
161
|
-
get "/#{
|
162
|
-
klass[params[:id]].send(relationship.name).to_json
|
200
|
+
get "/#{klass.table_name}/:id/#{relationship.name}/?" do
|
201
|
+
{relationship.name => klass[params[:id]].send(relationship.name)}.to_json
|
163
202
|
end
|
164
203
|
end
|
165
204
|
end
|
data/rack-core-data.gemspec
CHANGED
@@ -16,8 +16,10 @@ Gem::Specification.new do |s|
|
|
16
16
|
s.add_development_dependency "rake", "~> 0.9.2"
|
17
17
|
|
18
18
|
s.add_dependency "rack", "~> 1.4"
|
19
|
+
s.add_dependency "rack-contrib", "~> 1.1.0"
|
19
20
|
s.add_dependency "nokogiri", "~> 1.4"
|
20
21
|
s.add_dependency "sinatra", "~> 1.3.2"
|
22
|
+
s.add_dependency "sinatra-param", "~> 0.1.1"
|
21
23
|
s.add_dependency "sequel", "~> 3.37.0"
|
22
24
|
s.add_dependency "activesupport", "~> 3.2.6"
|
23
25
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rack-core-data
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,11 +9,11 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2013-03-06 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rspec
|
16
|
-
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirement: &70164102486760 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ~>
|
@@ -21,15 +21,10 @@ dependencies:
|
|
21
21
|
version: 0.6.1
|
22
22
|
type: :development
|
23
23
|
prerelease: false
|
24
|
-
version_requirements:
|
25
|
-
none: false
|
26
|
-
requirements:
|
27
|
-
- - ~>
|
28
|
-
- !ruby/object:Gem::Version
|
29
|
-
version: 0.6.1
|
24
|
+
version_requirements: *70164102486760
|
30
25
|
- !ruby/object:Gem::Dependency
|
31
26
|
name: rake
|
32
|
-
requirement: !ruby/object:Gem::Requirement
|
27
|
+
requirement: &70164102486160 !ruby/object:Gem::Requirement
|
33
28
|
none: false
|
34
29
|
requirements:
|
35
30
|
- - ~>
|
@@ -37,15 +32,10 @@ dependencies:
|
|
37
32
|
version: 0.9.2
|
38
33
|
type: :development
|
39
34
|
prerelease: false
|
40
|
-
version_requirements:
|
41
|
-
none: false
|
42
|
-
requirements:
|
43
|
-
- - ~>
|
44
|
-
- !ruby/object:Gem::Version
|
45
|
-
version: 0.9.2
|
35
|
+
version_requirements: *70164102486160
|
46
36
|
- !ruby/object:Gem::Dependency
|
47
37
|
name: rack
|
48
|
-
requirement: !ruby/object:Gem::Requirement
|
38
|
+
requirement: &70164102485660 !ruby/object:Gem::Requirement
|
49
39
|
none: false
|
50
40
|
requirements:
|
51
41
|
- - ~>
|
@@ -53,15 +43,21 @@ dependencies:
|
|
53
43
|
version: '1.4'
|
54
44
|
type: :runtime
|
55
45
|
prerelease: false
|
56
|
-
version_requirements:
|
46
|
+
version_requirements: *70164102485660
|
47
|
+
- !ruby/object:Gem::Dependency
|
48
|
+
name: rack-contrib
|
49
|
+
requirement: &70164102485160 !ruby/object:Gem::Requirement
|
57
50
|
none: false
|
58
51
|
requirements:
|
59
52
|
- - ~>
|
60
53
|
- !ruby/object:Gem::Version
|
61
|
-
version:
|
54
|
+
version: 1.1.0
|
55
|
+
type: :runtime
|
56
|
+
prerelease: false
|
57
|
+
version_requirements: *70164102485160
|
62
58
|
- !ruby/object:Gem::Dependency
|
63
59
|
name: nokogiri
|
64
|
-
requirement: !ruby/object:Gem::Requirement
|
60
|
+
requirement: &70164102484640 !ruby/object:Gem::Requirement
|
65
61
|
none: false
|
66
62
|
requirements:
|
67
63
|
- - ~>
|
@@ -69,15 +65,10 @@ dependencies:
|
|
69
65
|
version: '1.4'
|
70
66
|
type: :runtime
|
71
67
|
prerelease: false
|
72
|
-
version_requirements:
|
73
|
-
none: false
|
74
|
-
requirements:
|
75
|
-
- - ~>
|
76
|
-
- !ruby/object:Gem::Version
|
77
|
-
version: '1.4'
|
68
|
+
version_requirements: *70164102484640
|
78
69
|
- !ruby/object:Gem::Dependency
|
79
70
|
name: sinatra
|
80
|
-
requirement: !ruby/object:Gem::Requirement
|
71
|
+
requirement: &70164102484160 !ruby/object:Gem::Requirement
|
81
72
|
none: false
|
82
73
|
requirements:
|
83
74
|
- - ~>
|
@@ -85,15 +76,21 @@ dependencies:
|
|
85
76
|
version: 1.3.2
|
86
77
|
type: :runtime
|
87
78
|
prerelease: false
|
88
|
-
version_requirements:
|
79
|
+
version_requirements: *70164102484160
|
80
|
+
- !ruby/object:Gem::Dependency
|
81
|
+
name: sinatra-param
|
82
|
+
requirement: &70164102483660 !ruby/object:Gem::Requirement
|
89
83
|
none: false
|
90
84
|
requirements:
|
91
85
|
- - ~>
|
92
86
|
- !ruby/object:Gem::Version
|
93
|
-
version: 1.
|
87
|
+
version: 0.1.1
|
88
|
+
type: :runtime
|
89
|
+
prerelease: false
|
90
|
+
version_requirements: *70164102483660
|
94
91
|
- !ruby/object:Gem::Dependency
|
95
92
|
name: sequel
|
96
|
-
requirement: !ruby/object:Gem::Requirement
|
93
|
+
requirement: &70164102483100 !ruby/object:Gem::Requirement
|
97
94
|
none: false
|
98
95
|
requirements:
|
99
96
|
- - ~>
|
@@ -101,15 +98,10 @@ dependencies:
|
|
101
98
|
version: 3.37.0
|
102
99
|
type: :runtime
|
103
100
|
prerelease: false
|
104
|
-
version_requirements:
|
105
|
-
none: false
|
106
|
-
requirements:
|
107
|
-
- - ~>
|
108
|
-
- !ruby/object:Gem::Version
|
109
|
-
version: 3.37.0
|
101
|
+
version_requirements: *70164102483100
|
110
102
|
- !ruby/object:Gem::Dependency
|
111
103
|
name: activesupport
|
112
|
-
requirement: !ruby/object:Gem::Requirement
|
104
|
+
requirement: &70164102482580 !ruby/object:Gem::Requirement
|
113
105
|
none: false
|
114
106
|
requirements:
|
115
107
|
- - ~>
|
@@ -117,12 +109,7 @@ dependencies:
|
|
117
109
|
version: 3.2.6
|
118
110
|
type: :runtime
|
119
111
|
prerelease: false
|
120
|
-
version_requirements:
|
121
|
-
none: false
|
122
|
-
requirements:
|
123
|
-
- - ~>
|
124
|
-
- !ruby/object:Gem::Version
|
125
|
-
version: 3.2.6
|
112
|
+
version_requirements: *70164102482580
|
126
113
|
description: Automatically generate REST APIs for Core Data models.
|
127
114
|
email: m@mattt.me
|
128
115
|
executables: []
|
@@ -138,7 +125,6 @@ files:
|
|
138
125
|
- ./lib/rack/core-data/version.rb
|
139
126
|
- ./lib/rack/core-data.rb
|
140
127
|
- ./LICENSE
|
141
|
-
- ./rack-core-data-0.0.3.gem
|
142
128
|
- ./rack-core-data.gemspec
|
143
129
|
- ./Rakefile
|
144
130
|
- ./README.md
|
@@ -156,7 +142,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
156
142
|
version: '0'
|
157
143
|
segments:
|
158
144
|
- 0
|
159
|
-
hash:
|
145
|
+
hash: 454791044675933494
|
160
146
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
161
147
|
none: false
|
162
148
|
requirements:
|
@@ -165,10 +151,10 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
165
151
|
version: '0'
|
166
152
|
segments:
|
167
153
|
- 0
|
168
|
-
hash:
|
154
|
+
hash: 454791044675933494
|
169
155
|
requirements: []
|
170
156
|
rubyforge_project:
|
171
|
-
rubygems_version: 1.8.
|
157
|
+
rubygems_version: 1.8.15
|
172
158
|
signing_key:
|
173
159
|
specification_version: 3
|
174
160
|
summary: Rack::CoreData
|
data/rack-core-data-0.0.3.gem
DELETED
Binary file
|