kadmin 0.6.19 → 0.6.21
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/Rakefile +0 -115
- data/app/assets/javascripts/kadmin/select2.js +54 -15
- data/app/components/kadmin/finder.rb +1 -0
- data/app/components/kadmin/finder/presenter.rb +1 -0
- data/app/components/kadmin/form.rb +1 -0
- data/app/components/kadmin/navbar/link.rb +2 -1
- data/app/components/kadmin/navbar/section.rb +1 -0
- data/app/components/kadmin/pager.rb +1 -0
- data/app/components/kadmin/pager/presenter.rb +3 -2
- data/app/components/kadmin/select2.rb +16 -3
- data/app/controllers/kadmin/application_controller.rb +2 -1
- data/app/controllers/kadmin/auth_controller.rb +2 -2
- data/app/controllers/kadmin/dash_controller.rb +1 -2
- data/app/helpers/kadmin/alert_helper.rb +7 -6
- data/app/helpers/kadmin/application_helper.rb +1 -0
- data/config/initializers/assets.rb +3 -3
- data/config/routes.rb +1 -1
- data/lib/kadmin/configuration.rb +1 -0
- data/lib/kadmin/presentable.rb +1 -0
- data/lib/kadmin/presenter/test_case.rb +1 -0
- data/lib/kadmin/version.rb +1 -1
- metadata +17 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 98456b6564d2ed7360237ee63add4224c3657332
|
4
|
+
data.tar.gz: b5ab9f55d662438bd78d20a773fd1d6e9f0d69f5
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 492c06c2e1de2da68377bd30d0da378dadd9b2d8306525d2899ac879d8a5b13c412c7dab2aab020318fcc8edaa5ef7fe14799a264733aee19f6cf643044f81c7
|
7
|
+
data.tar.gz: c51a21974ec0d7cd74fb3bba05c11e7b1c8100cd3783b084032a5385a7615bfb884261a759c408403e1728a4a2c7cef40a4c9980d8052e67db1bedb0e409f8b2
|
data/Rakefile
CHANGED
@@ -33,118 +33,3 @@ begin
|
|
33
33
|
rescue LoadError
|
34
34
|
puts 'yard not present, disabling Rake task'
|
35
35
|
end
|
36
|
-
|
37
|
-
require 'kadmin/version'
|
38
|
-
|
39
|
-
namespace :cim do
|
40
|
-
desc 'Tags, updates README, and CHANGELOG and pushes to Github. Requires ruby-git'
|
41
|
-
task :release do
|
42
|
-
tasks = ['cim:assert_clean_repo', 'cim:git_fetch', 'cim:set_new_version', 'cim:update_readme', 'cim:update_changelog', 'cim:commit_changes', 'cim:tag']
|
43
|
-
begin
|
44
|
-
tasks.each { |task| Rake::Task[task].invoke }
|
45
|
-
`git push && git push origin '#{Kadmin::VERSION}'`
|
46
|
-
rescue => error
|
47
|
-
puts ">>> ERROR: #{error}; might want to reset your repository"
|
48
|
-
end
|
49
|
-
end
|
50
|
-
|
51
|
-
desc 'Fails if the current repository is not clean'
|
52
|
-
task :assert_clean_repo do
|
53
|
-
status = `git status -s`.chomp.strip
|
54
|
-
if status.strip.empty?
|
55
|
-
status = `git log origin/master..HEAD`.chomp.strip # check if we have unpushed commits
|
56
|
-
if status.strip.empty?
|
57
|
-
puts '>>> Repository is clean!'
|
58
|
-
else
|
59
|
-
puts '>>> Please push your committed changes before releasing!'
|
60
|
-
exit(-1)
|
61
|
-
end
|
62
|
-
else
|
63
|
-
puts '>>> Please stash or commit your changes before releasing!'
|
64
|
-
exit(-1)
|
65
|
-
end
|
66
|
-
end
|
67
|
-
|
68
|
-
desc 'Fetches latest tags/commits'
|
69
|
-
task :git_fetch do
|
70
|
-
puts '>>> Fetching latest git refs'
|
71
|
-
`git fetch --tags`
|
72
|
-
end
|
73
|
-
|
74
|
-
desc 'Requests the new version number'
|
75
|
-
task :set_new_version do
|
76
|
-
STDOUT.print(">>> New version number (current: #{Kadmin::VERSION}; leave blank if already updated): ")
|
77
|
-
input = STDIN.gets.strip.tr("'", "\'")
|
78
|
-
|
79
|
-
current = if input.empty?
|
80
|
-
Kadmin::VERSION
|
81
|
-
else
|
82
|
-
unless input =~ /[0-9]+\.[0-9]+\.[0-9]+/
|
83
|
-
puts '>>> Please use semantic versioning!'
|
84
|
-
exit(-1)
|
85
|
-
end
|
86
|
-
|
87
|
-
input
|
88
|
-
end
|
89
|
-
|
90
|
-
latest = `git describe --abbrev=0`.chomp.strip
|
91
|
-
unless Gem::Version.new(current) > Gem::Version.new(latest)
|
92
|
-
puts ">>> Latest tagged version is #{latest}; make sure gem version (#{current}) is greater!"
|
93
|
-
exit(-1)
|
94
|
-
end
|
95
|
-
|
96
|
-
if !input.empty?
|
97
|
-
`sed -i -u "s@VERSION = '#{Kadmin::VERSION}'@VERSION = '#{input}'@" #{File.expand_path('../lib/kadmin/version.rb', __FILE__)}`
|
98
|
-
$VERBOSE = nil
|
99
|
-
Kadmin.const_set('VERSION', input)
|
100
|
-
$VERBOSE = false
|
101
|
-
|
102
|
-
`bundle check` # force updating version
|
103
|
-
end
|
104
|
-
end
|
105
|
-
|
106
|
-
desc 'Updates README with latest version'
|
107
|
-
task :update_readme do
|
108
|
-
puts '>>> Updating README.md'
|
109
|
-
replace = %([](https://github.com/barcoo/kadmin/releases/tag/#{Kadmin::VERSION}))
|
110
|
-
|
111
|
-
`sed -i -u 's@^\\[\\!\\[GitHub release\\].*$@#{replace}@' README.md`
|
112
|
-
end
|
113
|
-
|
114
|
-
desc 'Updates CHANGELOG with commit log from last tag to this one'
|
115
|
-
task :update_changelog do
|
116
|
-
puts '>>> Updating CHANGELOG.md'
|
117
|
-
latest = `git describe --abbrev=0`.chomp.strip
|
118
|
-
range = $CHILD_STATUS.success? && !latest.empty? ? "'#{latest}'..HEAD" : ''
|
119
|
-
|
120
|
-
log = `git log --pretty=format:'- [%h](https://github.com/barcoo/kadmin/commit/%h) *%ad* __%s__ (%an)' --date=short #{range}`.chomp
|
121
|
-
|
122
|
-
changelog = File.open('.CHANGELOG.md', 'w')
|
123
|
-
changelog.write("# Changelog\n\n###{Kadmin::VERSION}\n\n#{log}\n\n")
|
124
|
-
File.open('CHANGELOG.md', 'r') do |file|
|
125
|
-
file.readline # skip first two lines
|
126
|
-
file.readline
|
127
|
-
|
128
|
-
while buffer = file.read(2048) # rubocop: disable Lint/AssignmentInCondition
|
129
|
-
changelog.write(buffer)
|
130
|
-
end
|
131
|
-
end
|
132
|
-
|
133
|
-
changelog.close
|
134
|
-
`mv '.CHANGELOG.md' 'CHANGELOG.md'`
|
135
|
-
end
|
136
|
-
|
137
|
-
desc 'Commits the README/CHANGELOG changes'
|
138
|
-
task :commit_changes do
|
139
|
-
puts '>>> Committing updates to README/CHANGELOG'
|
140
|
-
`git commit -am'Updated README.md and CHANGELOG.md on new release'`
|
141
|
-
end
|
142
|
-
|
143
|
-
desc 'Creates and pushes the tag to git'
|
144
|
-
task :tag do
|
145
|
-
puts '>>> Tagging'
|
146
|
-
STDOUT.print('>>> Please enter a tag message: ')
|
147
|
-
input = STDIN.gets.strip.tr("'", "\'")
|
148
|
-
`git tag -a '#{Kadmin::VERSION}' -m '#{input}'`
|
149
|
-
end
|
150
|
-
end
|
@@ -1,19 +1,20 @@
|
|
1
1
|
//= require select2
|
2
|
-
|
3
|
-
|
4
|
-
|
2
|
+
/* global jQuery */
|
3
|
+
jQuery(document).ready(function() {
|
4
|
+
jQuery.fn.select2.defaults.set("theme", "bootstrap");
|
5
|
+
jQuery.fn.select2.defaults.set("ajax", {
|
5
6
|
cache: true,
|
6
7
|
dataType: "json",
|
7
8
|
delay: 300,
|
8
9
|
data: transformRequest,
|
9
10
|
processResults: transformResponse
|
10
11
|
});
|
11
|
-
|
12
|
+
jQuery.fn.select2.defaults.set("allowClear", true);
|
12
13
|
|
13
14
|
function transformRequest(params) {
|
14
15
|
var page = params.page || 0;
|
15
|
-
var page_size = this.data(
|
16
|
-
var filter_param = this.data(
|
16
|
+
var page_size = this.data("kadmin--page-size") || 10;
|
17
|
+
var filter_param = this.data("kadmin--filter-param") || null;
|
17
18
|
var options = {
|
18
19
|
page_offset: page * page_size,
|
19
20
|
page_size: page_size
|
@@ -23,37 +24,75 @@ $(document).ready(function() {
|
|
23
24
|
options[filter_param] = params.term;
|
24
25
|
}
|
25
26
|
|
26
|
-
return options;
|
27
|
+
return transform(options, this.data("kadmin--transform-request"));
|
27
28
|
}
|
28
29
|
|
29
30
|
function transformResponse(data, params) {
|
30
31
|
var items = data.data || data.items;
|
31
32
|
var options = this.options.options.kadmin || {}; // weird but it is what it is
|
32
|
-
var displayProperty = options.displayProperty ||
|
33
|
-
var valueProperty = options.valueProperty ||
|
34
|
-
|
33
|
+
var displayProperty = options.displayProperty || "text";
|
34
|
+
var valueProperty = options.valueProperty || "id";
|
35
35
|
var results = [];
|
36
|
-
|
36
|
+
var response = {};
|
37
|
+
|
38
|
+
jQuery(items).each(function(index, item) {
|
37
39
|
results.push({ text: item[displayProperty], id: item[valueProperty] });
|
38
40
|
});
|
39
41
|
|
40
|
-
|
42
|
+
response = {
|
41
43
|
results: results,
|
42
44
|
pagination: { more: data.more }
|
43
45
|
};
|
46
|
+
|
47
|
+
return transform(response, this.$element.data("kadmin--transform-response"));
|
44
48
|
}
|
45
49
|
|
46
50
|
function optionsForSelect2(element) {
|
47
51
|
return {
|
48
|
-
minimumInputLength:
|
52
|
+
minimumInputLength: jQuery(element).data("kadmin--minimum-input-length") || 2,
|
53
|
+
};
|
54
|
+
}
|
55
|
+
|
56
|
+
// Data callbacks
|
57
|
+
var gFunctions = {};
|
58
|
+
function transform(initial, name) {
|
59
|
+
var transformed = initial;
|
60
|
+
|
61
|
+
if (name) {
|
62
|
+
var callback = lookup(name);
|
63
|
+
if (jQuery.isFunction(callback)) {
|
64
|
+
transformed = callback(initial);
|
65
|
+
}
|
49
66
|
}
|
67
|
+
|
68
|
+
return transformed;
|
69
|
+
}
|
70
|
+
|
71
|
+
function lookup(path) {
|
72
|
+
if (gFunctions[path]) return gFunctions[path];
|
73
|
+
|
74
|
+
var namespaces = path.split(".");
|
75
|
+
var functionName = namespaces.pop();
|
76
|
+
var context = window;
|
77
|
+
var func = null;
|
78
|
+
|
79
|
+
for (var i = 0; context && i < namespaces.length; i++) {
|
80
|
+
context = context[namespaces[i]];
|
81
|
+
}
|
82
|
+
|
83
|
+
if (jQuery.isFunction(context[functionName])) {
|
84
|
+
func = context[functionName];
|
85
|
+
gFunctions[path] = func;
|
86
|
+
}
|
87
|
+
|
88
|
+
return func;
|
50
89
|
}
|
51
90
|
|
52
91
|
// Need to delay a bit otherwise we have issues
|
53
92
|
// TODO: Figure out why this happens?
|
54
93
|
setTimeout(function() {
|
55
|
-
|
56
|
-
|
94
|
+
jQuery("select.kadmin-select2").each(function() {
|
95
|
+
jQuery(this).select2(optionsForSelect2(this));
|
57
96
|
});
|
58
97
|
}, 300);
|
59
98
|
|
@@ -1,4 +1,5 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
+
|
2
3
|
module Kadmin
|
3
4
|
# TODO: Figure out how to have access to a properly scoped routing proxy
|
4
5
|
module Navbar
|
@@ -45,7 +46,7 @@ module Kadmin
|
|
45
46
|
css_classes = self.css_classes.dup << 'active' if @view.controller.request.path == path
|
46
47
|
|
47
48
|
contents = @view.link_to(self.text.to_s.html_safe, path)
|
48
|
-
contents << captured
|
49
|
+
contents << captured if captured.present?
|
49
50
|
|
50
51
|
return %(<li class="#{css_classes.join(' ')}">#{contents}</li>).html_safe
|
51
52
|
end
|
@@ -1,4 +1,5 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
+
|
2
3
|
module Kadmin
|
3
4
|
class Pager
|
4
5
|
# Generates HTML code to present the given pager
|
@@ -74,14 +75,14 @@ module Kadmin
|
|
74
75
|
private :page_links
|
75
76
|
|
76
77
|
def list_text(text, css_classes = nil)
|
77
|
-
classes = %w
|
78
|
+
classes = %w[btn btn-default] + Array.wrap(css_classes)
|
78
79
|
return "<div class='#{classes.join(' ')}'>#{text}</div>".html_safe
|
79
80
|
end
|
80
81
|
private :list_text
|
81
82
|
|
82
83
|
def list_link(text, options = {})
|
83
84
|
link_options = @view.controller.request.query_parameters.merge(options)
|
84
|
-
return @view.link_to(text.to_s.html_safe, link_options, class: %w
|
85
|
+
return @view.link_to(text.to_s.html_safe, link_options, class: %w[btn btn-default].join(' '))
|
85
86
|
end
|
86
87
|
private :list_link
|
87
88
|
|
@@ -5,7 +5,10 @@ module Kadmin
|
|
5
5
|
include Kadmin::Presentable
|
6
6
|
|
7
7
|
CSS_CLASS_MARKER = 'kadmin-select2'
|
8
|
-
DATA_ATTRIBUTES = %i[
|
8
|
+
DATA_ATTRIBUTES = %i[
|
9
|
+
placeholder data_url filter_param display_property value_property
|
10
|
+
page_size minimum_input_length transform_request transform_response
|
11
|
+
].freeze
|
9
12
|
|
10
13
|
# @return [String] will be used as a placeholder if given
|
11
14
|
attr_reader :placeholder
|
@@ -30,6 +33,12 @@ module Kadmin
|
|
30
33
|
# @return [Integer] the minimum input length before trying to fetch remote data
|
31
34
|
attr_reader :minimum_input_length
|
32
35
|
|
36
|
+
# @return [String] name of callback to a globally-accessible function that can transform the request
|
37
|
+
attr_reader :transform_request
|
38
|
+
|
39
|
+
# @return [String] name of the callback to a globally-accessible function that can transform the response
|
40
|
+
attr_reader :transform_response
|
41
|
+
|
33
42
|
def initialize(options = {})
|
34
43
|
@placeholder = options[:placeholder].to_s.freeze
|
35
44
|
extract_ajax_options!(options).freeze if options.present?
|
@@ -42,6 +51,8 @@ module Kadmin
|
|
42
51
|
@value_property = options.fetch(:value_property, 'id')
|
43
52
|
@page_size = options.fetch(:page_size, 10)
|
44
53
|
@minimum_input_length = options.fetch(:minimum_input_length, 2)
|
54
|
+
@transform_request = options[:transform_request]
|
55
|
+
@transform_response = options[:transform_response]
|
45
56
|
|
46
57
|
raise ArgumentError, 'missing data URL for remote fetching' if @data_url.blank?
|
47
58
|
end
|
@@ -55,8 +66,10 @@ module Kadmin
|
|
55
66
|
'kadmin--display-property' => display_property,
|
56
67
|
'kadmin--value-property' => value_property,
|
57
68
|
'kadmin--page-size' => page_size,
|
58
|
-
'kadmin--minimum-input-length' => minimum_input_length
|
59
|
-
|
69
|
+
'kadmin--minimum-input-length' => minimum_input_length,
|
70
|
+
'kadmin--transform-request' => transform_request,
|
71
|
+
'kadmin--transform-response' => transform_response
|
72
|
+
}.compact
|
60
73
|
end
|
61
74
|
|
62
75
|
class << self
|
@@ -1,4 +1,5 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
+
|
2
3
|
module Kadmin
|
3
4
|
class ApplicationController < ActionController::Base
|
4
5
|
layout 'kadmin/application'
|
@@ -19,7 +20,7 @@ module Kadmin
|
|
19
20
|
|
20
21
|
# @!group Error Handling
|
21
22
|
|
22
|
-
if Kadmin.config.handle_errors
|
23
|
+
if Kadmin.config.handle_errors
|
23
24
|
rescue_from StandardError, with: :handle_unexpected_error
|
24
25
|
rescue_from ActiveRecord::RecordNotFound, with: :not_found
|
25
26
|
rescue_from ActionController::ParameterMissing, with: :params_missing
|
@@ -67,7 +67,7 @@ module Kadmin
|
|
67
67
|
def valid_redirect_url?(url)
|
68
68
|
valid = false
|
69
69
|
|
70
|
-
|
70
|
+
if url.present?
|
71
71
|
paths = [auth_login_path, auth_logout_path]
|
72
72
|
valid = paths.none? { |invalid| url == invalid }
|
73
73
|
end
|
@@ -92,7 +92,7 @@ module Kadmin
|
|
92
92
|
end
|
93
93
|
end
|
94
94
|
|
95
|
-
provider_link = "#{provider_link}?origin=#{CGI.escape(origin)}"
|
95
|
+
provider_link = "#{provider_link}?origin=#{CGI.escape(origin)}" if origin.present?
|
96
96
|
return provider_link
|
97
97
|
end
|
98
98
|
helper_method :omniauth_provider_link
|
@@ -1,4 +1,5 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
+
|
2
3
|
module Kadmin
|
3
4
|
# Provide helpers for displaying alerts, as well as matching those alerts to
|
4
5
|
# different flash keys.
|
@@ -13,7 +14,7 @@ module Kadmin
|
|
13
14
|
dismissible = options.fetch(:dismissible, true)
|
14
15
|
text_content = options.fetch(:content, '')
|
15
16
|
|
16
|
-
css_classes = %W
|
17
|
+
css_classes = %W[alert alert-#{type}]
|
17
18
|
css_classes << 'alert-dismissible' if options.fetch(:dismissible, true)
|
18
19
|
block_content = capture(&block) if block_given?
|
19
20
|
|
@@ -27,17 +28,17 @@ module Kadmin
|
|
27
28
|
content.concat(button)
|
28
29
|
end
|
29
30
|
|
30
|
-
content.concat(block_content.html_safe)
|
31
|
+
content.concat(block_content.html_safe) if block_content.present?
|
31
32
|
content
|
32
33
|
end
|
33
34
|
end
|
34
35
|
|
35
36
|
Type = Struct.new(:flash_keys, :css_class, :glyphicon)
|
36
37
|
TYPES = [
|
37
|
-
Type.new([
|
38
|
+
Type.new(%w[danger alert], 'danger', 'exclamation-sign'),
|
38
39
|
Type.new(['success'], 'success', 'ok-sign'),
|
39
|
-
Type.new([
|
40
|
-
Type.new([
|
40
|
+
Type.new(%w[notice info], 'info', 'info-sign'),
|
41
|
+
Type.new(%w[warn warning], 'warning', 'question-sign')
|
41
42
|
].freeze
|
42
43
|
def render_flash_alerts
|
43
44
|
alerts = AlertHelper::TYPES.map do |type|
|
@@ -48,7 +49,7 @@ module Kadmin
|
|
48
49
|
return safe_join(alerts)
|
49
50
|
end
|
50
51
|
|
51
|
-
def render_flash_alert(type
|
52
|
+
def render_flash_alert(type)
|
52
53
|
messages = type.flash_keys.map { |key| Array.wrap(flash[key]).compact }.flatten
|
53
54
|
return '' if messages.blank?
|
54
55
|
|
@@ -1,8 +1,8 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
%w
|
3
|
+
%w[app vendor].each do |folder|
|
4
4
|
path = Kadmin::Engine.root.join(folder, 'assets', '**', '*')
|
5
|
-
Rails.application.config.assets.paths.concat(Dir.glob(path).select { |
|
6
|
-
Rails.application.config.assets.precompile.concat(Dir.glob(path).select { |
|
5
|
+
Rails.application.config.assets.paths.concat(Dir.glob(path).select { |p| File.directory?(p) })
|
6
|
+
Rails.application.config.assets.precompile.concat(Dir.glob(path).select { |p| File.file?(p) })
|
7
7
|
end
|
8
8
|
Rails.application.config.assets.precompile << /\.(?:svg|eot|woff|ttf)$/
|
data/config/routes.rb
CHANGED
@@ -4,7 +4,7 @@ Kadmin::Engine.routes.draw do
|
|
4
4
|
scope '/auth', controller: :auth, as: 'auth', defaults: { format: 'html' } do
|
5
5
|
get '/login', action: :login, as: :login
|
6
6
|
get '/logout', action: :logout, as: :logout
|
7
|
-
match '/:provider/callback', action: :save, as: :callback, via: [
|
7
|
+
match '/:provider/callback', action: :save, as: :callback, via: %i[get post]
|
8
8
|
get '/failure', action: :failure, as: :failure
|
9
9
|
get '/unauthorized', action: :unauthorized, as: :unauthorized
|
10
10
|
get '/', action: :login
|
data/lib/kadmin/configuration.rb
CHANGED
data/lib/kadmin/presentable.rb
CHANGED
data/lib/kadmin/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: kadmin
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.6.
|
4
|
+
version: 0.6.21
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Nicolas Pepin-Perreault
|
@@ -10,7 +10,7 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date: 2017-
|
13
|
+
date: 2017-08-16 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: rails
|
@@ -74,6 +74,20 @@ dependencies:
|
|
74
74
|
- - "~>"
|
75
75
|
- !ruby/object:Gem::Version
|
76
76
|
version: '0.4'
|
77
|
+
- !ruby/object:Gem::Dependency
|
78
|
+
name: barcoop
|
79
|
+
requirement: !ruby/object:Gem::Requirement
|
80
|
+
requirements:
|
81
|
+
- - ">="
|
82
|
+
- !ruby/object:Gem::Version
|
83
|
+
version: '0'
|
84
|
+
type: :development
|
85
|
+
prerelease: false
|
86
|
+
version_requirements: !ruby/object:Gem::Requirement
|
87
|
+
requirements:
|
88
|
+
- - ">="
|
89
|
+
- !ruby/object:Gem::Version
|
90
|
+
version: '0'
|
77
91
|
description: Collection of utility, configuration, etc., for admin areas in a Rails
|
78
92
|
application. Provides a boostrap environment, standard layout, authentication, and
|
79
93
|
more.
|
@@ -172,7 +186,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
172
186
|
version: '0'
|
173
187
|
requirements: []
|
174
188
|
rubyforge_project:
|
175
|
-
rubygems_version: 2.
|
189
|
+
rubygems_version: 2.6.12
|
176
190
|
signing_key:
|
177
191
|
specification_version: 4
|
178
192
|
summary: Collection of utility, configuration, etc., for admin areas
|