rack-core-data 0.1.0 → 0.2.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.
- 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
|