populate-me 0.13.1 → 0.16.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/populate_me/admin/__assets__/img/file.png +0 -0
- data/lib/populate_me/admin/__assets__/js/main.js +2 -0
- data/lib/populate_me/admin/views/page.erb +9 -2
- data/lib/populate_me/admin.rb +13 -2
- data/lib/populate_me/document_mixins/outcasting.rb +8 -0
- data/lib/populate_me/version.rb +1 -1
- data/populate-me.gemspec +1 -1
- data/test/test_admin.rb +43 -2
- data/test/test_document_outcasting.rb +35 -0
- data/test/test_document_schema.rb +1 -0
- metadata +11 -10
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a92596c5ed11fb3d67f18b48fdc1011ecf423f26390c2f71c3587c3c2cae93cf
|
4
|
+
data.tar.gz: 70e4e6572ed7e98ace3444ee6c6c18ff937b0ed72aa35b80a5c5d2ad99865d91
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: cd01c21a0a760cb1691453ca86f22a75cbabd423134bd25c699fbd0ea96ef6a1845a88d130c61f62fcec9a2f77fb527759152307fb0fb762f0778a2f657bbe3d
|
7
|
+
data.tar.gz: fc764eb27f6c4dd76bde7b952432dc0a647872a061f564f3ac9104511b7baecd0a67866b9777726e329619cd6e1b3663e107f3e774d908e794cfe100592c44b4
|
Binary file
|
@@ -413,6 +413,8 @@ $(function() {
|
|
413
413
|
process_data: function(data) {
|
414
414
|
if (typeof data == 'object') {
|
415
415
|
return PopulateMe.mustache_render(data);
|
416
|
+
} else if (typeof data == 'string' && data[0] == '{') {
|
417
|
+
return PopulateMe.mustache_render(JSON.parse(data));
|
416
418
|
} else {
|
417
419
|
return data;
|
418
420
|
}
|
@@ -117,7 +117,14 @@
|
|
117
117
|
</script>
|
118
118
|
|
119
119
|
<script id="template-string-field" type="x-tmpl-mustache">
|
120
|
-
<input name='{{input_name}}' value='{{input_value}}' {{#required}}required{{/required}}{{{build_input_attributes}}} />
|
120
|
+
<input name='{{input_name}}' value='{{input_value}}' {{#required}}required{{/required}}{{{build_input_attributes}}} {{#autocomplete.length}}list='datalist-{{id}}'{{/autocomplete.length}} />
|
121
|
+
{{#autocomplete.length}}
|
122
|
+
<datalist id='datalist-{{id}}'>
|
123
|
+
{{#autocomplete}}
|
124
|
+
<option value='{{.}}' />
|
125
|
+
{{/autocomplete}}
|
126
|
+
</datalist>
|
127
|
+
{{/autocomplete.length}}
|
121
128
|
</script>
|
122
129
|
|
123
130
|
<script id="template-text-field" type="x-tmpl-mustache">
|
@@ -145,7 +152,7 @@
|
|
145
152
|
|
146
153
|
<script id="template-attachment-field" type="x-tmpl-mustache">
|
147
154
|
{{#url}}
|
148
|
-
<img src='{{url}}{{cache_buster}}' alt='Preview' width='150' />
|
155
|
+
<img src='{{url}}{{cache_buster}}' alt='Preview' width='150' onerror="this.src='<%= request.script_name %>/__assets__/img/file.png'; this.onerror=null;" />
|
149
156
|
<button class='attachment-deleter'>x</button>
|
150
157
|
<br />
|
151
158
|
{{/url}}
|
data/lib/populate_me/admin.rb
CHANGED
@@ -67,6 +67,7 @@ class PopulateMe::Admin < Sinatra::Base
|
|
67
67
|
if request.path_info=='/menu'
|
68
68
|
items.push({title: '?', href: "#{request.script_name}/help", new_page: false})
|
69
69
|
end
|
70
|
+
content_type :json
|
70
71
|
{
|
71
72
|
template: 'template_menu',
|
72
73
|
page_title: page_title,
|
@@ -76,6 +77,7 @@ class PopulateMe::Admin < Sinatra::Base
|
|
76
77
|
|
77
78
|
get '/list/:class_name' do
|
78
79
|
@model_class = resolve_model_class params[:class_name]
|
80
|
+
content_type :json
|
79
81
|
@model_class.to_admin_list(request: request, params: params).to_json
|
80
82
|
end
|
81
83
|
|
@@ -87,6 +89,7 @@ class PopulateMe::Admin < Sinatra::Base
|
|
87
89
|
else
|
88
90
|
@model_instance = resolve_model_instance @model_class, params[:id]
|
89
91
|
end
|
92
|
+
content_type :json
|
90
93
|
@model_instance.to_admin_form(
|
91
94
|
request: request,
|
92
95
|
params: params,
|
@@ -102,6 +105,7 @@ class PopulateMe::Admin < Sinatra::Base
|
|
102
105
|
|
103
106
|
not_found do
|
104
107
|
response.headers['X-Cascade'] = 'pass'
|
108
|
+
content_type :json
|
105
109
|
{'success'=>false,'message'=>'Not Found'}.to_json
|
106
110
|
end
|
107
111
|
|
@@ -109,6 +113,7 @@ class PopulateMe::Admin < Sinatra::Base
|
|
109
113
|
puts
|
110
114
|
puts env['sinatra.error'].inspect
|
111
115
|
puts
|
116
|
+
content_type :json
|
112
117
|
{'success'=>false,'message'=>env['sinatra.error'].message}.to_json
|
113
118
|
end
|
114
119
|
|
@@ -118,11 +123,17 @@ class PopulateMe::Admin < Sinatra::Base
|
|
118
123
|
# Method = overridable = testable
|
119
124
|
ENV['CERBERUS_PASS']
|
120
125
|
end
|
126
|
+
|
121
127
|
def cerberus_available?
|
122
128
|
# Method = overridable = testable
|
123
129
|
Rack.const_defined?(:Cerberus)
|
124
130
|
end
|
125
131
|
|
132
|
+
def cerberus_auth user, pass, req
|
133
|
+
pass == cerberus_pass
|
134
|
+
end
|
135
|
+
|
136
|
+
|
126
137
|
private
|
127
138
|
|
128
139
|
def setup_default_middleware builder
|
@@ -146,8 +157,8 @@ class PopulateMe::Admin < Sinatra::Base
|
|
146
157
|
return unless settings.cerberus_active
|
147
158
|
cerberus_settings = settings.cerberus==true ? {} : settings.cerberus
|
148
159
|
cerberus_settings[:session_key] = 'populate_me_user'
|
149
|
-
builder.use Rack::Cerberus, cerberus_settings do |user,pass,req|
|
150
|
-
pass
|
160
|
+
builder.use Rack::Cerberus, cerberus_settings do |user, pass, req|
|
161
|
+
cerberus_auth user, pass, req
|
151
162
|
end
|
152
163
|
end
|
153
164
|
|
@@ -21,6 +21,14 @@ module PopulateMe
|
|
21
21
|
end
|
22
22
|
end
|
23
23
|
|
24
|
+
def outcast_string field, item, o={}
|
25
|
+
if item.key? :autocomplete
|
26
|
+
item = item.dup
|
27
|
+
item[:autocomplete] = WebUtils.deep_copy(WebUtils.get_value(item[:autocomplete],self))
|
28
|
+
end
|
29
|
+
item
|
30
|
+
end
|
31
|
+
|
24
32
|
def outcast_list field, item, o={}
|
25
33
|
item = item.dup
|
26
34
|
item[:items] = self.__send__(field).map do |nested|
|
data/lib/populate_me/version.rb
CHANGED
data/populate-me.gemspec
CHANGED
@@ -21,7 +21,7 @@ Gem::Specification.new do |s|
|
|
21
21
|
s.add_dependency 'sinatra', '~> 2'
|
22
22
|
s.add_dependency 'json', '~> 2.1'
|
23
23
|
|
24
|
-
s.add_development_dependency 'bundler', '
|
24
|
+
s.add_development_dependency 'bundler', '>= 2.2.10'
|
25
25
|
s.add_development_dependency 'minitest', '~> 5.8'
|
26
26
|
s.add_development_dependency 'rack-test', '~> 0.6'
|
27
27
|
s.add_development_dependency 'rack-cerberus', '~> 1.0'
|
data/test/test_admin.rb
CHANGED
@@ -22,6 +22,12 @@ class AdminWithCerberusPass < Admin
|
|
22
22
|
end
|
23
23
|
end
|
24
24
|
|
25
|
+
class AdminWithCustomCerberusAuth < AdminWithCerberusPass
|
26
|
+
def self.cerberus_auth user, pass, req
|
27
|
+
[user, pass] == ['mario', '1234']
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
25
31
|
class AdminCerberusNotAvailable < AdminWithCerberusPass
|
26
32
|
def self.cerberus_available?
|
27
33
|
false
|
@@ -106,19 +112,54 @@ describe PopulateMe::Admin do
|
|
106
112
|
assert_equal 'text/css', last_response.content_type
|
107
113
|
end
|
108
114
|
|
109
|
-
describe '
|
115
|
+
describe 'When cerberus is active' do
|
110
116
|
let(:app) { AdminWithCerberusPass.new }
|
111
117
|
it 'Uses Cerberus for authentication' do
|
112
118
|
get '/'
|
113
119
|
assert_equal 401, last_response.status
|
114
120
|
end
|
121
|
+
it 'Authenticates with right login details' do
|
122
|
+
get '/', {
|
123
|
+
cerberus_login: 'admin',
|
124
|
+
cerberus_pass: '123',
|
125
|
+
_method: 'get'
|
126
|
+
}
|
127
|
+
assert_equal 200, last_response.status
|
128
|
+
end
|
129
|
+
it 'Fails authentication when login details are wrong' do
|
130
|
+
get '/', {
|
131
|
+
cerberus_login: 'admin',
|
132
|
+
cerberus_pass: 'xxx',
|
133
|
+
_method: 'get'
|
134
|
+
}
|
135
|
+
assert_equal 401, last_response.status
|
136
|
+
end
|
115
137
|
end
|
116
|
-
describe '
|
138
|
+
describe 'When cerberus is inactive' do
|
117
139
|
it 'Does not use Cerberus' do
|
118
140
|
get '/'
|
119
141
|
assert_predicate last_response, :ok?
|
120
142
|
end
|
121
143
|
end
|
144
|
+
describe 'When cerberus_auth is overridden' do
|
145
|
+
let(:app) { AdminWithCustomCerberusAuth.new }
|
146
|
+
it 'Authenticates with right login details' do
|
147
|
+
get '/', {
|
148
|
+
cerberus_login: 'mario',
|
149
|
+
cerberus_pass: '1234',
|
150
|
+
_method: 'get'
|
151
|
+
}
|
152
|
+
assert_equal 200, last_response.status
|
153
|
+
end
|
154
|
+
it 'Fails authentication when login details are wrong' do
|
155
|
+
get '/', {
|
156
|
+
cerberus_login: 'admin',
|
157
|
+
cerberus_pass: '123',
|
158
|
+
_method: 'get'
|
159
|
+
}
|
160
|
+
assert_equal 401, last_response.status
|
161
|
+
end
|
162
|
+
end
|
122
163
|
|
123
164
|
end
|
124
165
|
|
@@ -6,6 +6,7 @@ class Outcasted < PopulateMe::Document
|
|
6
6
|
set :default_attachment_class, PopulateMe::Attachment
|
7
7
|
|
8
8
|
field :name
|
9
|
+
field :category, autocomplete: ['Fish', 'Cat', 'Bunny']
|
9
10
|
field :size, type: :select, select_options: [
|
10
11
|
{description: 'small', value: 's'},
|
11
12
|
{description: 'medium', value: 'm'},
|
@@ -23,6 +24,10 @@ class Outcasted < PopulateMe::Document
|
|
23
24
|
field :weirdo, type: :strange
|
24
25
|
field :price, type: :price
|
25
26
|
|
27
|
+
def get_category_autocomplete_list
|
28
|
+
['Horse', 'Bear']
|
29
|
+
end
|
30
|
+
|
26
31
|
def get_size_options
|
27
32
|
[
|
28
33
|
[:small, :s],
|
@@ -65,6 +70,36 @@ describe PopulateMe::Document, 'Outcasting' do
|
|
65
70
|
|
66
71
|
end
|
67
72
|
|
73
|
+
describe '#outcast_string' do
|
74
|
+
|
75
|
+
it 'Generates the autocomplete options when needed' do
|
76
|
+
original = Outcasted.fields[:category]
|
77
|
+
output = Outcasted.new.outcast(:category, original, {input_name_prefix: 'data'})
|
78
|
+
assert_equal ['Fish', 'Cat', 'Bunny'], output[:autocomplete]
|
79
|
+
refute original.equal?(output)
|
80
|
+
|
81
|
+
original = Outcasted.fields[:name]
|
82
|
+
output = Outcasted.new.outcast(:name, original, {input_name_prefix: 'data'})
|
83
|
+
refute output.key?(:autocomplete)
|
84
|
+
end
|
85
|
+
|
86
|
+
it 'Generates the autocomplete options from a proc' do
|
87
|
+
original = Outcasted.fields[:category].dup
|
88
|
+
original[:autocomplete] = proc{ ['Dog', 'Snake'] }
|
89
|
+
output = Outcasted.new.outcast(:category, original, {input_name_prefix: 'data'})
|
90
|
+
assert_equal ['Dog', 'Snake'], output[:autocomplete]
|
91
|
+
assert original[:autocomplete].is_a?(Proc)
|
92
|
+
end
|
93
|
+
|
94
|
+
it 'Generates the autocomplete options from a method name' do
|
95
|
+
original = Outcasted.fields[:category].dup
|
96
|
+
original[:autocomplete] = :get_category_autocomplete_list
|
97
|
+
output = Outcasted.new.outcast(:category, original, {input_name_prefix: 'data'})
|
98
|
+
assert_equal ['Horse', 'Bear'], output[:autocomplete]
|
99
|
+
assert original[:autocomplete].is_a?(Symbol)
|
100
|
+
end
|
101
|
+
end
|
102
|
+
|
68
103
|
describe '#outcast_list' do
|
69
104
|
|
70
105
|
it 'Has no value and an empty list of items when list is empty' do
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: populate-me
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.16.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Mickael Riga
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2021-12-07 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: web-utils
|
@@ -56,16 +56,16 @@ dependencies:
|
|
56
56
|
name: bundler
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
58
58
|
requirements:
|
59
|
-
- - "
|
59
|
+
- - ">="
|
60
60
|
- !ruby/object:Gem::Version
|
61
|
-
version:
|
61
|
+
version: 2.2.10
|
62
62
|
type: :development
|
63
63
|
prerelease: false
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
65
65
|
requirements:
|
66
|
-
- - "
|
66
|
+
- - ">="
|
67
67
|
- !ruby/object:Gem::Version
|
68
|
-
version:
|
68
|
+
version: 2.2.10
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
70
|
name: minitest
|
71
71
|
requirement: !ruby/object:Gem::Requirement
|
@@ -198,6 +198,7 @@ files:
|
|
198
198
|
- lib/populate_me/admin/__assets__/css/asmselect.css
|
199
199
|
- lib/populate_me/admin/__assets__/css/jquery-ui.min.css
|
200
200
|
- lib/populate_me/admin/__assets__/css/main.css
|
201
|
+
- lib/populate_me/admin/__assets__/img/file.png
|
201
202
|
- lib/populate_me/admin/__assets__/img/help/children.png
|
202
203
|
- lib/populate_me/admin/__assets__/img/help/create.png
|
203
204
|
- lib/populate_me/admin/__assets__/img/help/delete.png
|
@@ -257,7 +258,7 @@ homepage: https://github.com/mig-hub/populate-me
|
|
257
258
|
licenses:
|
258
259
|
- MIT
|
259
260
|
metadata: {}
|
260
|
-
post_install_message:
|
261
|
+
post_install_message:
|
261
262
|
rdoc_options: []
|
262
263
|
require_paths:
|
263
264
|
- lib
|
@@ -272,8 +273,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
272
273
|
- !ruby/object:Gem::Version
|
273
274
|
version: '0'
|
274
275
|
requirements: []
|
275
|
-
rubygems_version: 3.
|
276
|
-
signing_key:
|
276
|
+
rubygems_version: 3.2.16
|
277
|
+
signing_key:
|
277
278
|
specification_version: 4
|
278
279
|
summary: PopulateMe is an admin system for web applications.
|
279
280
|
test_files:
|