kadim 0.1.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 +7 -0
- data/MIT-LICENSE +20 -0
- data/README.md +53 -0
- data/Rakefile +24 -0
- data/app/assets/config/kadim_manifest.js +1 -0
- data/app/assets/javascripts/kadim/application.js +1 -0
- data/app/assets/stylesheets/kadim/application.css +15 -0
- data/app/controllers/kadim/application_controller.rb +8 -0
- data/app/helpers/kadim/application_helper.rb +12 -0
- data/app/jobs/kadim/application_job.rb +6 -0
- data/app/mailers/kadim/application_mailer.rb +8 -0
- data/app/views/kadim/application/index.html.erb +8 -0
- data/app/views/layouts/kadim/application.html.erb +19 -0
- data/config/routes.rb +8 -0
- data/lib/kadim/engine.rb +15 -0
- data/lib/kadim/template/memory_resolver.rb +86 -0
- data/lib/kadim/version.rb +5 -0
- data/lib/kadim.rb +91 -0
- data/lib/tasks/kadim_tasks.rake +6 -0
- metadata +243 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 3272545bc64e3a1c4568f3203620fb693c7c9296ae29be131f6ff29bf7cdf647
|
4
|
+
data.tar.gz: abe7c623093b1e6c8da72df5a25d12c281a62f6b8af66e8c8562cc06525c5edb
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 6b8a8534aa0071b3bf94e4374d644795438a0fd2d81974f8a62db750ad43d041d00d4beac5262136bd5a9208b8802ede6c7e62f073980f6b389948b68127dfdb
|
7
|
+
data.tar.gz: e8b2b2b9eb52fa33604e32bcb2c3c8f95c034dea4a0fedf525c54381d5b4182ec979bf62e65bbfee742ef67630180eb1cdbab24f2bb73c4ef9532a682d98056d
|
data/MIT-LICENSE
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
Copyright 2019 Kadu Diógenes
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
4
|
+
a copy of this software and associated documentation files (the
|
5
|
+
"Software"), to deal in the Software without restriction, including
|
6
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
7
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
8
|
+
permit persons to whom the Software is furnished to do so, subject to
|
9
|
+
the following conditions:
|
10
|
+
|
11
|
+
The above copyright notice and this permission notice shall be
|
12
|
+
included in all copies or substantial portions of the Software.
|
13
|
+
|
14
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,53 @@
|
|
1
|
+
# kadim
|
2
|
+
Yet another Rails admin? No, only a kadim!*
|
3
|
+
|
4
|
+
Admin is all about CRUD, right?
|
5
|
+
|
6
|
+
My biggest experience with admins is with RailsAdmin. I currently work with an application that makes extensive use of
|
7
|
+
it and all my peers hate having to customize anything on it, me too!
|
8
|
+
|
9
|
+
If I have used administrate or trestle? Yes, I've tried it, but isn't reinventing the wheel super cool? In fact I
|
10
|
+
believe a less DSL-focused admin would be better.
|
11
|
+
|
12
|
+
I just got annoyed at just criticizing existing solutions and decided to get my hands dirty to put my vision into
|
13
|
+
practice.
|
14
|
+
|
15
|
+
** kadim: derived from "cadim", an expression from the brazillian mineiro dialect that means "a little bit".*
|
16
|
+
|
17
|
+
## Usage
|
18
|
+
In the current incarnation, it's very crud (no pun intended) and there is no configuration, everything works by
|
19
|
+
convention.
|
20
|
+
|
21
|
+
For each model of your application will be generated a controller and their views, using the Rails generator
|
22
|
+
scaffold_controller, using all columns present in your model. Relations, ActiveStorage attachments and other
|
23
|
+
ActiveRecord methods added by gems are ignored.
|
24
|
+
|
25
|
+
Files are generated in `tmp/kadim` and loaded into memory, including views. This also has the advantage of allowing the
|
26
|
+
gem to work in environments with ephemeral file systems.
|
27
|
+
|
28
|
+
## Installation
|
29
|
+
Add this line to your application's Gemfile:
|
30
|
+
|
31
|
+
```ruby
|
32
|
+
gem 'kadim'
|
33
|
+
```
|
34
|
+
|
35
|
+
And then execute:
|
36
|
+
```bash
|
37
|
+
$ bundle
|
38
|
+
```
|
39
|
+
|
40
|
+
Or install it yourself as:
|
41
|
+
```bash
|
42
|
+
$ gem install kadim
|
43
|
+
```
|
44
|
+
|
45
|
+
## Roadmap
|
46
|
+
- [x] Dynamic CRUD generation from application models
|
47
|
+
- [ ] Tasks to copy files form kadim to the hosted application
|
48
|
+
- [ ] Add support to ActiveStorage attachments
|
49
|
+
- [ ] Add support to belongs_to relationships
|
50
|
+
- [ ] Add a beautiful look and feel
|
51
|
+
|
52
|
+
## License
|
53
|
+
The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
|
data/Rakefile
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
begin
|
4
|
+
require "bundler/setup"
|
5
|
+
rescue LoadError
|
6
|
+
puts "You must `gem install bundler` and `bundle install` to run rake tasks"
|
7
|
+
end
|
8
|
+
|
9
|
+
require "rdoc/task"
|
10
|
+
|
11
|
+
RDoc::Task.new(:rdoc) do |rdoc|
|
12
|
+
rdoc.rdoc_dir = "rdoc"
|
13
|
+
rdoc.title = "Kadim"
|
14
|
+
rdoc.options << "--line-numbers"
|
15
|
+
rdoc.rdoc_files.include("README.md")
|
16
|
+
rdoc.rdoc_files.include("lib/**/*.rb")
|
17
|
+
end
|
18
|
+
|
19
|
+
APP_RAKEFILE = File.expand_path("spec/dummy/Rakefile", __dir__)
|
20
|
+
load "rails/tasks/engine.rake"
|
21
|
+
|
22
|
+
load "rails/tasks/statistics.rake"
|
23
|
+
|
24
|
+
require "bundler/gem_tasks"
|
@@ -0,0 +1 @@
|
|
1
|
+
//= link_directory ../stylesheets/kadim .css
|
@@ -0,0 +1 @@
|
|
1
|
+
//= require rails-ujs
|
@@ -0,0 +1,15 @@
|
|
1
|
+
/*
|
2
|
+
* This is a manifest file that'll be compiled into application.css, which will include all the files
|
3
|
+
* listed below.
|
4
|
+
*
|
5
|
+
* Any CSS and SCSS file within this directory, lib/assets/stylesheets, vendor/assets/stylesheets,
|
6
|
+
* or any plugin's vendor/assets/stylesheets directory can be referenced here using a relative path.
|
7
|
+
*
|
8
|
+
* You're free to add application-wide styles to this file and they'll appear at the bottom of the
|
9
|
+
* compiled file so the styles you add here take precedence over styles defined in any other CSS/SCSS
|
10
|
+
* files in this directory. Styles in this file should be added after the last require_* statement.
|
11
|
+
* It is generally better to create a new file per style scope.
|
12
|
+
*
|
13
|
+
*= require_tree .
|
14
|
+
*= require_self
|
15
|
+
*/
|
@@ -0,0 +1,12 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Kadim
|
4
|
+
module ApplicationHelper
|
5
|
+
def menu_links
|
6
|
+
links = Kadim.app_model_names.map(&:camelize).map(&:constantize).map do |model_klass|
|
7
|
+
link_to model_klass.model_name.human(count: :many), model_klass
|
8
|
+
end
|
9
|
+
safe_join(links, " | ")
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
<!DOCTYPE html>
|
2
|
+
<html>
|
3
|
+
<head>
|
4
|
+
<title>Kadim</title>
|
5
|
+
<%= csrf_meta_tags %>
|
6
|
+
<%= csp_meta_tag %>
|
7
|
+
|
8
|
+
<%= stylesheet_link_tag 'kadim/application', media: 'all', 'data-turbolinks-track': 'reload' %>
|
9
|
+
<%= javascript_include_tag 'kadim/application', 'data-turbolinks-track': 'reload' %>
|
10
|
+
</head>
|
11
|
+
<body>
|
12
|
+
|
13
|
+
<div class="menu">
|
14
|
+
<%= menu_links %>
|
15
|
+
</div>
|
16
|
+
<%= yield %>
|
17
|
+
|
18
|
+
</body>
|
19
|
+
</html>
|
data/config/routes.rb
ADDED
data/lib/kadim/engine.rb
ADDED
@@ -0,0 +1,86 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "singleton"
|
4
|
+
|
5
|
+
module Kadim
|
6
|
+
class MemoryResolver < ActionView::Resolver
|
7
|
+
include Singleton
|
8
|
+
|
9
|
+
class TemplateStore
|
10
|
+
SmallCache = ActionView::Resolver::Cache::SmallCache
|
11
|
+
|
12
|
+
PARTIAL_BLOCK = ->(store, partial) { store[partial] = SmallCache.new }
|
13
|
+
PREFIX_BLOCK = ->(store, prefix) { store[prefix] = SmallCache.new(&PARTIAL_BLOCK) }
|
14
|
+
NAME_BLOCK = ->(store, name) { store[name] = SmallCache.new(&PREFIX_BLOCK) }
|
15
|
+
|
16
|
+
# usually a majority of template look ups return nothing, use this canonical preallocated array to save memory
|
17
|
+
NO_TEMPLATES = [].freeze
|
18
|
+
|
19
|
+
def initialize
|
20
|
+
@data = SmallCache.new(&NAME_BLOCK)
|
21
|
+
end
|
22
|
+
|
23
|
+
def find(name, prefix, partial)
|
24
|
+
@data[name][prefix][partial].presence || NO_TEMPLATES
|
25
|
+
end
|
26
|
+
|
27
|
+
def add(body, path, partial)
|
28
|
+
name = path.split("/").last
|
29
|
+
name = name[1..-1] if partial
|
30
|
+
prefix = path.split("/")[0..-2].join("/")
|
31
|
+
@data[name][prefix][partial] = body
|
32
|
+
end
|
33
|
+
|
34
|
+
def clear
|
35
|
+
@data.clear
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
def initialize
|
40
|
+
@cache = Cache.new
|
41
|
+
@store = TemplateStore.new
|
42
|
+
end
|
43
|
+
|
44
|
+
def add(body, path)
|
45
|
+
partial = path.split("/").last.start_with?("_")
|
46
|
+
@store.add(body, path, partial)
|
47
|
+
end
|
48
|
+
|
49
|
+
def clear
|
50
|
+
@cache.clear
|
51
|
+
@store.clear
|
52
|
+
end
|
53
|
+
|
54
|
+
private
|
55
|
+
def find_templates(name, prefix, partial, details, locals = [])
|
56
|
+
return unless details[:formats].include?(:html) && details[:handlers].include?(:erb)
|
57
|
+
|
58
|
+
body = @store.find(name, prefix, partial)
|
59
|
+
return body if body.empty?
|
60
|
+
|
61
|
+
path = normalize_path(name, prefix)
|
62
|
+
identifier = "#{virtual_path(path, partial)}.html.erb (kadim memory resolver)"
|
63
|
+
handler = ActionView::Template.registered_template_handler(:erb)
|
64
|
+
details = { format: :html, virtual_path: virtual_path(path, partial), locals: locals }
|
65
|
+
|
66
|
+
[ActionView::Template.new(body, identifier, handler, details)]
|
67
|
+
end
|
68
|
+
|
69
|
+
# Normalize name and prefix, so the tuple ["index", "users"] becomes "users/index" and the tuple
|
70
|
+
# ["template", nil] becomes "template".
|
71
|
+
def normalize_path(name, prefix)
|
72
|
+
prefix.present? ? "#{prefix}/#{name}" : name
|
73
|
+
end
|
74
|
+
|
75
|
+
# Make paths as "users/user" become "users/_user" for partials.
|
76
|
+
def virtual_path(path, partial)
|
77
|
+
return path unless partial
|
78
|
+
|
79
|
+
if (index = path.rindex("/"))
|
80
|
+
path.dup.insert(index + 1, "_")
|
81
|
+
else
|
82
|
+
"_#{path}"
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
data/lib/kadim.rb
ADDED
@@ -0,0 +1,91 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "rails/generators"
|
4
|
+
require "rails/generators/rails/scaffold_controller/scaffold_controller_generator"
|
5
|
+
|
6
|
+
require "kadim/engine"
|
7
|
+
require "kadim/template/memory_resolver"
|
8
|
+
|
9
|
+
module Kadim
|
10
|
+
def self.app_model_names
|
11
|
+
Dir[Rails.root.join("app", "models", "**", "*.rb")]
|
12
|
+
.reject { |model_path| model_path.include?("/concerns/") || model_path.include?("application_record") }
|
13
|
+
.map { |model_path| model_path.remove(%r{.*/app/models/}, ".rb") }
|
14
|
+
.select { |model_name| model_name.camelize.constantize.table_exists? }
|
15
|
+
.sort
|
16
|
+
end
|
17
|
+
|
18
|
+
def self.bootstrap_controllers
|
19
|
+
cleanup
|
20
|
+
scaffold_controllers
|
21
|
+
end
|
22
|
+
|
23
|
+
class << self
|
24
|
+
private
|
25
|
+
def cleanup
|
26
|
+
cleanup_tmp_files
|
27
|
+
cleanup_kadim_consts
|
28
|
+
end
|
29
|
+
|
30
|
+
def cleanup_tmp_files
|
31
|
+
FileUtils.remove_dir(Rails.root.join("tmp", "kadim"), true)
|
32
|
+
end
|
33
|
+
|
34
|
+
def cleanup_kadim_consts
|
35
|
+
controller_filenames.each do |controller_filename|
|
36
|
+
next if File.exist?(Rails.root.join("app", "controllers", "kadim", "#{controller_filename}.rb"))
|
37
|
+
|
38
|
+
controller_klass = controller_filename.camelize
|
39
|
+
Kadim.send(:remove_const, controller_klass) if Kadim.const_defined?(controller_klass, false)
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
def controller_filenames
|
44
|
+
app_model_names.map { |model_name| "#{model_name.pluralize}_controller" }
|
45
|
+
end
|
46
|
+
|
47
|
+
def scaffold_controllers
|
48
|
+
current_namespace = Rails::Generators.namespace
|
49
|
+
Rails::Generators.namespace = Kadim
|
50
|
+
app_model_names.each { |model_name| scaffold_controller(model_name) }
|
51
|
+
load_kadim_controllers
|
52
|
+
load_kadim_views
|
53
|
+
ensure
|
54
|
+
Rails::Generators.namespace = current_namespace
|
55
|
+
end
|
56
|
+
|
57
|
+
def scaffold_controller(model_name)
|
58
|
+
model_klass = model_name.camelize.constantize
|
59
|
+
return unless model_klass.table_exists?
|
60
|
+
|
61
|
+
generator = Rails::Generators::ScaffoldControllerGenerator.new(
|
62
|
+
[model_name, *scaffold_attributes(model_klass)],
|
63
|
+
["--force", "--quiet", "--no-orm", "--no-test-framework", "--no-helper"],
|
64
|
+
destination_root: Rails.root.join("tmp", "kadim")
|
65
|
+
)
|
66
|
+
generator.invoke_all
|
67
|
+
end
|
68
|
+
|
69
|
+
def scaffold_attributes(model_klass)
|
70
|
+
model_klass.columns
|
71
|
+
.reject { |column| %w[id created_at updated_at].include?(column.name) }
|
72
|
+
.sort_by(&:name)
|
73
|
+
.map { |column| [column.name, column.type] }
|
74
|
+
.to_h
|
75
|
+
.map { |k, v| "#{k}:#{v}" }
|
76
|
+
end
|
77
|
+
|
78
|
+
def load_kadim_controllers
|
79
|
+
Dir[Rails.root.join("tmp", "kadim", "app", "controllers", "**", "*_controller.rb")].each { |path| load path }
|
80
|
+
end
|
81
|
+
|
82
|
+
def load_kadim_views
|
83
|
+
Kadim::MemoryResolver.instance.clear
|
84
|
+
Dir[Rails.root.join("tmp", "kadim", "app", "views", "**", "*.html.erb")].each do |file_path|
|
85
|
+
view_match = %r{.*/app/views/(.*)(\.html\.erb)}.match(file_path)
|
86
|
+
view_path = view_match[1]
|
87
|
+
Kadim::MemoryResolver.instance.add(IO.read(file_path), view_path)
|
88
|
+
end
|
89
|
+
end
|
90
|
+
end
|
91
|
+
end
|
metadata
ADDED
@@ -0,0 +1,243 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: kadim
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Kadu Diógenes
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2019-11-17 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: activestorage-resumable
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: 1.0.0
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: 1.0.0
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rails
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: 6.0.0
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: 6.0.0
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: capybara
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: 3.29.0
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: 3.29.0
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: pry
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - "~>"
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: 0.12.2
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - "~>"
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: 0.12.2
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: puma
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - "~>"
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: 4.2.0
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - "~>"
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: 4.2.0
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: rspec-rails
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - "~>"
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: 3.8.0
|
90
|
+
type: :development
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - "~>"
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: 3.8.0
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: rubocop
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - "~>"
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: 0.72.0
|
104
|
+
type: :development
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - "~>"
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: 0.72.0
|
111
|
+
- !ruby/object:Gem::Dependency
|
112
|
+
name: rubocop-performance
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
114
|
+
requirements:
|
115
|
+
- - "~>"
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: 1.5.0
|
118
|
+
type: :development
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
requirements:
|
122
|
+
- - "~>"
|
123
|
+
- !ruby/object:Gem::Version
|
124
|
+
version: 1.5.0
|
125
|
+
- !ruby/object:Gem::Dependency
|
126
|
+
name: rubocop-rails
|
127
|
+
requirement: !ruby/object:Gem::Requirement
|
128
|
+
requirements:
|
129
|
+
- - "~>"
|
130
|
+
- !ruby/object:Gem::Version
|
131
|
+
version: 2.3.0
|
132
|
+
type: :development
|
133
|
+
prerelease: false
|
134
|
+
version_requirements: !ruby/object:Gem::Requirement
|
135
|
+
requirements:
|
136
|
+
- - "~>"
|
137
|
+
- !ruby/object:Gem::Version
|
138
|
+
version: 2.3.0
|
139
|
+
- !ruby/object:Gem::Dependency
|
140
|
+
name: rubocop-rspec
|
141
|
+
requirement: !ruby/object:Gem::Requirement
|
142
|
+
requirements:
|
143
|
+
- - "~>"
|
144
|
+
- !ruby/object:Gem::Version
|
145
|
+
version: 1.36.0
|
146
|
+
type: :development
|
147
|
+
prerelease: false
|
148
|
+
version_requirements: !ruby/object:Gem::Requirement
|
149
|
+
requirements:
|
150
|
+
- - "~>"
|
151
|
+
- !ruby/object:Gem::Version
|
152
|
+
version: 1.36.0
|
153
|
+
- !ruby/object:Gem::Dependency
|
154
|
+
name: selenium-webdriver
|
155
|
+
requirement: !ruby/object:Gem::Requirement
|
156
|
+
requirements:
|
157
|
+
- - "~>"
|
158
|
+
- !ruby/object:Gem::Version
|
159
|
+
version: 3.142.0
|
160
|
+
type: :development
|
161
|
+
prerelease: false
|
162
|
+
version_requirements: !ruby/object:Gem::Requirement
|
163
|
+
requirements:
|
164
|
+
- - "~>"
|
165
|
+
- !ruby/object:Gem::Version
|
166
|
+
version: 3.142.0
|
167
|
+
- !ruby/object:Gem::Dependency
|
168
|
+
name: sqlite3
|
169
|
+
requirement: !ruby/object:Gem::Requirement
|
170
|
+
requirements:
|
171
|
+
- - ">="
|
172
|
+
- !ruby/object:Gem::Version
|
173
|
+
version: '0'
|
174
|
+
type: :development
|
175
|
+
prerelease: false
|
176
|
+
version_requirements: !ruby/object:Gem::Requirement
|
177
|
+
requirements:
|
178
|
+
- - ">="
|
179
|
+
- !ruby/object:Gem::Version
|
180
|
+
version: '0'
|
181
|
+
- !ruby/object:Gem::Dependency
|
182
|
+
name: webdrivers
|
183
|
+
requirement: !ruby/object:Gem::Requirement
|
184
|
+
requirements:
|
185
|
+
- - "~>"
|
186
|
+
- !ruby/object:Gem::Version
|
187
|
+
version: 4.1.0
|
188
|
+
type: :development
|
189
|
+
prerelease: false
|
190
|
+
version_requirements: !ruby/object:Gem::Requirement
|
191
|
+
requirements:
|
192
|
+
- - "~>"
|
193
|
+
- !ruby/object:Gem::Version
|
194
|
+
version: 4.1.0
|
195
|
+
description: Don't let admins pull out your hair!
|
196
|
+
email:
|
197
|
+
- kadu@fnix.com.br
|
198
|
+
executables: []
|
199
|
+
extensions: []
|
200
|
+
extra_rdoc_files: []
|
201
|
+
files:
|
202
|
+
- MIT-LICENSE
|
203
|
+
- README.md
|
204
|
+
- Rakefile
|
205
|
+
- app/assets/config/kadim_manifest.js
|
206
|
+
- app/assets/javascripts/kadim/application.js
|
207
|
+
- app/assets/stylesheets/kadim/application.css
|
208
|
+
- app/controllers/kadim/application_controller.rb
|
209
|
+
- app/helpers/kadim/application_helper.rb
|
210
|
+
- app/jobs/kadim/application_job.rb
|
211
|
+
- app/mailers/kadim/application_mailer.rb
|
212
|
+
- app/views/kadim/application/index.html.erb
|
213
|
+
- app/views/layouts/kadim/application.html.erb
|
214
|
+
- config/routes.rb
|
215
|
+
- lib/kadim.rb
|
216
|
+
- lib/kadim/engine.rb
|
217
|
+
- lib/kadim/template/memory_resolver.rb
|
218
|
+
- lib/kadim/version.rb
|
219
|
+
- lib/tasks/kadim_tasks.rake
|
220
|
+
homepage: https://github.com/fnix/kadim
|
221
|
+
licenses:
|
222
|
+
- MIT
|
223
|
+
metadata: {}
|
224
|
+
post_install_message:
|
225
|
+
rdoc_options: []
|
226
|
+
require_paths:
|
227
|
+
- lib
|
228
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
229
|
+
requirements:
|
230
|
+
- - ">="
|
231
|
+
- !ruby/object:Gem::Version
|
232
|
+
version: '0'
|
233
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
234
|
+
requirements:
|
235
|
+
- - ">="
|
236
|
+
- !ruby/object:Gem::Version
|
237
|
+
version: '0'
|
238
|
+
requirements: []
|
239
|
+
rubygems_version: 3.0.3
|
240
|
+
signing_key:
|
241
|
+
specification_version: 4
|
242
|
+
summary: Yet another Rails admin? No, only a kadim.
|
243
|
+
test_files: []
|