ditty 0.8.0 → 0.9.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/.gitignore +2 -0
- data/.pryrc +2 -0
- data/.rubocop.yml +1 -1
- data/.travis.yml +5 -4
- data/CNAME +1 -0
- data/Dockerfile +18 -0
- data/Gemfile.ci +0 -2
- data/Rakefile +2 -2
- data/_config.yml +1 -0
- data/config.ru +4 -4
- data/ditty.gemspec +9 -3
- data/docs/CNAME +1 -0
- data/docs/_config.yml +1 -0
- data/docs/index.md +34 -0
- data/exe/ditty +2 -0
- data/lib/ditty.rb +4 -2
- data/lib/ditty/cli.rb +28 -4
- data/lib/ditty/components/{app.rb → ditty.rb} +19 -14
- data/lib/ditty/controllers/{application.rb → application_controller.rb} +58 -29
- data/lib/ditty/controllers/{audit_logs.rb → audit_logs_controller.rb} +2 -2
- data/lib/ditty/controllers/{auth.rb → auth_controller.rb} +17 -16
- data/lib/ditty/controllers/{component.rb → component_controller.rb} +19 -18
- data/lib/ditty/controllers/{main.rb → main_controller.rb} +6 -2
- data/lib/ditty/controllers/roles_controller.rb +23 -0
- data/lib/ditty/controllers/{user_login_traits.rb → user_login_traits_controller.rb} +4 -3
- data/lib/ditty/controllers/{users.rb → users_controller.rb} +11 -10
- data/lib/ditty/db.rb +4 -3
- data/lib/ditty/emails/base.rb +5 -2
- data/lib/ditty/generators/crud_generator.rb +104 -0
- data/lib/ditty/generators/migration_generator.rb +26 -0
- data/lib/ditty/generators/project_generator.rb +51 -0
- data/lib/ditty/helpers/component.rb +2 -1
- data/lib/ditty/helpers/pundit.rb +20 -4
- data/lib/ditty/helpers/response.rb +20 -13
- data/lib/ditty/helpers/views.rb +7 -3
- data/lib/ditty/listener.rb +5 -3
- data/lib/ditty/memcached.rb +8 -0
- data/lib/ditty/middleware/accept_extension.rb +2 -2
- data/lib/ditty/middleware/error_catchall.rb +2 -2
- data/lib/ditty/models/base.rb +4 -0
- data/lib/ditty/models/role.rb +1 -0
- data/lib/ditty/models/user.rb +14 -1
- data/lib/ditty/policies/role_policy.rb +1 -1
- data/lib/ditty/policies/user_login_trait_policy.rb +1 -1
- data/lib/ditty/services/authentication.rb +11 -10
- data/lib/ditty/services/email.rb +8 -4
- data/lib/ditty/services/logger.rb +1 -1
- data/lib/ditty/tasks/ditty.rake +17 -0
- data/lib/ditty/tasks/omniauth-ldap.rake +2 -2
- data/lib/ditty/templates/.gitignore +5 -0
- data/lib/ditty/templates/.rspec +2 -0
- data/lib/ditty/templates/.rubocop.yml +7 -0
- data/lib/ditty/templates/Rakefile +12 -0
- data/lib/ditty/templates/application.rb +12 -0
- data/lib/ditty/templates/config.ru +37 -0
- data/lib/ditty/templates/controller.rb.erb +58 -0
- data/lib/ditty/templates/env.example +4 -0
- data/lib/ditty/templates/lib/project.rb.erb +5 -0
- data/lib/ditty/templates/migration.rb.erb +7 -0
- data/lib/ditty/templates/model.rb.erb +26 -0
- data/lib/ditty/templates/pids/.empty_directory +0 -0
- data/lib/ditty/templates/policy.rb.erb +48 -0
- data/lib/ditty/templates/public/css/sb-admin-2.min.css +10 -0
- data/lib/ditty/templates/public/js/sb-admin-2.min.js +7 -0
- data/lib/ditty/templates/settings.yml.erb +18 -0
- data/lib/ditty/templates/sidekiq.rb +18 -0
- data/lib/ditty/templates/sidekiq.yml +9 -0
- data/lib/ditty/templates/spec_helper.rb +43 -0
- data/lib/ditty/templates/type.rb.erb +21 -0
- data/lib/ditty/templates/views/display.haml.tt +20 -0
- data/lib/ditty/templates/views/edit.haml.tt +10 -0
- data/lib/ditty/templates/views/form.haml.tt +11 -0
- data/lib/ditty/templates/views/index.haml.tt +29 -0
- data/lib/ditty/templates/views/new.haml.tt +10 -0
- data/lib/ditty/version.rb +1 -1
- data/lib/rubocop/cop/ditty/call_services_directly.rb +2 -2
- data/migrate/20181209_add_user_login_traits.rb +4 -4
- data/migrate/20190220_add_parent_id_to_roles.rb +9 -0
- data/public/css/styles.css +13 -0
- data/public/js/scripts.js +1 -0
- data/views/404.haml +2 -4
- data/views/audit_logs/index.haml +32 -34
- data/views/auth/forgot_password.haml +27 -16
- data/views/auth/identity.haml +14 -13
- data/views/auth/ldap.haml +2 -2
- data/views/auth/login.haml +22 -17
- data/views/auth/register.haml +19 -18
- data/views/auth/register_identity.haml +27 -12
- data/views/auth/reset_password.haml +2 -2
- data/views/blank.haml +42 -0
- data/views/index.haml +1 -1
- data/views/layout.haml +37 -30
- data/views/partials/content_tag.haml +0 -0
- data/views/partials/delete_form.haml +1 -1
- data/views/partials/filter_control.haml +1 -1
- data/views/partials/footer.haml +5 -5
- data/views/partials/form_control.haml +19 -12
- data/views/partials/navitems.haml +44 -0
- data/views/partials/notifications.haml +12 -8
- data/views/partials/pager.haml +17 -17
- data/views/partials/search.haml +6 -7
- data/views/partials/sidebar.haml +15 -37
- data/views/partials/topbar.haml +68 -0
- data/views/roles/display.haml +27 -6
- data/views/roles/edit.haml +3 -3
- data/views/roles/form.haml +1 -0
- data/views/roles/index.haml +23 -16
- data/views/roles/new.haml +2 -2
- data/views/user_login_traits/display.haml +4 -4
- data/views/user_login_traits/edit.haml +3 -3
- data/views/user_login_traits/index.haml +4 -4
- data/views/user_login_traits/new.haml +2 -2
- data/views/users/display.haml +11 -12
- data/views/users/edit.haml +3 -3
- data/views/users/form.haml +0 -0
- data/views/users/index.haml +31 -24
- data/views/users/login_traits.haml +6 -8
- data/views/users/new.haml +2 -2
- data/views/users/profile.haml +13 -13
- metadata +143 -15
- data/lib/ditty/controllers/roles.rb +0 -13
- data/views/partials/navbar.haml +0 -22
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 35f3891fe07db1d74d92de59cbcf9ebde20c7aa9f5fdc995a5bed98445ac38de
|
|
4
|
+
data.tar.gz: 2ed19a9d156c4a043aa3d29b8ad070ed70da16637a88577ef74630734038868e
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: b11cb4cdab8e3afa910750884a5129becfe68202f779a35011e368a3d872724a41d2b3bd90b06485fdbdea740fbbe1c7165a8da50095ab7c7d767c28c2595185
|
|
7
|
+
data.tar.gz: 9e06c150bc6fd18dcc564dae5cf43bc3d9a5327541df1d64dd7b6f305381d83102ef1c9105ae4a9bcfe82cfa11881eda1fb93ec2321bd549072d92c2ee0c4acb
|
data/.gitignore
CHANGED
data/.pryrc
CHANGED
data/.rubocop.yml
CHANGED
data/.travis.yml
CHANGED
data/CNAME
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
ditty.io
|
data/Dockerfile
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
FROM ruby:2.5.3-alpine3.8
|
|
2
|
+
LABEL maintainer: "Sergey Shkarupa <s.shkarupa@gmail.com>"
|
|
3
|
+
|
|
4
|
+
RUN apk add --no-cache \
|
|
5
|
+
build-base \
|
|
6
|
+
less \
|
|
7
|
+
git \
|
|
8
|
+
libxml2-dev \
|
|
9
|
+
libxslt-dev \
|
|
10
|
+
sqlite-dev \
|
|
11
|
+
sqlite-doc \
|
|
12
|
+
sqlite-libs \
|
|
13
|
+
&& gem install bundler:1.17.3
|
|
14
|
+
|
|
15
|
+
WORKDIR /usr/src/app
|
|
16
|
+
|
|
17
|
+
COPY . ./
|
|
18
|
+
RUN bundle install --jobs=$(nproc) --no-cache --clean
|
data/Gemfile.ci
CHANGED
data/Rakefile
CHANGED
data/_config.yml
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
theme: jekyll-theme-architect
|
data/config.ru
CHANGED
|
@@ -6,14 +6,14 @@ use Rack::Session::Cookie,
|
|
|
6
6
|
# :secure=>!TEST_MODE, # Uncomment if only allowing https:// access
|
|
7
7
|
secret: File.read('.session_secret')
|
|
8
8
|
|
|
9
|
-
require 'ditty/components/
|
|
10
|
-
Ditty.component :
|
|
9
|
+
require 'ditty/components/ditty'
|
|
10
|
+
Ditty.component :ditty
|
|
11
11
|
|
|
12
12
|
require 'ditty/services/authentication'
|
|
13
13
|
use OmniAuth::Builder do
|
|
14
|
-
Ditty::Services::Authentication.config.each do |prov, config|
|
|
14
|
+
::Ditty::Services::Authentication.config.each do |prov, config|
|
|
15
15
|
provider prov, *config[:arguments]
|
|
16
16
|
end
|
|
17
17
|
end
|
|
18
18
|
|
|
19
|
-
run Rack::URLMap.new Ditty::Components.routes
|
|
19
|
+
run Rack::URLMap.new ::Ditty::Components.routes
|
data/ditty.gemspec
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
-
lib = File.expand_path('
|
|
3
|
+
lib = File.expand_path('lib', __dir__)
|
|
4
4
|
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
|
5
5
|
require 'ditty/version'
|
|
6
6
|
|
|
7
7
|
Gem::Specification.new do |spec|
|
|
8
8
|
spec.name = 'ditty'
|
|
9
|
-
spec.version = Ditty::VERSION
|
|
9
|
+
spec.version = ::Ditty::VERSION
|
|
10
10
|
spec.authors = ['Jurgens du Toit']
|
|
11
11
|
spec.email = ['jrgns@jadeit.co.za']
|
|
12
12
|
|
|
@@ -26,12 +26,18 @@ Gem::Specification.new do |spec|
|
|
|
26
26
|
spec.add_development_dependency 'rack-test'
|
|
27
27
|
spec.add_development_dependency 'racksh'
|
|
28
28
|
spec.add_development_dependency 'rspec', '~> 3.0'
|
|
29
|
+
spec.add_development_dependency 'rubocop'
|
|
30
|
+
spec.add_development_dependency 'rubocop-performance'
|
|
31
|
+
spec.add_development_dependency 'rubocop-rspec'
|
|
32
|
+
spec.add_development_dependency 'rubocop-sequel'
|
|
33
|
+
spec.add_development_dependency 'rubocop-thread_safety'
|
|
29
34
|
spec.add_development_dependency 'timecop'
|
|
30
35
|
|
|
31
36
|
spec.add_dependency 'activesupport', '>= 3'
|
|
32
37
|
spec.add_dependency 'bcrypt', '~> 3.1'
|
|
33
38
|
spec.add_dependency 'browser', '~> 2.5'
|
|
34
|
-
spec.add_dependency '
|
|
39
|
+
spec.add_dependency 'dotenv', '>= 2'
|
|
40
|
+
spec.add_dependency 'haml', '~> 5.1.2'
|
|
35
41
|
spec.add_dependency 'logger', '~> 1.0'
|
|
36
42
|
spec.add_dependency 'mail', '>= 1.7'
|
|
37
43
|
spec.add_dependency 'oga', '>= 2.14'
|
data/docs/CNAME
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
ditty.io
|
data/docs/_config.yml
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
theme: jekyll-theme-architect
|
data/docs/index.md
ADDED
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
# Ditty.io
|
|
2
|
+
|
|
3
|
+
Ditty is a Web Application Framework built on top of the [Sinatra](http://sinatrarb.com/) framework.
|
|
4
|
+
|
|
5
|
+
## Installation
|
|
6
|
+
|
|
7
|
+
Add these lines to your application's Gemfile:
|
|
8
|
+
|
|
9
|
+
```ruby
|
|
10
|
+
gem 'ditty'
|
|
11
|
+
gem 'sqlite3'
|
|
12
|
+
```
|
|
13
|
+
|
|
14
|
+
You can replace `sqlite3` with a DB adapter of your choice.
|
|
15
|
+
|
|
16
|
+
And then execute:
|
|
17
|
+
|
|
18
|
+
```bash
|
|
19
|
+
bundle install
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
Or install it yourself as:
|
|
23
|
+
|
|
24
|
+
```bash
|
|
25
|
+
gem install ditty
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
## Usage
|
|
29
|
+
|
|
30
|
+
1. Add the components to your rack config file. See the included [`config.ru`](https://github.com/EagerELK/ditty/blob/master/config.ru) file for an example setup
|
|
31
|
+
2. Set the DB connection as the `DATABASE_URL` ENV variable: `DATABASE_URL=sqlite://development.db`
|
|
32
|
+
3. Prepare the Ditty folder: `bundle exec ditty prep`
|
|
33
|
+
3. Run the Ditty migrations: `bundle exec ditty migrate`
|
|
34
|
+
4. Run the Ditty server: `bundle exec ditty server`
|
data/exe/ditty
CHANGED
data/lib/ditty.rb
CHANGED
|
@@ -62,7 +62,9 @@ module Ditty
|
|
|
62
62
|
h = @components
|
|
63
63
|
unless (component = h[name])
|
|
64
64
|
require "ditty/components/#{name}"
|
|
65
|
-
|
|
65
|
+
unless (component = h[name])
|
|
66
|
+
raise ComponentError, "Component #{name} did not register itself correctly in Ditty::Components"
|
|
67
|
+
end
|
|
66
68
|
end
|
|
67
69
|
component
|
|
68
70
|
end
|
|
@@ -76,7 +78,7 @@ module Ditty
|
|
|
76
78
|
#
|
|
77
79
|
# Ditty::Components.register_component(:component_name, ComponentModule)
|
|
78
80
|
def self.register_component(name, mod)
|
|
79
|
-
Ditty::Services::Logger.
|
|
81
|
+
::Ditty::Services::Logger.info "Registering #{mod} as #{name}"
|
|
80
82
|
@components[name] = mod
|
|
81
83
|
end
|
|
82
84
|
|
data/lib/ditty/cli.rb
CHANGED
|
@@ -1,24 +1,38 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
3
|
# https://nandovieira.com/creating-generators-and-executables-with-thor
|
|
4
|
-
require 'dotenv/load'
|
|
4
|
+
require 'dotenv/load' rescue LoadError # rubocop:disable Style/RescueModifier - Ignore dotenv/load errors
|
|
5
5
|
require 'thor'
|
|
6
6
|
require 'rack'
|
|
7
7
|
require 'rake'
|
|
8
|
+
require 'ditty/db' if ENV['DATABASE_URL']
|
|
9
|
+
require 'ditty/generators/crud_generator'
|
|
10
|
+
require 'ditty/generators/project_generator'
|
|
11
|
+
require 'ditty/generators/migration_generator'
|
|
12
|
+
require 'ditty/components/ditty'
|
|
8
13
|
|
|
9
14
|
module Ditty
|
|
10
15
|
class CLI < Thor
|
|
11
16
|
include Thor::Actions
|
|
12
17
|
|
|
18
|
+
register ::Ditty::Generators::CrudGenerator, 'crud', 'crud NAME', 'Generate a CRUD endpoint'
|
|
19
|
+
|
|
20
|
+
register ::Ditty::Generators::ProjectGenerator, 'init', 'init', 'Initialize a Ditty Project'
|
|
21
|
+
|
|
22
|
+
register ::Ditty::Generators::MigrationGenerator, 'migration', 'migration NAME', 'Create a new Sequel migration'
|
|
23
|
+
|
|
24
|
+
default_task :server
|
|
25
|
+
|
|
13
26
|
desc 'server', 'Start the Ditty server'
|
|
14
27
|
require './application' if File.exist?('application.rb')
|
|
15
|
-
Ditty::Components.tasks
|
|
28
|
+
::Ditty::Components.tasks
|
|
16
29
|
def server
|
|
17
30
|
# Ensure the token files are present
|
|
18
31
|
Rake::Task['ditty:generate_tokens'].invoke
|
|
19
32
|
|
|
20
33
|
# Prep Ditty
|
|
21
|
-
Rake::Task['ditty:prep'].invoke
|
|
34
|
+
Rake::Task['ditty:prep:folders'].invoke
|
|
35
|
+
Rake::Task['ditty:prep:migrations'].invoke
|
|
22
36
|
|
|
23
37
|
# Check the migrations
|
|
24
38
|
Rake::Task['ditty:migrate:check'].invoke
|
|
@@ -35,7 +49,7 @@ module Ditty
|
|
|
35
49
|
desc 'migrate', 'Run the Ditty migrations'
|
|
36
50
|
def migrate
|
|
37
51
|
# Prep Ditty
|
|
38
|
-
Rake::Task['ditty:prep'].invoke
|
|
52
|
+
Rake::Task['ditty:prep:migrations'].invoke
|
|
39
53
|
|
|
40
54
|
# Run the migrations
|
|
41
55
|
Rake::Task['ditty:migrate:up'].invoke
|
|
@@ -44,5 +58,15 @@ module Ditty
|
|
|
44
58
|
Rake::Task['ditty:dump_schema'].invoke
|
|
45
59
|
puts 'Ditty DB Schema Dumped'
|
|
46
60
|
end
|
|
61
|
+
|
|
62
|
+
desc 'seed', 'Seed the predefined seeind data'
|
|
63
|
+
def seed
|
|
64
|
+
Rake::Task['ditty:seed'].invoke
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
desc 'console', 'Open a fully loaded console'
|
|
68
|
+
def console
|
|
69
|
+
Rake::Task['ditty:console'].invoke
|
|
70
|
+
end
|
|
47
71
|
end
|
|
48
72
|
end
|
|
@@ -4,10 +4,10 @@ require 'ditty'
|
|
|
4
4
|
require 'ditty/services/settings'
|
|
5
5
|
|
|
6
6
|
module Ditty
|
|
7
|
-
class
|
|
7
|
+
class Ditty
|
|
8
8
|
def self.load
|
|
9
9
|
controllers = File.expand_path('../controllers', __dir__)
|
|
10
|
-
Dir.glob("#{controllers}/*.rb").each { |f| require f }
|
|
10
|
+
Dir.glob("#{controllers}/*.rb").sort.each { |f| require f }
|
|
11
11
|
|
|
12
12
|
require 'ditty/models/user'
|
|
13
13
|
require 'ditty/models/role'
|
|
@@ -29,15 +29,19 @@ module Ditty
|
|
|
29
29
|
File.expand_path('../../../views', __dir__)
|
|
30
30
|
end
|
|
31
31
|
|
|
32
|
+
def self.public_folder
|
|
33
|
+
File.expand_path('../../../public', __dir__)
|
|
34
|
+
end
|
|
35
|
+
|
|
32
36
|
def self.routes
|
|
33
37
|
load
|
|
34
38
|
{
|
|
35
|
-
'/' => ::Ditty::
|
|
36
|
-
'/auth' => ::Ditty::
|
|
37
|
-
'/users' => ::Ditty::
|
|
38
|
-
'/roles' => ::Ditty::
|
|
39
|
-
'/audit-logs' => ::Ditty::
|
|
40
|
-
'/login-traits' => ::Ditty::
|
|
39
|
+
'/' => ::Ditty::MainController,
|
|
40
|
+
'/auth' => ::Ditty::AuthController,
|
|
41
|
+
'/users' => ::Ditty::UsersController,
|
|
42
|
+
'/roles' => ::Ditty::RolesController,
|
|
43
|
+
'/audit-logs' => ::Ditty::AuditLogsController,
|
|
44
|
+
'/login-traits' => ::Ditty::UserLoginTraitsController
|
|
41
45
|
}
|
|
42
46
|
end
|
|
43
47
|
|
|
@@ -53,7 +57,8 @@ module Ditty
|
|
|
53
57
|
items: [
|
|
54
58
|
{ order: 10, link: '/users/', text: 'Users', target: ::Ditty::User, icon: 'user' },
|
|
55
59
|
{ order: 20, link: '/roles/', text: 'Roles', target: ::Ditty::Role, icon: 'check-square' },
|
|
56
|
-
{ order: 30, link: '/audit-logs/', text: 'Audit Logs', target: ::Ditty::AuditLog, icon: 'history' }
|
|
60
|
+
{ order: 30, link: '/audit-logs/', text: 'Audit Logs', target: ::Ditty::AuditLog, icon: 'history' },
|
|
61
|
+
{ order: 40, link: '/login-traits/', text: 'User Login Traits', target: ::Ditty::UserLoginTrait, icon: 'list' }
|
|
57
62
|
]
|
|
58
63
|
}
|
|
59
64
|
]
|
|
@@ -63,18 +68,18 @@ module Ditty
|
|
|
63
68
|
proc do
|
|
64
69
|
load
|
|
65
70
|
|
|
66
|
-
::Ditty::Role.find_or_create(name: 'super_admin')
|
|
67
|
-
::Ditty::Role.find_or_create(name: 'admin')
|
|
68
|
-
::Ditty::Role.find_or_create(name: 'user')
|
|
71
|
+
sa = ::Ditty::Role.find_or_create(name: 'super_admin')
|
|
72
|
+
admin = ::Ditty::Role.find_or_create(name: 'admin') { |e| e.parent = sa }
|
|
73
|
+
::Ditty::Role.find_or_create(name: 'user') { |e| e.parent = admin }
|
|
69
74
|
end
|
|
70
75
|
end
|
|
71
76
|
|
|
72
77
|
def self.tasks
|
|
73
78
|
Kernel.load 'ditty/tasks/ditty.rake'
|
|
74
|
-
auth_settings = Ditty::Services::Settings[:authentication] || {}
|
|
79
|
+
auth_settings = ::Ditty::Services::Settings[:authentication] || {}
|
|
75
80
|
Kernel.load 'ditty/tasks/omniauth-ldap.rake' if auth_settings.key?(:ldap)
|
|
76
81
|
end
|
|
77
82
|
end
|
|
78
83
|
end
|
|
79
84
|
|
|
80
|
-
Ditty::Components.register_component(:
|
|
85
|
+
Ditty::Components.register_component(:ditty, Ditty::Ditty)
|
|
@@ -17,13 +17,14 @@ require 'rack/contrib'
|
|
|
17
17
|
require 'rack/csrf'
|
|
18
18
|
|
|
19
19
|
module Ditty
|
|
20
|
-
class
|
|
20
|
+
class ApplicationController < Sinatra::Base
|
|
21
21
|
include ActiveSupport::Inflector
|
|
22
22
|
|
|
23
23
|
set :root, ENV['APP_ROOT'] || ::File.expand_path(::File.dirname(__FILE__) + '/../../../')
|
|
24
24
|
set :map_path, nil
|
|
25
25
|
set :view_location, nil
|
|
26
26
|
set :view_folder, nil
|
|
27
|
+
set :base_path, nil
|
|
27
28
|
set :model_class, nil
|
|
28
29
|
set :raise_sinatra_param_exceptions, true
|
|
29
30
|
set track_actions: false
|
|
@@ -42,7 +43,7 @@ module Ditty
|
|
|
42
43
|
|
|
43
44
|
helpers do
|
|
44
45
|
def logger
|
|
45
|
-
Ditty::Services::Logger
|
|
46
|
+
::Ditty::Services::Logger
|
|
46
47
|
end
|
|
47
48
|
|
|
48
49
|
def base_path
|
|
@@ -51,9 +52,9 @@ module Ditty
|
|
|
51
52
|
|
|
52
53
|
def view_location
|
|
53
54
|
return settings.view_location if settings.view_location
|
|
54
|
-
return underscore(pluralize(demodulize(settings.model_class))) if settings.model_class
|
|
55
55
|
|
|
56
|
-
|
|
56
|
+
loc = demodulize(settings.model_class || self.class)
|
|
57
|
+
pluralize(underscore(loc.gsub(/Controller\Z/, '')))
|
|
57
58
|
end
|
|
58
59
|
|
|
59
60
|
def browser
|
|
@@ -61,24 +62,26 @@ module Ditty
|
|
|
61
62
|
end
|
|
62
63
|
|
|
63
64
|
def config(name, default = '')
|
|
64
|
-
Ditty::Services::Settings[name] || default
|
|
65
|
+
::Ditty::Services::Settings[name] || default
|
|
65
66
|
end
|
|
66
67
|
end
|
|
67
68
|
|
|
68
69
|
def view_folders
|
|
69
70
|
folders = ['./views']
|
|
70
71
|
folders << settings.view_folder if settings.view_folder
|
|
71
|
-
folders << Ditty::
|
|
72
|
+
folders << ::Ditty::Ditty.view_folder
|
|
72
73
|
end
|
|
73
74
|
|
|
74
75
|
def find_template(views, name, engine, &block)
|
|
75
76
|
# Backwards compatability
|
|
76
|
-
|
|
77
|
+
if settings.view_folder.nil? && self.class.name.split('::').first != 'Ditty'
|
|
78
|
+
return super(views, name, engine, &block)
|
|
79
|
+
end
|
|
77
80
|
|
|
78
81
|
view_folders.each do |folder|
|
|
79
82
|
super(folder, name, engine, &block) # Root
|
|
80
83
|
end
|
|
81
|
-
raise Ditty::TemplateNotFoundError, "Could not find template `#{name}`"
|
|
84
|
+
raise ::Ditty::TemplateNotFoundError, "Could not find template `#{name}`"
|
|
82
85
|
end
|
|
83
86
|
|
|
84
87
|
configure :production do
|
|
@@ -92,7 +95,7 @@ module Ditty
|
|
|
92
95
|
|
|
93
96
|
configure :production, :development do
|
|
94
97
|
disable :logging
|
|
95
|
-
use Rack::CommonLogger, Ditty::Services::Logger
|
|
98
|
+
use Rack::CommonLogger, ::Ditty::Services::Logger
|
|
96
99
|
end
|
|
97
100
|
|
|
98
101
|
not_found do
|
|
@@ -102,7 +105,11 @@ module Ditty
|
|
|
102
105
|
haml :'404', locals: { title: '4 oh 4' }, layout: layout
|
|
103
106
|
end
|
|
104
107
|
format.json do
|
|
105
|
-
|
|
108
|
+
if response.body.empty?
|
|
109
|
+
json code: 404, errors: ['Not Found']
|
|
110
|
+
else
|
|
111
|
+
[404, response.body]
|
|
112
|
+
end
|
|
106
113
|
end
|
|
107
114
|
end
|
|
108
115
|
end
|
|
@@ -134,30 +141,46 @@ module Ditty
|
|
|
134
141
|
end
|
|
135
142
|
end
|
|
136
143
|
|
|
137
|
-
error
|
|
144
|
+
error ::Sinatra::Param::InvalidParameterError do
|
|
138
145
|
respond_to do |format|
|
|
139
|
-
entity = env['sinatra.error'].model
|
|
140
|
-
errors = env['sinatra.error'].errors
|
|
141
146
|
status 400
|
|
142
147
|
format.html do
|
|
143
|
-
|
|
144
|
-
haml :
|
|
148
|
+
flash.now[:danger] = env['sinatra.error'].message
|
|
149
|
+
haml :'400', locals: { title: '4 oh oh' }, layout: layout
|
|
145
150
|
end
|
|
146
151
|
format.json do
|
|
147
|
-
json code: 400, errors:
|
|
152
|
+
json code: 400, errors: { env['sinatra.error'].param => env['sinatra.error'].message }, full_errors: [env['sinatra.error'].message]
|
|
148
153
|
end
|
|
149
154
|
end
|
|
150
155
|
end
|
|
151
156
|
|
|
152
|
-
error
|
|
157
|
+
error ::Sequel::NoMatchingRow do
|
|
153
158
|
respond_to do |format|
|
|
159
|
+
status 404
|
|
160
|
+
format.html do
|
|
161
|
+
haml :'404', locals: { title: '4 oh 4' }, layout: layout
|
|
162
|
+
end
|
|
163
|
+
format.json do
|
|
164
|
+
if response.body.empty?
|
|
165
|
+
json code: 404, errors: ['Not Found']
|
|
166
|
+
else
|
|
167
|
+
[404, response.body]
|
|
168
|
+
end
|
|
169
|
+
end
|
|
170
|
+
end
|
|
171
|
+
end
|
|
172
|
+
|
|
173
|
+
error ::Sequel::ValidationFailed do
|
|
174
|
+
respond_to do |format|
|
|
175
|
+
entity = env['sinatra.error'].model
|
|
176
|
+
errors = env['sinatra.error'].errors
|
|
154
177
|
status 400
|
|
155
178
|
format.html do
|
|
156
|
-
|
|
157
|
-
haml :
|
|
179
|
+
action = entity.id ? :edit : :new
|
|
180
|
+
haml :"#{view_location}/#{action}", locals: { entity: entity, title: heading(action) }, layout: layout
|
|
158
181
|
end
|
|
159
182
|
format.json do
|
|
160
|
-
json code: 400, errors:
|
|
183
|
+
json code: 400, errors: errors, full_errors: errors.full_messages
|
|
161
184
|
end
|
|
162
185
|
end
|
|
163
186
|
end
|
|
@@ -177,7 +200,7 @@ module Ditty
|
|
|
177
200
|
end
|
|
178
201
|
end
|
|
179
202
|
|
|
180
|
-
error Ditty::TemplateNotFoundError do
|
|
203
|
+
error ::Ditty::TemplateNotFoundError do
|
|
181
204
|
# TODO: Display a better error message
|
|
182
205
|
error = env['sinatra.error']
|
|
183
206
|
broadcast(:application_error, error)
|
|
@@ -207,10 +230,10 @@ module Ditty
|
|
|
207
230
|
|
|
208
231
|
before(/.*/) do
|
|
209
232
|
logger.info "Running with #{self.class} - #{request.path_info}"
|
|
210
|
-
if
|
|
233
|
+
if /.*\.json\Z/.match?(request.path)
|
|
211
234
|
content_type :json
|
|
212
235
|
request.path_info = request.path_info.gsub(/.json$/, '')
|
|
213
|
-
elsif
|
|
236
|
+
elsif /.*\.csv\Z/.match?(request.path)
|
|
214
237
|
content_type :csv
|
|
215
238
|
request.path_info = request.path_info.gsub(/.csv$/, '')
|
|
216
239
|
elsif request.env['ACCEPT']
|
|
@@ -222,15 +245,21 @@ module Ditty
|
|
|
222
245
|
|
|
223
246
|
after do
|
|
224
247
|
return if params[:layout].nil?
|
|
248
|
+
return unless response.body.respond_to?(:map)
|
|
225
249
|
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
250
|
+
begin
|
|
251
|
+
orig = response.body
|
|
252
|
+
response.body = response.body.map do |resp|
|
|
253
|
+
document = Oga.parse_html(resp)
|
|
254
|
+
document.css('a').each do |elm|
|
|
255
|
+
unless (href = elm.get('href')).nil?
|
|
256
|
+
elm.set 'href', with_layout(href)
|
|
257
|
+
end
|
|
231
258
|
end
|
|
259
|
+
document.to_xml
|
|
232
260
|
end
|
|
233
|
-
|
|
261
|
+
rescue StandardError => _e
|
|
262
|
+
orig
|
|
234
263
|
end
|
|
235
264
|
end
|
|
236
265
|
end
|