menilite 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.
- checksums.yaml +4 -4
- data/lib/menilite.rb +6 -0
- data/lib/menilite/helper.rb +23 -0
- data/lib/menilite/model.rb +67 -17
- data/lib/menilite/privilege.rb +36 -0
- data/lib/menilite/router.rb +28 -8
- data/lib/menilite/version.rb +1 -1
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e96823093a09cbe81fe57e93acb586d480258fb6
|
4
|
+
data.tar.gz: 1c1698195f5afb071265a644f0b5f725d04fc1a3
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 16f926123ff653a696b6b1fea7477de86fa51fe2776708202886518c214cce4284f6e47a043df4d285804793c12dc2a262793ccb3f8f71be1157a6c98af464b0
|
7
|
+
data.tar.gz: a5190655a95e355561b5f15f55fe96bd7d654134aad86bf46678a115cccd52e537ee9fd205ec34565a0111f5077e76d28f76fe95baf561cb0c9a3ff9173dd014
|
data/lib/menilite.rb
CHANGED
@@ -1,5 +1,7 @@
|
|
1
1
|
require "menilite/version"
|
2
2
|
|
3
|
+
require "menilite/helper"
|
4
|
+
|
3
5
|
if RUBY_ENGINE == "opal"
|
4
6
|
require 'menilite/model'
|
5
7
|
require 'menilite/controller'
|
@@ -8,9 +10,13 @@ else
|
|
8
10
|
require 'opal'
|
9
11
|
require 'menilite/model'
|
10
12
|
require 'menilite/controller'
|
13
|
+
require 'menilite/privilege'
|
11
14
|
require 'menilite/router'
|
12
15
|
require 'menilite/server/activerecord_store'
|
13
16
|
|
14
17
|
Opal.append_path File.expand_path('../', __FILE__).untaint
|
15
18
|
Opal.append_path File.expand_path('../../vendor', __FILE__).untaint
|
16
19
|
end
|
20
|
+
|
21
|
+
module Menilite
|
22
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module Menilite
|
2
|
+
module Helper
|
3
|
+
def server?
|
4
|
+
!client?
|
5
|
+
end
|
6
|
+
|
7
|
+
def client?
|
8
|
+
RUBY_ENGINE == 'opal'
|
9
|
+
end
|
10
|
+
|
11
|
+
def if_server(&block)
|
12
|
+
block.call if server?
|
13
|
+
end
|
14
|
+
|
15
|
+
def if_client(&block)
|
16
|
+
block.call if client?
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
class << self
|
21
|
+
include Helper
|
22
|
+
end
|
23
|
+
end
|
data/lib/menilite/model.rb
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
require 'securerandom'
|
2
|
-
|
2
|
+
|
3
|
+
Menilite.if_client do
|
3
4
|
require 'browser/http'
|
4
5
|
require 'opal-parser'
|
5
6
|
end
|
@@ -13,15 +14,18 @@ end
|
|
13
14
|
|
14
15
|
module Menilite
|
15
16
|
class Model
|
17
|
+
include Menilite::Helper
|
18
|
+
|
16
19
|
attr_reader :fields
|
17
20
|
|
18
21
|
def initialize(fields = {})
|
19
22
|
self.class.init
|
20
23
|
|
21
|
-
if
|
24
|
+
if client?
|
22
25
|
fields = fields.clone
|
23
26
|
else
|
24
27
|
fields = fields.map{|k,v| [k.to_sym, v] }.to_h
|
28
|
+
fields.merge!(self.class.privilege_fields)
|
25
29
|
end
|
26
30
|
|
27
31
|
defaults = self.class.field_info.map{|k, d| [d.name, d.params[:default]] if d.params.has_key?(:default) }.compact.to_h
|
@@ -42,11 +46,11 @@ module Menilite
|
|
42
46
|
def update(data)
|
43
47
|
case data
|
44
48
|
when self.class
|
45
|
-
@fields.merge(data.fields)
|
49
|
+
@fields.merge!(data.fields)
|
46
50
|
when Hash
|
47
|
-
@fields.merge(data)
|
51
|
+
@fields.merge!(data.map{|k, v| resolve_references(k, v) }.to_h)
|
48
52
|
when String
|
49
|
-
@fields.merge(JSON.parse(json))
|
53
|
+
@fields.merge!(JSON.parse(json))
|
50
54
|
end
|
51
55
|
end
|
52
56
|
|
@@ -67,6 +71,8 @@ module Menilite
|
|
67
71
|
end
|
68
72
|
|
69
73
|
class << self
|
74
|
+
include Menilite::Helper
|
75
|
+
|
70
76
|
def init
|
71
77
|
if Model.subclasses.has_key?(self) && !Model.subclasses[self]
|
72
78
|
store.register(self)
|
@@ -97,9 +103,14 @@ module Menilite
|
|
97
103
|
store.delete(self)
|
98
104
|
end
|
99
105
|
|
100
|
-
def fetch(filter:
|
106
|
+
def fetch(filter: {}, order: nil)
|
101
107
|
self.init
|
102
|
-
filter = filter.map{|k, v| type_convert(k, v) }.to_h
|
108
|
+
filter = filter.map{|k, v| type_convert(k, v) }.to_h
|
109
|
+
|
110
|
+
if_server do
|
111
|
+
filter.merge!(privilege_filter)
|
112
|
+
end
|
113
|
+
|
103
114
|
store.fetch(self, filter: filter, order: order) do |list|
|
104
115
|
yield list if block_given?
|
105
116
|
list
|
@@ -135,7 +146,7 @@ module Menilite
|
|
135
146
|
def field(name, type = :string, params = {})
|
136
147
|
params.merge!(client: true, server: true)
|
137
148
|
|
138
|
-
if
|
149
|
+
if client?
|
139
150
|
return unless params[:client]
|
140
151
|
else
|
141
152
|
return unless params[:server]
|
@@ -178,7 +189,15 @@ module Menilite
|
|
178
189
|
|
179
190
|
def action(name, options = {}, &block)
|
180
191
|
action_info[name.to_s] = ActionInfo.new(name, block.parameters, options)
|
181
|
-
if
|
192
|
+
if server?
|
193
|
+
self.instance_eval do
|
194
|
+
if options[:class]
|
195
|
+
define_singleton_method(name, block)
|
196
|
+
else
|
197
|
+
define_method(name, block)
|
198
|
+
end
|
199
|
+
end
|
200
|
+
else
|
182
201
|
method = Proc.new do |model, *args, &callback| # todo: should adopt keyword parameters
|
183
202
|
action_url = options[:on_create] || options[:class] ? "api/#{self}/#{name}" : "api/#{self}/#{model.id}/#{name}"
|
184
203
|
post_data = {}
|
@@ -201,14 +220,6 @@ module Menilite
|
|
201
220
|
define_method(name) {|*args, &callback| method.call(self, *args, &callback) }
|
202
221
|
end
|
203
222
|
end
|
204
|
-
else
|
205
|
-
self.instance_eval do
|
206
|
-
if options[:class]
|
207
|
-
define_singleton_method(name, block)
|
208
|
-
else
|
209
|
-
define_method(name, block)
|
210
|
-
end
|
211
|
-
end
|
212
223
|
end
|
213
224
|
end
|
214
225
|
|
@@ -233,6 +244,37 @@ module Menilite
|
|
233
244
|
self.init
|
234
245
|
store.max(self, field_name)
|
235
246
|
end
|
247
|
+
|
248
|
+
def permit(privileges)
|
249
|
+
Menilite.if_server do
|
250
|
+
case privileges
|
251
|
+
when Array
|
252
|
+
self.privileges.push(*privileges)
|
253
|
+
when Symbol, String
|
254
|
+
self.privileges << privileges
|
255
|
+
end
|
256
|
+
end
|
257
|
+
end
|
258
|
+
|
259
|
+
Menilite.if_server do
|
260
|
+
def privileges
|
261
|
+
@privileges ||= []
|
262
|
+
end
|
263
|
+
|
264
|
+
def privilege_filter
|
265
|
+
return {} unless PrivilegeService.current
|
266
|
+
PrivilegeService.current.get_privileges(self.privileges).each_with_object({}) do |priv, filter|
|
267
|
+
filter.merge!(priv.filter)
|
268
|
+
end
|
269
|
+
end
|
270
|
+
|
271
|
+
def privilege_fields
|
272
|
+
return {} unless PrivilegeService.current
|
273
|
+
PrivilegeService.current.get_privileges(self.privileges).each_with_object({}) do |priv, fields|
|
274
|
+
fields.merge!(priv.fields)
|
275
|
+
end
|
276
|
+
end
|
277
|
+
end
|
236
278
|
end
|
237
279
|
|
238
280
|
def type_validator(type)
|
@@ -278,5 +320,13 @@ module Menilite
|
|
278
320
|
@listeners[event][field_name] ||= []
|
279
321
|
@listeners[event][field_name] << block
|
280
322
|
end
|
323
|
+
|
324
|
+
def resolve_references(key, value)
|
325
|
+
if self.class.field_info.has_key?(key.to_s) && self.class.field_info[key.to_s].type == :reference
|
326
|
+
["#{key}_id".to_sym, value.id]
|
327
|
+
else
|
328
|
+
[key, value]
|
329
|
+
end
|
330
|
+
end
|
281
331
|
end
|
282
332
|
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
module Menilite
|
2
|
+
class Privilege
|
3
|
+
def key
|
4
|
+
raise NotImplementedError.new "Menilite::Privilege#key must be overriden"
|
5
|
+
end
|
6
|
+
|
7
|
+
def filter
|
8
|
+
{}
|
9
|
+
end
|
10
|
+
|
11
|
+
def fields
|
12
|
+
{}
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
class PrivilegeService
|
17
|
+
attr_reader :privileges
|
18
|
+
|
19
|
+
def initialize
|
20
|
+
@privileges = []
|
21
|
+
end
|
22
|
+
|
23
|
+
def self.init
|
24
|
+
instance = PrivilegeService.new
|
25
|
+
Thread.current.thread_variable_set(:previlege_service, instance)
|
26
|
+
end
|
27
|
+
|
28
|
+
def self.current
|
29
|
+
Thread.current.thread_variable_get(:previlege_service)
|
30
|
+
end
|
31
|
+
|
32
|
+
def get_privileges(names)
|
33
|
+
names.map{|key| @privileges.find{|p| p.key == key } }.compact
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
data/lib/menilite/router.rb
CHANGED
@@ -3,11 +3,11 @@ require 'sinatra/json'
|
|
3
3
|
require 'json'
|
4
4
|
|
5
5
|
class Class
|
6
|
-
def subclass_of?(klass)
|
7
|
-
raise ArgumentError.new unless klass.is_a?(
|
6
|
+
def subclass_of?(klass, include_self = true)
|
7
|
+
raise ArgumentError.new unless klass.is_a?(Module)
|
8
8
|
|
9
9
|
if self == klass
|
10
|
-
|
10
|
+
include_self
|
11
11
|
else
|
12
12
|
if self.superclass
|
13
13
|
self.superclass.subclass_of?(klass)
|
@@ -20,15 +20,30 @@ end
|
|
20
20
|
|
21
21
|
module Menilite
|
22
22
|
class Router
|
23
|
-
def initialize
|
24
|
-
@classes =
|
23
|
+
def initialize
|
24
|
+
@classes = []
|
25
|
+
|
26
|
+
ObjectSpace.each_object(Class) do |klass|
|
27
|
+
@classes << klass if klass.subclass_of?(Menilite::Model, false)
|
28
|
+
@classes << klass if klass.subclass_of?(Menilite::Controller, false)
|
29
|
+
@classes << klass if klass.subclass_of?(Menilite::Privilege, false)
|
30
|
+
end
|
25
31
|
end
|
26
32
|
|
27
33
|
def before_action_handlers(klass, action)
|
28
34
|
@handlers ||= @classes.select{|c| c.subclass_of?(Menilite::Controller) }.map{|c| c.before_action_handlers }.flatten
|
29
|
-
|
30
|
-
|
31
|
-
|
35
|
+
|
36
|
+
handlers = @handlers.select do |c|
|
37
|
+
next true unless c[:options].has_key?(:include)
|
38
|
+
[c[:options][:include]].flatten.any? do |includes|
|
39
|
+
(classname, _, name) = includes.to_s.partition(?#)
|
40
|
+
(classname == klass.name) && (name.empty? || name == action.to_s)
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
handlers.reject do |c|
|
45
|
+
[c[:options][:exclude]].flatten.any? do |exclude|
|
46
|
+
(classname, _, name) = exclude.to_s.partition(?#)
|
32
47
|
(classname == klass.name) && (name.empty? || name == action.to_s)
|
33
48
|
end
|
34
49
|
end
|
@@ -46,6 +61,7 @@ module Menilite
|
|
46
61
|
klass.init
|
47
62
|
resource_name = klass.name
|
48
63
|
get "/#{resource_name}" do
|
64
|
+
PrivilegeService.init
|
49
65
|
router.before_action_handlers(klass, 'index').each {|h| self.instance_eval(&h[:proc]) }
|
50
66
|
order = params.delete('order')&.split(?,)
|
51
67
|
data = klass.fetch(filter: params, order: order)
|
@@ -53,11 +69,13 @@ module Menilite
|
|
53
69
|
end
|
54
70
|
|
55
71
|
get "/#{resource_name}/:id" do
|
72
|
+
PrivilegeService.init
|
56
73
|
router.before_action_handlers(klass, 'get').each {|h| self.instance_eval(&h[:proc]) }
|
57
74
|
json klass[params[:id]].to_h
|
58
75
|
end
|
59
76
|
|
60
77
|
post "/#{resource_name}" do
|
78
|
+
PrivilegeService.init
|
61
79
|
router.before_action_handlers(klass, 'post').each {|h| self.instance_eval(&h[:proc]) }
|
62
80
|
data = JSON.parse(request.body.read)
|
63
81
|
results = data.map do |model|
|
@@ -73,6 +91,7 @@ module Menilite
|
|
73
91
|
path = action.options[:on_create] || action.options[:class] ? "/#{resource_name}/#{action.name}" : "/#{resource_name}/#{action.name}/:id"
|
74
92
|
|
75
93
|
post path do
|
94
|
+
PrivilegeService.init
|
76
95
|
router.before_action_handlers(klass, action.name).each {|h| self.instance_eval(&h[:proc]) }
|
77
96
|
data = JSON.parse(request.body.read)
|
78
97
|
result = if action.options[:on_create]
|
@@ -89,6 +108,7 @@ module Menilite
|
|
89
108
|
klass.action_info.each do |name, action|
|
90
109
|
path = klass.respond_to?(:namespace) ? "/#{klass.namespace}/#{action.name}" : "/#{action.name}"
|
91
110
|
post path do
|
111
|
+
PrivilegeService.init
|
92
112
|
router.before_action_handlers(klass, action.name).each {|h| self.instance_eval(&h[:proc]) }
|
93
113
|
data = JSON.parse(request.body.read)
|
94
114
|
controller = klass.new(session, settings)
|
data/lib/menilite/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: menilite
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- youchan
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-
|
11
|
+
date: 2016-09-13 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -85,7 +85,9 @@ files:
|
|
85
85
|
- lib/menilite.rb
|
86
86
|
- lib/menilite/client/store.rb
|
87
87
|
- lib/menilite/controller.rb
|
88
|
+
- lib/menilite/helper.rb
|
88
89
|
- lib/menilite/model.rb
|
90
|
+
- lib/menilite/privilege.rb
|
89
91
|
- lib/menilite/router.rb
|
90
92
|
- lib/menilite/server/activerecord_store.rb
|
91
93
|
- lib/menilite/server/store.rb
|