wurst 0.0.1
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 +7 -0
- data/.gitignore +1 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +22 -0
- data/README.md +76 -0
- data/Rakefile +1 -0
- data/lib/assets/ember-data.js +12747 -0
- data/lib/assets/ember.js +49740 -0
- data/lib/assets/handlebars-v1.3.0.js +2746 -0
- data/lib/wurst.rb +3 -0
- data/lib/wurst/resource.rb +145 -0
- data/lib/wurst/version.rb +3 -0
- data/wurst.gemspec +24 -0
- metadata +100 -0
data/lib/wurst.rb
ADDED
@@ -0,0 +1,145 @@
|
|
1
|
+
require 'erb'
|
2
|
+
|
3
|
+
FRONTEND_MODELS = {}
|
4
|
+
|
5
|
+
class ZWRouter
|
6
|
+
attr_reader :routes
|
7
|
+
|
8
|
+
def initialize
|
9
|
+
@routes = {}
|
10
|
+
@active = false
|
11
|
+
end
|
12
|
+
def has_route? route_name
|
13
|
+
@routes.has_key? route_name
|
14
|
+
end
|
15
|
+
def switch new_val = true
|
16
|
+
@active = new_val
|
17
|
+
end
|
18
|
+
def method_missing method_name, *args, &block
|
19
|
+
if [:create, :read, :update, :destroy, :index].include? method_name
|
20
|
+
if @active
|
21
|
+
@routes[method_name].call args
|
22
|
+
else
|
23
|
+
@routes[method_name] = block
|
24
|
+
end
|
25
|
+
else
|
26
|
+
super
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
module ZWResources
|
32
|
+
# Collect resources for ember model definitions
|
33
|
+
def frontend_model model_name, model
|
34
|
+
FRONTEND_MODELS[model_name] = (
|
35
|
+
model.properties.to_a.map! do |property|
|
36
|
+
{name: property.name}
|
37
|
+
end
|
38
|
+
)
|
39
|
+
end
|
40
|
+
|
41
|
+
# Route to send model definitions to ember
|
42
|
+
def self.extended base
|
43
|
+
base.send :get, '/models.js' do
|
44
|
+
content_type :js, :charset => 'utf-8'
|
45
|
+
# @@models_js_template defined at bottom of module def
|
46
|
+
Tilt::ERBTemplate.new{@@models_js_template}.render
|
47
|
+
end
|
48
|
+
|
49
|
+
Dir.glob(File.join('..', 'assets')) do |file|
|
50
|
+
# TODO cross-platform? probably not.
|
51
|
+
base.send :get, file.split('/').last do
|
52
|
+
content_type :js, :charset => 'utf-8'
|
53
|
+
send_file file
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
def resource model_sym, &block
|
59
|
+
model_name_string = model_sym.to_s
|
60
|
+
model_name = model_name_string[0].upcase + model_name_string[1..-2]
|
61
|
+
model = Kernel.const_get(model_name)
|
62
|
+
frontend_model model_name, model # Sends model definition to ember
|
63
|
+
|
64
|
+
router = ZWRouter.new
|
65
|
+
if block_given?
|
66
|
+
block.call(router)
|
67
|
+
end
|
68
|
+
router.switch
|
69
|
+
|
70
|
+
puts "***"
|
71
|
+
puts router.routes.inspect
|
72
|
+
|
73
|
+
# Find
|
74
|
+
get "/#{model_name_string}/:id" do |id|
|
75
|
+
content_type :json, :charset => 'utf-8'
|
76
|
+
if router.has_route? :read
|
77
|
+
{post: router.read(id)}.to_json
|
78
|
+
else
|
79
|
+
{post: model.get(id)}.to_json
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
# Find All
|
84
|
+
get "/#{model_name_string}" do
|
85
|
+
content_type :json, :charset => 'utf-8'
|
86
|
+
if router.has_route? :index
|
87
|
+
{posts: router.index}.to_json
|
88
|
+
else
|
89
|
+
{posts: model.all}.to_json
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
# Update
|
94
|
+
put "/#{model_name_string}/:id" do |id|
|
95
|
+
content_type :json, :charset => 'utf-8'
|
96
|
+
if router.has_route? :update
|
97
|
+
{post: router.update(id, params)}.to_json
|
98
|
+
else
|
99
|
+
param_names = model.properties.select{ |prop| prop.class != DataMapper::Property::Serial }.map{ |prop| prop.name }
|
100
|
+
m = model.get(id)
|
101
|
+
m.update(params.select{ |k,v| param_names.include? k.to_sym })
|
102
|
+
{post: m}.to_json
|
103
|
+
end
|
104
|
+
end
|
105
|
+
|
106
|
+
# Create
|
107
|
+
post "/#{model_name_string}" do
|
108
|
+
content_type :json, :charset => 'utf-8'
|
109
|
+
if router.has_route? :create
|
110
|
+
{post: router.create(params)}.to_json
|
111
|
+
else
|
112
|
+
param_names = model.properties.select{ |prop| prop.class != DataMapper::Property::Serial }.map{ |prop| prop.name }
|
113
|
+
m = model.create(params.select{ |k,v| param_names.include? k.to_sym })
|
114
|
+
{post: m}.to_json
|
115
|
+
end
|
116
|
+
end
|
117
|
+
|
118
|
+
# Delete
|
119
|
+
delete "/#{model_name_string}/:id" do |id|
|
120
|
+
content_type :json, :charset => 'utf-8'
|
121
|
+
if router.has_route? :destroy
|
122
|
+
{post: router.destroy(params)}.to_json
|
123
|
+
else
|
124
|
+
model.get(id).destroy
|
125
|
+
{}.to_json
|
126
|
+
end
|
127
|
+
end
|
128
|
+
end
|
129
|
+
|
130
|
+
# ERB template for models.js file
|
131
|
+
@@models_js_template = <<'END'
|
132
|
+
window.App = Ember.Application.create();
|
133
|
+
|
134
|
+
var attr = DS.attr;
|
135
|
+
<% FRONTEND_MODELS.each do |model_name, model| %>
|
136
|
+
App.<%= model_name %> = DS.Model.extend({
|
137
|
+
<%= model.delete_if do |property|
|
138
|
+
property[:name] == :id
|
139
|
+
end.map do |property|
|
140
|
+
"#{property[:name]}: attr()"
|
141
|
+
end.join(",\n ") %>
|
142
|
+
});
|
143
|
+
<% end %>
|
144
|
+
END
|
145
|
+
end
|
data/wurst.gemspec
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'wurst/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = "wurst"
|
8
|
+
spec.version = Wurst::VERSION
|
9
|
+
spec.authors = ["cdn64", "jesuistouriste", "Lukas_Skywalker"]
|
10
|
+
spec.email = ["info@zeilenwerk.ch"]
|
11
|
+
spec.description = "Does things."
|
12
|
+
spec.summary = "Does things."
|
13
|
+
spec.homepage = "http://zeilenwerk.ch"
|
14
|
+
spec.license = "MIT"
|
15
|
+
|
16
|
+
spec.files = `git ls-files`.split($/)
|
17
|
+
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
18
|
+
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
19
|
+
spec.require_paths = ['lib']
|
20
|
+
|
21
|
+
spec.add_development_dependency 'bundler', '~> 1.3'
|
22
|
+
spec.add_development_dependency 'rake', '~> 10'
|
23
|
+
spec.add_development_dependency 'tilt', '~> 1.4'
|
24
|
+
end
|
metadata
ADDED
@@ -0,0 +1,100 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: wurst
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- cdn64
|
8
|
+
- jesuistouriste
|
9
|
+
- Lukas_Skywalker
|
10
|
+
autorequire:
|
11
|
+
bindir: bin
|
12
|
+
cert_chain: []
|
13
|
+
date: 2014-12-16 00:00:00.000000000 Z
|
14
|
+
dependencies:
|
15
|
+
- !ruby/object:Gem::Dependency
|
16
|
+
name: bundler
|
17
|
+
requirement: !ruby/object:Gem::Requirement
|
18
|
+
requirements:
|
19
|
+
- - "~>"
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '1.3'
|
22
|
+
type: :development
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
requirements:
|
26
|
+
- - "~>"
|
27
|
+
- !ruby/object:Gem::Version
|
28
|
+
version: '1.3'
|
29
|
+
- !ruby/object:Gem::Dependency
|
30
|
+
name: rake
|
31
|
+
requirement: !ruby/object:Gem::Requirement
|
32
|
+
requirements:
|
33
|
+
- - "~>"
|
34
|
+
- !ruby/object:Gem::Version
|
35
|
+
version: '10'
|
36
|
+
type: :development
|
37
|
+
prerelease: false
|
38
|
+
version_requirements: !ruby/object:Gem::Requirement
|
39
|
+
requirements:
|
40
|
+
- - "~>"
|
41
|
+
- !ruby/object:Gem::Version
|
42
|
+
version: '10'
|
43
|
+
- !ruby/object:Gem::Dependency
|
44
|
+
name: tilt
|
45
|
+
requirement: !ruby/object:Gem::Requirement
|
46
|
+
requirements:
|
47
|
+
- - "~>"
|
48
|
+
- !ruby/object:Gem::Version
|
49
|
+
version: '1.4'
|
50
|
+
type: :development
|
51
|
+
prerelease: false
|
52
|
+
version_requirements: !ruby/object:Gem::Requirement
|
53
|
+
requirements:
|
54
|
+
- - "~>"
|
55
|
+
- !ruby/object:Gem::Version
|
56
|
+
version: '1.4'
|
57
|
+
description: Does things.
|
58
|
+
email:
|
59
|
+
- info@zeilenwerk.ch
|
60
|
+
executables: []
|
61
|
+
extensions: []
|
62
|
+
extra_rdoc_files: []
|
63
|
+
files:
|
64
|
+
- ".gitignore"
|
65
|
+
- Gemfile
|
66
|
+
- LICENSE.txt
|
67
|
+
- README.md
|
68
|
+
- Rakefile
|
69
|
+
- lib/assets/ember-data.js
|
70
|
+
- lib/assets/ember.js
|
71
|
+
- lib/assets/handlebars-v1.3.0.js
|
72
|
+
- lib/wurst.rb
|
73
|
+
- lib/wurst/resource.rb
|
74
|
+
- lib/wurst/version.rb
|
75
|
+
- wurst.gemspec
|
76
|
+
homepage: http://zeilenwerk.ch
|
77
|
+
licenses:
|
78
|
+
- MIT
|
79
|
+
metadata: {}
|
80
|
+
post_install_message:
|
81
|
+
rdoc_options: []
|
82
|
+
require_paths:
|
83
|
+
- lib
|
84
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
85
|
+
requirements:
|
86
|
+
- - ">="
|
87
|
+
- !ruby/object:Gem::Version
|
88
|
+
version: '0'
|
89
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
90
|
+
requirements:
|
91
|
+
- - ">="
|
92
|
+
- !ruby/object:Gem::Version
|
93
|
+
version: '0'
|
94
|
+
requirements: []
|
95
|
+
rubyforge_project:
|
96
|
+
rubygems_version: 2.4.3
|
97
|
+
signing_key:
|
98
|
+
specification_version: 4
|
99
|
+
summary: Does things.
|
100
|
+
test_files: []
|