engine2 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/Gemfile +2 -0
- data/Rakefile +138 -0
- data/conf/message.yaml +93 -0
- data/conf/message_pl.yaml +93 -0
- data/engine2.gemspec +34 -0
- data/lib/engine2.rb +34 -0
- data/lib/engine2/action.rb +217 -0
- data/lib/engine2/core.rb +572 -0
- data/lib/engine2/handler.rb +134 -0
- data/lib/engine2/meta.rb +969 -0
- data/lib/engine2/meta/decode_meta.rb +110 -0
- data/lib/engine2/meta/delete_meta.rb +73 -0
- data/lib/engine2/meta/form_meta.rb +144 -0
- data/lib/engine2/meta/infra_meta.rb +292 -0
- data/lib/engine2/meta/link_meta.rb +133 -0
- data/lib/engine2/meta/list_meta.rb +284 -0
- data/lib/engine2/meta/save_meta.rb +63 -0
- data/lib/engine2/meta/view_meta.rb +22 -0
- data/lib/engine2/model.rb +390 -0
- data/lib/engine2/models/Files.rb +38 -0
- data/lib/engine2/models/UserInfo.rb +24 -0
- data/lib/engine2/post_bootstrap.rb +83 -0
- data/lib/engine2/pre_bootstrap.rb +27 -0
- data/lib/engine2/scheme.rb +202 -0
- data/lib/engine2/templates.rb +229 -0
- data/lib/engine2/type_info.rb +342 -0
- data/lib/engine2/version.rb +9 -0
- data/public/assets/javascripts.js +13 -0
- data/public/assets/styles.css +4 -0
- data/public/css/angular-motion.css +1022 -0
- data/public/css/angular-ui-tree.min.css +1 -0
- data/public/css/app.css +196 -0
- data/public/css/bootstrap-additions.css +1560 -0
- data/public/css/bootstrap.min.css +11 -0
- data/public/css/font-awesome.min.css +4 -0
- data/public/favicon.ico +0 -0
- data/public/fonts/FontAwesome.otf +0 -0
- data/public/fonts/fontawesome-webfont.eot +0 -0
- data/public/fonts/fontawesome-webfont.svg +655 -0
- data/public/fonts/fontawesome-webfont.ttf +0 -0
- data/public/fonts/fontawesome-webfont.woff +0 -0
- data/public/fonts/fontawesome-webfont.woff2 +0 -0
- data/public/fonts/glyphicons-halflings-regular.eot +0 -0
- data/public/fonts/glyphicons-halflings-regular.svg +288 -0
- data/public/fonts/glyphicons-halflings-regular.ttf +0 -0
- data/public/fonts/glyphicons-halflings-regular.woff +0 -0
- data/public/fonts/glyphicons-halflings-regular.woff2 +0 -0
- data/public/images/file.png +0 -0
- data/public/images/folder-closed.png +0 -0
- data/public/images/folder.png +0 -0
- data/public/images/node-closed-2.png +0 -0
- data/public/images/node-closed-light.png +0 -0
- data/public/images/node-closed.png +0 -0
- data/public/images/node-opened-2.png +0 -0
- data/public/images/node-opened-light.png +0 -0
- data/public/images/node-opened.png +0 -0
- data/public/img/ajax-loader-dark.gif +0 -0
- data/public/img/ajax-loader-light.gif +0 -0
- data/public/img/ajax-loader.gif +0 -0
- data/public/js/angular-animate.js +4115 -0
- data/public/js/angular-cookies.js +322 -0
- data/public/js/angular-local-storage.js +455 -0
- data/public/js/angular-route.js +1022 -0
- data/public/js/angular-sanitize.js +717 -0
- data/public/js/angular-strap.js +4339 -0
- data/public/js/angular-strap.tpl.js +43 -0
- data/public/js/angular-ui-tree.js +1569 -0
- data/public/js/angular.js +30714 -0
- data/public/js/i18n/angular-locale_pl.js +115 -0
- data/public/js/lodash.custom.min.js +97 -0
- data/public/js/ng-file-upload-shim.min.js +2 -0
- data/public/js/ng-file-upload.min.js +3 -0
- data/views/app.coffee +3 -0
- data/views/engine2.coffee +557 -0
- data/views/engine2actions.coffee +849 -0
- data/views/engine2templates.coffee +0 -0
- data/views/fields/blob.slim +22 -0
- data/views/fields/bs_select.slim +10 -0
- data/views/fields/bsselect_picker.slim +18 -0
- data/views/fields/bsselect_picker_opt.slim +22 -0
- data/views/fields/checkbox.slim +11 -0
- data/views/fields/checkbox_buttons.slim +6 -0
- data/views/fields/checkbox_buttons_opt.slim +8 -0
- data/views/fields/currency.slim +10 -0
- data/views/fields/date.slim +21 -0
- data/views/fields/date_range.slim +44 -0
- data/views/fields/date_time.slim +42 -0
- data/views/fields/datetime.slim +42 -0
- data/views/fields/decimal.slim +11 -0
- data/views/fields/decimal_date.slim +22 -0
- data/views/fields/decimal_time.slim +26 -0
- data/views/fields/email.slim +13 -0
- data/views/fields/file_store.slim +61 -0
- data/views/fields/input_text.slim +14 -0
- data/views/fields/integer.slim +11 -0
- data/views/fields/list_bsselect.slim +18 -0
- data/views/fields/list_bsselect_opt.slim +21 -0
- data/views/fields/list_buttons.slim +3 -0
- data/views/fields/list_buttons_opt.slim +5 -0
- data/views/fields/list_select.slim +11 -0
- data/views/fields/list_select_opt.slim +15 -0
- data/views/fields/password.slim +14 -0
- data/views/fields/radio_checkbox.slim +10 -0
- data/views/fields/scaffold.slim +2 -0
- data/views/fields/scaffold_picker.slim +20 -0
- data/views/fields/select_picker.slim +12 -0
- data/views/fields/select_picker_opt.slim +16 -0
- data/views/fields/text_area.slim +10 -0
- data/views/fields/time.slim +22 -0
- data/views/fields/typeahead_picker.slim +25 -0
- data/views/index.slim +44 -0
- data/views/infra/index.slim +5 -0
- data/views/infra/inspect.slim +81 -0
- data/views/modals/close_m.slim +15 -0
- data/views/modals/confirm_m.slim +19 -0
- data/views/modals/empty_m.slim +12 -0
- data/views/modals/menu_m.slim +13 -0
- data/views/modals/yes_no_m.slim +19 -0
- data/views/panels/menu_m.slim +9 -0
- data/views/scaffold/confirm.slim +3 -0
- data/views/scaffold/fields.slim +10 -0
- data/views/scaffold/form.slim +11 -0
- data/views/scaffold/list.slim +42 -0
- data/views/scaffold/message.slim +3 -0
- data/views/scaffold/search.slim +20 -0
- data/views/scaffold/view.slim +18 -0
- data/views/search_fields/bsmselect_picker.slim +25 -0
- data/views/search_fields/bsselect_picker.slim +24 -0
- data/views/search_fields/checkbox.slim +11 -0
- data/views/search_fields/checkbox2.slim +14 -0
- data/views/search_fields/checkbox_buttons.slim +10 -0
- data/views/search_fields/date_range.slim +46 -0
- data/views/search_fields/decimal_date_range.slim +47 -0
- data/views/search_fields/input_text.slim +18 -0
- data/views/search_fields/integer.slim +18 -0
- data/views/search_fields/integer_range.slim +27 -0
- data/views/search_fields/list_bsmselect.slim +24 -0
- data/views/search_fields/list_bsselect.slim +22 -0
- data/views/search_fields/list_buttons.slim +8 -0
- data/views/search_fields/list_select.slim +17 -0
- data/views/search_fields/scaffold_picker.slim +19 -0
- data/views/search_fields/select_picker.slim +17 -0
- data/views/search_fields/typeahead_picker.slim +25 -0
- metadata +327 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: bc80e81843c9720bf34223f646d6f2bb747e33d0
|
4
|
+
data.tar.gz: d4e47ca39797d61936f7322d3e181db9ba27486b
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 6f2c82ff8b62c2a45745afb59e8095ac27b370d64a2f4ada1c294e403fb456573f719a7de636bc281ec8405190c63029e7afcd48df3f86db287ffcc5848852ee
|
7
|
+
data.tar.gz: f64cf30cacc5c8de8a8f3370b62bc50f9b30b94284da7354bfdf5a29135e188acef864ad71f50782c49723cf5f5b781ebd3cbcb06ab3b32fa4438d9f670c5d97
|
data/Gemfile
ADDED
data/Rakefile
ADDED
@@ -0,0 +1,138 @@
|
|
1
|
+
DIR = Dir.pwd
|
2
|
+
VIEWS = DIR + "/views"
|
3
|
+
PUBLIC = DIR + "/public"
|
4
|
+
COFFEE_FILES = ["app", "engine2", "engine2actions"]
|
5
|
+
|
6
|
+
desc "Compile JS"
|
7
|
+
task :compile_js do
|
8
|
+
require 'coffee-script'
|
9
|
+
require 'uglifier'
|
10
|
+
COFFEE_FILES.each do |cf|
|
11
|
+
out = CoffeeScript.compile(open("#{VIEWS}/#{cf}.coffee", "r:UTF-8"))
|
12
|
+
out = Uglifier.new(
|
13
|
+
# mangle: false
|
14
|
+
mangle: {except: %w|
|
15
|
+
$injector
|
16
|
+
$window
|
17
|
+
$rootScope
|
18
|
+
$scope
|
19
|
+
$compile
|
20
|
+
$routeProvider
|
21
|
+
$compileProvider
|
22
|
+
$locationProvider
|
23
|
+
$location
|
24
|
+
$route
|
25
|
+
$parse
|
26
|
+
$templateCache
|
27
|
+
$resource
|
28
|
+
$attrs
|
29
|
+
$element
|
30
|
+
$http
|
31
|
+
$cookies
|
32
|
+
$sanitize
|
33
|
+
$timeout
|
34
|
+
$httpProvider
|
35
|
+
$logProvider
|
36
|
+
$q
|
37
|
+
$upload
|
38
|
+
$dropdown
|
39
|
+
$modal
|
40
|
+
E2
|
41
|
+
E2Snippets
|
42
|
+
E2Actions
|
43
|
+
E2ActionsX
|
44
|
+
$e2Scaffold
|
45
|
+
$e2Modal
|
46
|
+
localStorageServiceProvider
|
47
|
+
localStorageService
|
48
|
+
$dateParser
|
49
|
+
$dateFormatter
|
50
|
+
$filter
|
51
|
+
e2HttpInterceptor
|
52
|
+
|}
|
53
|
+
).compile(out)
|
54
|
+
open("#{PUBLIC}/js/#{cf}.js", "w") << out
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
desc "Compile SLIM"
|
59
|
+
task :compile_slim do
|
60
|
+
require 'slim'
|
61
|
+
view_dirs = ["fields", "scaffold", "search_fields", "modals"]
|
62
|
+
slims = view_dirs.each.map do |view_dir|
|
63
|
+
Dir["views/#{view_dir}/*.slim"].map do |slim_file|
|
64
|
+
slim = Slim::Template.new(slim_file).render.gsub('"', '\"')
|
65
|
+
tpl_name = slim_file.sub("views/", "").sub(".slim", "")
|
66
|
+
"$templateCache.put('#{tpl_name}', \"#{slim}\");"
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
open("#{PUBLIC}/js/engine2templates.js", "wb") << <<-EOF
|
71
|
+
angular.module('Engine2').run(['$templateCache', function($templateCache) {
|
72
|
+
#{slims.join("\n")}
|
73
|
+
}]);
|
74
|
+
EOF
|
75
|
+
end
|
76
|
+
|
77
|
+
desc "Compile"
|
78
|
+
task :compile => [:compile_js, :compile_slim] do
|
79
|
+
end
|
80
|
+
|
81
|
+
desc "Clean"
|
82
|
+
task :clean do
|
83
|
+
(COFFEE_FILES + ["engine2templates"]).each do |js|
|
84
|
+
File.delete "#{PUBLIC}/js/#{js}.js"
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
desc "Assets Js"
|
89
|
+
task :assets_js do
|
90
|
+
require 'uglifier'
|
91
|
+
# jquery-builder.cmd -m -v 2.0.3 -e ajax,deprecated,effects,offset > jquery-custom.min.js
|
92
|
+
# lodash category=array,collection,object,seq,lang plus=template
|
93
|
+
|
94
|
+
js_files = %w[
|
95
|
+
ng-file-upload-shim.min.js
|
96
|
+
angular.js
|
97
|
+
i18n/angular-locale_pl.js
|
98
|
+
angular-route.js
|
99
|
+
angular-sanitize.js
|
100
|
+
angular-animate.js
|
101
|
+
angular-cookies.js
|
102
|
+
angular-strap.js
|
103
|
+
angular-strap.tpl.js
|
104
|
+
ng-file-upload.min.js
|
105
|
+
angular-ui-tree.js
|
106
|
+
angular-local-storage.js
|
107
|
+
lodash.custom.min.js
|
108
|
+
]
|
109
|
+
|
110
|
+
out = js_files.map{|js| open("#{PUBLIC}/js/#{js}", "r:UTF-8").read}.join("")
|
111
|
+
|
112
|
+
out = Uglifier.new(output: {comments: :none}, mangle: true).compile(out)
|
113
|
+
|
114
|
+
open("#{PUBLIC}/assets/javascripts.js", "wb") << out
|
115
|
+
end
|
116
|
+
|
117
|
+
desc "Assets Css"
|
118
|
+
task :assets_css do
|
119
|
+
require 'yui/compressor'
|
120
|
+
|
121
|
+
css_files = %w[
|
122
|
+
bootstrap-additions.css
|
123
|
+
angular-motion.css
|
124
|
+
angular-ui-tree.min.css
|
125
|
+
font-awesome.min.css
|
126
|
+
]
|
127
|
+
|
128
|
+
out = css_files.map{|css|open("#{PUBLIC}/css/#{css}", "r:UTF-8").read}.join("")
|
129
|
+
|
130
|
+
out = YUI::CssCompressor.new(java: "#{ENV['JAVA_HOME']}/bin/java").compress(out)
|
131
|
+
open("#{PUBLIC}/assets/styles.css", "wb") << out
|
132
|
+
|
133
|
+
end
|
134
|
+
|
135
|
+
desc "Assets"
|
136
|
+
task :assets => [:assets_js, :assets_css] do
|
137
|
+
# File.delete *Dir["#{Dir.pwd}/public/assets/*"]
|
138
|
+
end
|
data/conf/message.yaml
ADDED
@@ -0,0 +1,93 @@
|
|
1
|
+
:engine2_resource_loaded: true
|
2
|
+
:default_date_format: yyyy-MM-dd
|
3
|
+
:default_date_short_format: yy-MM-dd
|
4
|
+
:default_date_model_format: yyyy-MM-dd
|
5
|
+
:default_date_model_short_format: yy-MM-dd
|
6
|
+
:default_time_format: HH:mm:ss
|
7
|
+
:default_time_model_format: HH:mm:ss
|
8
|
+
|
9
|
+
:no_entry: Entry doesnt exist
|
10
|
+
:decode_selected: selected
|
11
|
+
|
12
|
+
:name: Name
|
13
|
+
:mime: Mime
|
14
|
+
:owner: Owner
|
15
|
+
:model: Model
|
16
|
+
:field: Field
|
17
|
+
:updated: Updated
|
18
|
+
|
19
|
+
:ok: Ok
|
20
|
+
:link: Attach
|
21
|
+
:choose: Choose
|
22
|
+
:view: Details
|
23
|
+
:search_toggle: Search
|
24
|
+
:link_list: Attach
|
25
|
+
:create: Create
|
26
|
+
:modify: Modify
|
27
|
+
:search: Search
|
28
|
+
:refresh: Refresh
|
29
|
+
:default_order: Default order
|
30
|
+
:select_toggle: Select
|
31
|
+
:confirm_delete: Delete
|
32
|
+
:confirm_delete_title: <span class='glyphicon glyphicon-trash'></span> Confirmation
|
33
|
+
:confirm_bulk_delete: Delete selected
|
34
|
+
:delete_restricted: Restricted relations
|
35
|
+
:confirm_bulk_delete_title: <span class='glyphicon glyphicon-trash'></span> Confirmation
|
36
|
+
:confirm_unlink: Detach
|
37
|
+
:confirm_unlink_title: <span class='glyphicon glyphicon-minus'></span> Confirmation
|
38
|
+
:confirm_bulk_unlink: Detach selected
|
39
|
+
:confirm_bulk_unlink_title: <span class='glyphicon glyphicon-minus'></span> Confirmation
|
40
|
+
:debug_info: Debug info
|
41
|
+
:show_meta: Show metainfo
|
42
|
+
# :meta: Meta
|
43
|
+
:view_title: <span class='glyphicon glyphicon-book'></span> Details
|
44
|
+
:create_title: <span class='glyphicon glyphicon-pencil'></span> Create
|
45
|
+
:modify_title: <span class='glyphicon glyphicon-pencil'></span> Modify
|
46
|
+
:delete_title: <span class='glyphicon glyphicon-trash'></span> Delete
|
47
|
+
:link_title: <span class='glyphicon glyphicon-paperclip'></span> Attach
|
48
|
+
:delete_question: Delete entry ?
|
49
|
+
:unlink_question: Detach entry ?
|
50
|
+
:confirmation: Confirmation
|
51
|
+
:save: Save
|
52
|
+
:approve: Approve
|
53
|
+
:cancel: Cancel
|
54
|
+
|
55
|
+
:inspect_modal: Inspect
|
56
|
+
|
57
|
+
:login_form: Login
|
58
|
+
:user_name: User
|
59
|
+
:password: Password
|
60
|
+
:login: Login
|
61
|
+
:login_title: <span class='glyphicon glyphicon-log-in'></span> Login
|
62
|
+
|
63
|
+
:logout_form: Logout
|
64
|
+
:logout_title: <span class='glyphicon glyphicon-log-out'></span> Logout
|
65
|
+
:logout_message: Logout ?
|
66
|
+
|
67
|
+
:user_required: user name required
|
68
|
+
:password_required: password required
|
69
|
+
:password_invalid: Password doesnt match
|
70
|
+
|
71
|
+
:welcome: Welcome
|
72
|
+
|
73
|
+
:non_nullable: Non nullable
|
74
|
+
:field_required: Field required
|
75
|
+
:wrong_boolean_value: Bad boolean value
|
76
|
+
:value_exceeds_maximum_length: Length exceeded
|
77
|
+
:invalid_date_format: Incorrect date format
|
78
|
+
:invalid_time_format: Incorrect time format
|
79
|
+
:invalid_datetime_format: Incorrect date/time format
|
80
|
+
:value_from_gt_to: Value from > to
|
81
|
+
:invalid_number_value: Incorrect number value
|
82
|
+
:number_negative: Negative value
|
83
|
+
:invalid_list_value: Incorrect value for list
|
84
|
+
:invalid_decimal_value: Incorrect decimal value
|
85
|
+
:invalid_currency_value: Incorrect currency value
|
86
|
+
:required_unique_value: Require unique value
|
87
|
+
:invalid_email_format: Incorrect email format
|
88
|
+
:invalid_format: Incorrect format
|
89
|
+
|
90
|
+
:access_forbidden: Access forbidden
|
91
|
+
:access_unauthorized: Access unauthorized
|
92
|
+
:access_not_found: Not found
|
93
|
+
:access_method_not_allowed: Metod not allowed
|
@@ -0,0 +1,93 @@
|
|
1
|
+
:engine2_resource_loaded: true
|
2
|
+
:default_date_format: yyyy-MM-dd
|
3
|
+
:default_date_short_format: yy-MM-dd
|
4
|
+
:default_date_model_format: yyyy-MM-dd
|
5
|
+
:default_date_model_short_format: yy-MM-dd
|
6
|
+
:default_time_format: HH:mm:ss
|
7
|
+
:default_time_model_format: HH:mm:ss
|
8
|
+
|
9
|
+
:no_entry: Wpis nie istnieje
|
10
|
+
:decode_selected: wybranych
|
11
|
+
|
12
|
+
:name: Nazwa
|
13
|
+
:mime: Mime
|
14
|
+
:owner: Właściciel
|
15
|
+
:model: Model
|
16
|
+
:field: Pole
|
17
|
+
:updated: Aktualizowany
|
18
|
+
|
19
|
+
:ok: Ok
|
20
|
+
:link: Dołącz
|
21
|
+
:choose: Wybierz
|
22
|
+
:view: Szczegóły
|
23
|
+
:search_toggle: Szukaj
|
24
|
+
:link_list: Dołącz
|
25
|
+
:create: Utwórz
|
26
|
+
:modify: Modyfikuj
|
27
|
+
:search: Szukaj
|
28
|
+
:refresh: Odśwież
|
29
|
+
:default_order: Sortowanie domyślne
|
30
|
+
:select_toggle: Zaznacz
|
31
|
+
:confirm_delete: Usuń
|
32
|
+
:confirm_delete_title: <span class='glyphicon glyphicon-trash'></span> Potwierdzenie
|
33
|
+
:confirm_bulk_delete: Usuń zaznacznone
|
34
|
+
:delete_restricted: Blokujące relacje
|
35
|
+
:confirm_bulk_delete_title: <span class='glyphicon glyphicon-trash'></span> Potwierdzenie
|
36
|
+
:confirm_unlink: Odłącz
|
37
|
+
:confirm_unlink_title: <span class='glyphicon glyphicon-minus'></span> Potwierdzenie
|
38
|
+
:confirm_bulk_unlink: Odłącz zaznacznone
|
39
|
+
:confirm_bulk_unlink_title: <span class='glyphicon glyphicon-minus'></span> Potwierdzenie
|
40
|
+
:debug_info: Debug info
|
41
|
+
:show_meta: Pokaż metainformacje
|
42
|
+
# :meta: Meta
|
43
|
+
:view_title: <span class='glyphicon glyphicon-book'></span> Szczegóły
|
44
|
+
:create_title: <span class='glyphicon glyphicon-pencil'></span> Utwórz
|
45
|
+
:modify_title: <span class='glyphicon glyphicon-pencil'></span> Modyfikuj
|
46
|
+
:delete_title: <span class='glyphicon glyphicon-trash'></span> Usuń
|
47
|
+
:link_title: <span class='glyphicon glyphicon-paperclip'></span> Dołącz
|
48
|
+
:delete_question: Usunąć wpis ?
|
49
|
+
:unlink_question: Odłączyć wpis ?
|
50
|
+
:confirmation: Potwierdzenie
|
51
|
+
:save: Zapisz
|
52
|
+
:approve: Zatwierdź
|
53
|
+
:cancel: Anuluj
|
54
|
+
|
55
|
+
:inspect_modal: Inspekcja
|
56
|
+
|
57
|
+
:login_form: Zaloguj
|
58
|
+
:user_name: Użytkownik
|
59
|
+
:password: Hasło
|
60
|
+
:login: Zaloguj
|
61
|
+
:login_title: <span class='glyphicon glyphicon-log-in'></span> Logowanie
|
62
|
+
|
63
|
+
:logout_form: Wyloguj
|
64
|
+
:logout_title: <span class='glyphicon glyphicon-log-out'></span> Wyloguj
|
65
|
+
:logout_message: Wylogować ?
|
66
|
+
|
67
|
+
:user_required: Podaj nazwę użytkownika
|
68
|
+
:password_required: Podaj hasło
|
69
|
+
:password_invalid: Błędne hasło
|
70
|
+
|
71
|
+
:welcome: Witaj
|
72
|
+
|
73
|
+
:non_nullable: Niemożliwe ustawienie wartości pustej
|
74
|
+
:field_required: Pole wymagane
|
75
|
+
:wrong_boolean_value: Zła wartość dla boolean
|
76
|
+
:value_exceeds_maximum_length: Wartość przekracza dopuszczalną długość
|
77
|
+
:invalid_date_format: Niepoprawny format daty
|
78
|
+
:invalid_time_format: Niepoprawny format czasu
|
79
|
+
:invalid_datetime_format: Niepoprawny format daty/czasu
|
80
|
+
:value_from_gt_to: Wartość od > do
|
81
|
+
:invalid_number_value: Niepoprawna wartość liczbowa
|
82
|
+
:number_negative: Wartość ujemna
|
83
|
+
:invalid_list_value: Niepoprawna wartość dla listy
|
84
|
+
:invalid_decimal_value: Niepoprawna wartość decymalna
|
85
|
+
:invalid_currency_value: Niepoprawna wartość kwoty
|
86
|
+
:required_unique_value: Wymagana unikatowa wartość
|
87
|
+
:invalid_email_format: Niepoprawny format email
|
88
|
+
:invalid_format: Niepoprawny format
|
89
|
+
|
90
|
+
:access_forbidden: Dostęp zabroniony
|
91
|
+
:access_unauthorized: Dostęp nieautoryzowany
|
92
|
+
:access_not_found: Nie znaleziono
|
93
|
+
:access_method_not_allowed: Metoda niedozwolona
|
data/engine2.gemspec
ADDED
@@ -0,0 +1,34 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
|
3
|
+
require File.expand_path("../lib/engine2/version", __FILE__)
|
4
|
+
|
5
|
+
Gem::Specification.new do |spec|
|
6
|
+
spec.name = "engine2"
|
7
|
+
spec.version = Engine2::VERSION
|
8
|
+
spec.authors = ["lopex"]
|
9
|
+
spec.email = ["lopx@gazeta.pl"]
|
10
|
+
|
11
|
+
spec.summary = "Tree based routing framework with scaffolding support"
|
12
|
+
spec.description = spec.summary
|
13
|
+
spec.homepage = "http://none.for.now"
|
14
|
+
spec.license = 'MIT'
|
15
|
+
|
16
|
+
spec.files = `git ls-files`.split($INPUT_RECORD_SEPARATOR)
|
17
|
+
spec.require_paths = ["lib"]
|
18
|
+
|
19
|
+
spec.add_dependency "sequel", '~> 4'
|
20
|
+
if defined? JRUBY_VERSION
|
21
|
+
spec.add_dependency 'jdbc-sqlite3', '~> 3.8'
|
22
|
+
else
|
23
|
+
spec.add_dependency 'sqlite3', '~> 1.3'
|
24
|
+
end
|
25
|
+
spec.add_dependency "sinatra", '~> 1.4'
|
26
|
+
spec.add_dependency 'slim', '~> 3.0'
|
27
|
+
spec.add_dependency "execjs", '~> 2.6'
|
28
|
+
spec.add_dependency 'coffee-script', '~> 2.4'
|
29
|
+
|
30
|
+
spec.add_development_dependency "bundler", "~> 1.11"
|
31
|
+
spec.add_development_dependency "rake", "~> 10.0"
|
32
|
+
spec.add_development_dependency 'uglifier', '~> 3.0'
|
33
|
+
spec.add_development_dependency 'yui-compressor', '~> 0.12'
|
34
|
+
end
|
data/lib/engine2.rb
ADDED
@@ -0,0 +1,34 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
|
3
|
+
require 'yaml'
|
4
|
+
require 'logger'
|
5
|
+
require 'sequel'
|
6
|
+
require 'sinatra'
|
7
|
+
require 'json'
|
8
|
+
require 'slim'
|
9
|
+
require 'tilt/coffee'
|
10
|
+
require 'engine2/version'
|
11
|
+
|
12
|
+
%w[
|
13
|
+
core.rb
|
14
|
+
handler.rb
|
15
|
+
type_info.rb
|
16
|
+
model.rb
|
17
|
+
templates.rb
|
18
|
+
meta.rb
|
19
|
+
action.rb
|
20
|
+
scheme.rb
|
21
|
+
|
22
|
+
meta/list_meta.rb
|
23
|
+
meta/view_meta.rb
|
24
|
+
meta/form_meta.rb
|
25
|
+
meta/save_meta.rb
|
26
|
+
meta/delete_meta.rb
|
27
|
+
meta/decode_meta.rb
|
28
|
+
meta/link_meta.rb
|
29
|
+
meta/infra_meta.rb
|
30
|
+
].each do |f|
|
31
|
+
load "engine2/#{f}"
|
32
|
+
end
|
33
|
+
|
34
|
+
Engine2.bootstrap
|
@@ -0,0 +1,217 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
|
3
|
+
module Engine2
|
4
|
+
class Action < BasicObject
|
5
|
+
ACCESS_FORBIDDEN ||= ->h{false}
|
6
|
+
attr_reader :parent, :name, :number, :actions, :recheck_access
|
7
|
+
attr_reader :meta_proc
|
8
|
+
|
9
|
+
class << self
|
10
|
+
attr_accessor :count
|
11
|
+
end
|
12
|
+
|
13
|
+
def initialize parent, name, meta_class, assets
|
14
|
+
Action.count += 1
|
15
|
+
@number = Action.count
|
16
|
+
@parent = parent
|
17
|
+
@name = name
|
18
|
+
@meta = meta_class.new(self, assets)
|
19
|
+
@actions = {}
|
20
|
+
end
|
21
|
+
|
22
|
+
def * &blk
|
23
|
+
if blk
|
24
|
+
::Kernel.raise E2Error.new("Meta #{name} with proc already defined for action #{self.inspect}") if @meta_proc
|
25
|
+
@meta_proc = blk
|
26
|
+
end
|
27
|
+
@meta
|
28
|
+
end
|
29
|
+
|
30
|
+
def access! &blk
|
31
|
+
::Kernel.raise E2Error.new("Access for action #{name} already defined") if @access_block
|
32
|
+
@access_block = blk
|
33
|
+
end
|
34
|
+
|
35
|
+
def access_forbidden!
|
36
|
+
access! &ACCESS_FORBIDDEN
|
37
|
+
end
|
38
|
+
|
39
|
+
def check_access! handler
|
40
|
+
!@access_block || @access_block.(handler)
|
41
|
+
end
|
42
|
+
|
43
|
+
def run_scheme name, *args, &blk
|
44
|
+
result = instance_exec(*args, &SCHEMES[name])
|
45
|
+
result.instance_eval(&blk) if blk
|
46
|
+
result
|
47
|
+
end
|
48
|
+
|
49
|
+
def define_action name, meta_class = DummyMeta, assets = {}, &blk
|
50
|
+
::Kernel.raise E2Error.new("Action #{name} already defined") if @actions[name]
|
51
|
+
action = @actions[name] = Action.new(self, name, meta_class, assets)
|
52
|
+
action.*.pre_run
|
53
|
+
define_singleton_method! name do |&ablk| # forbidden list
|
54
|
+
action.instance_eval(&ablk) if ablk
|
55
|
+
action
|
56
|
+
end
|
57
|
+
action.instance_eval(&blk) if blk
|
58
|
+
action.*.action_defined
|
59
|
+
action
|
60
|
+
end
|
61
|
+
|
62
|
+
def undefine_action name
|
63
|
+
::Kernel.raise E2Error.new("No action #{name} defined") unless @actions[name]
|
64
|
+
@actions.delete(name)
|
65
|
+
end
|
66
|
+
|
67
|
+
def define_action_bundle name, *actions
|
68
|
+
define_singleton_method!(name) do |&blk|
|
69
|
+
if blk
|
70
|
+
actions.each{|a|__send__(a, &blk)} # if @actions[action] ?
|
71
|
+
else
|
72
|
+
ActionBundle.new(self, actions)
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
def define_singleton_method! name, &blk
|
78
|
+
class << self;self;end.instance_eval do # __realclass__
|
79
|
+
define_method name, &blk
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
def [] name
|
84
|
+
@actions[name]
|
85
|
+
end
|
86
|
+
|
87
|
+
def actions_info handler
|
88
|
+
info = actions.inject({}) do |h, (name, a)|
|
89
|
+
meta = a.*
|
90
|
+
h[name] = {
|
91
|
+
meta_type: meta.meta_type,
|
92
|
+
method: meta.http_method,
|
93
|
+
number: a.number,
|
94
|
+
access: recheck_access ? nil : a.check_access!(handler),
|
95
|
+
recheck_access: a.recheck_access,
|
96
|
+
terminal: a.actions.empty?,
|
97
|
+
meta: !meta.get.empty?,
|
98
|
+
invokable: meta.invokable
|
99
|
+
}
|
100
|
+
h
|
101
|
+
end
|
102
|
+
|
103
|
+
info.first[1][:default] = true unless actions.empty?
|
104
|
+
info
|
105
|
+
end
|
106
|
+
|
107
|
+
def access_info handler
|
108
|
+
@actions.inject({}) do |h, (name, a)|
|
109
|
+
h[name] = a.check_access!(handler)
|
110
|
+
h
|
111
|
+
end
|
112
|
+
end
|
113
|
+
|
114
|
+
def recheck_access!
|
115
|
+
@recheck_access = true
|
116
|
+
end
|
117
|
+
|
118
|
+
def each_action &blk
|
119
|
+
# no self
|
120
|
+
@actions.each_pair do |n, a|
|
121
|
+
a.each_action(&blk) if yield a
|
122
|
+
end
|
123
|
+
end
|
124
|
+
|
125
|
+
def to_a_rec root = true, result = [], &blk # optimize
|
126
|
+
if root && (yield self)
|
127
|
+
result << self
|
128
|
+
@actions.each_pair do |n, a|
|
129
|
+
if yield a
|
130
|
+
result << a
|
131
|
+
a.to_a_rec(false, result, &blk)
|
132
|
+
end
|
133
|
+
end
|
134
|
+
end
|
135
|
+
result
|
136
|
+
end
|
137
|
+
|
138
|
+
def inspect
|
139
|
+
"Action: #{@name}, meta: #{@meta.class}, meta_type: #{@meta.meta_type}"
|
140
|
+
end
|
141
|
+
|
142
|
+
def setup_action_tree
|
143
|
+
time = ::Time.now
|
144
|
+
|
145
|
+
model_actions = {}
|
146
|
+
each_action do |action|
|
147
|
+
if model = action.*.assets[:model]
|
148
|
+
model_name = model.name.to_sym
|
149
|
+
model.synchronize_type_info
|
150
|
+
model_actions[model_name] = action.to_a_rec{|a| !a.*.assets[:assoc]}
|
151
|
+
action.run_scheme(model_name) if SCHEMES.schemes[model_name]
|
152
|
+
false
|
153
|
+
else
|
154
|
+
true
|
155
|
+
end
|
156
|
+
end
|
157
|
+
|
158
|
+
each_action do |action|
|
159
|
+
meta = action.*
|
160
|
+
model = meta.assets[:model]
|
161
|
+
assoc = meta.assets[:assoc]
|
162
|
+
if model && assoc
|
163
|
+
if source_actions = model_actions[model.name.to_sym]
|
164
|
+
source_action = source_actions.select{|sa| sa.meta_proc && sa.*.class >= meta.class}
|
165
|
+
# source_action = source_actions.select{|sa| sa.meta_proc && meta.class <= sa.*.class}
|
166
|
+
unless source_action.empty?
|
167
|
+
# raise E2Error.new("Multiple meta candidates for #{action.inspect} found in '#{source_action.inspect}'") if source_action.size > 1
|
168
|
+
# puts "#{action.inspect} => #{source_action.inspect}\n"
|
169
|
+
meta.instance_eval(&source_action.first.meta_proc)
|
170
|
+
end
|
171
|
+
end
|
172
|
+
end
|
173
|
+
|
174
|
+
meta.instance_eval(&action.meta_proc) if action.meta_proc
|
175
|
+
true
|
176
|
+
end
|
177
|
+
|
178
|
+
each_action do |action|
|
179
|
+
action.*.post_run
|
180
|
+
action.*.freeze_meta
|
181
|
+
true
|
182
|
+
end
|
183
|
+
|
184
|
+
::Kernel::puts "ACTIONS: #{Action.count}, Time: #{::Time.now - time}"
|
185
|
+
# verify_action_usage
|
186
|
+
end
|
187
|
+
|
188
|
+
def verify_action_usage
|
189
|
+
t = ::Time.now
|
190
|
+
each_action do |action|
|
191
|
+
meta = action.*
|
192
|
+
model = meta.assets[:model]
|
193
|
+
if model
|
194
|
+
model.one_to_many_associations.each do |a|
|
195
|
+
end
|
196
|
+
true
|
197
|
+
else
|
198
|
+
true
|
199
|
+
end
|
200
|
+
|
201
|
+
end
|
202
|
+
::Kernel::puts "VERIFY #{::Time.now - t}"
|
203
|
+
end
|
204
|
+
end
|
205
|
+
|
206
|
+
|
207
|
+
class ActionBundle
|
208
|
+
def initialize action, action_names
|
209
|
+
@action = action
|
210
|
+
@action_names = action_names
|
211
|
+
end
|
212
|
+
|
213
|
+
def method_missing name, *args, &blk
|
214
|
+
@action_names.each{|an| @action[an].__send__(name, *args, &blk)}
|
215
|
+
end
|
216
|
+
end
|
217
|
+
end
|