autoforme 0.5.5 → 1.0.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/CHANGELOG +8 -0
- data/README.rdoc +12 -17
- data/Rakefile +10 -1
- data/lib/autoforme/framework.rb +1 -0
- data/lib/autoforme/frameworks/roda.rb +68 -0
- data/lib/autoforme/model.rb +1 -1
- data/lib/autoforme/models/sequel.rb +3 -3
- data/lib/autoforme/version.rb +1 -1
- data/lib/roda/plugins/autoforme.rb +52 -0
- data/spec/basic_spec.rb +1 -1
- data/spec/rails_spec_helper.rb +0 -1
- data/spec/roda_spec_helper.rb +56 -0
- data/spec/sinatra_spec_helper.rb +0 -1
- data/spec/spec_helper.rb +1 -7
- metadata +5 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 86f7ea431b13b17ae2f2c67a5051e58ed8f6bab8
|
4
|
+
data.tar.gz: 01fa45ac012900a4bebee2730aa8a415a88b0184
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ad900255d457cb444dd486118f45ee7127752439c4c72292431b1d020fed40abae4cb828bd8bf22bb3199443df6df0ece873ad85a678b5822212908eb3c8a93e
|
7
|
+
data.tar.gz: 2545e4f885fad140056be830b998d88be8771b5adaf8949b5e5e4ef4e9e37bbebfdd0a41cea47fc19f6c66757e21215c5804f48f138266d76988e4c644a2603a
|
data/CHANGELOG
CHANGED
@@ -1,3 +1,11 @@
|
|
1
|
+
=== 1.0.0 (2014-07-30)
|
2
|
+
|
3
|
+
* Assume :sequel model type (jeremyevans)
|
4
|
+
|
5
|
+
* Work without indifferent params (jeremyevans)
|
6
|
+
|
7
|
+
* Add support for roda web framework (jeremyevans)
|
8
|
+
|
1
9
|
=== 0.5.5 (2014-04-10)
|
2
10
|
|
3
11
|
* Make Models::Sequel#mtm_update compatible with Sequel 4.10+ (jeremyevans)
|
data/README.rdoc
CHANGED
@@ -3,7 +3,8 @@
|
|
3
3
|
AutoForme is an administrative web front end to an ORM that uses
|
4
4
|
Forme [1] for building the HTML forms. It is designed to
|
5
5
|
integrate easily into web frameworks, and currently supports
|
6
|
-
|
6
|
+
Sinatra, Roda, and Rails. The only currently supported ORM is
|
7
|
+
Sequel::Model.
|
7
8
|
|
8
9
|
AutoForme's UI and capabilities are modeled on
|
9
10
|
scaffolding_extensions [2], though AutoForme is considerably more
|
@@ -14,19 +15,16 @@ flexible in terms of configuration.
|
|
14
15
|
|
15
16
|
= Installation
|
16
17
|
|
17
|
-
|
18
|
+
gem install autoforme
|
18
19
|
|
19
|
-
=
|
20
|
+
= Links
|
20
21
|
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
= Source Code
|
28
|
-
|
29
|
-
Source code is available on GitHub at https://github.com/jeremyevans/autoforme
|
22
|
+
Demo Site :: http://autoforme-demo.jeremyevans.net
|
23
|
+
RDoc :: http://autoforme.jeremyevans.net
|
24
|
+
Source :: https://github.com/jeremyevans/autoforme
|
25
|
+
IRC :: irc://irc.freenode.net/forme
|
26
|
+
Google Group :: https://groups.google.com/forum/#!forum/ruby-forme
|
27
|
+
Bug Tracker :: https://github.com/jeremyevans/autoforme/issues
|
30
28
|
|
31
29
|
= Features
|
32
30
|
|
@@ -40,11 +38,11 @@ Source code is available on GitHub at https://github.com/jeremyevans/autoforme
|
|
40
38
|
|
41
39
|
= Basic Configuration
|
42
40
|
|
43
|
-
AutoForme is configured using a fairly simple DSL. Here is an example
|
41
|
+
AutoForme is configured using a fairly simple DSL. Here is an example
|
42
|
+
for Sinatra:
|
44
43
|
|
45
44
|
class App < Sinatra::Base
|
46
45
|
AutoForme.for(:sinatra, self) do
|
47
|
-
model_type :sequel
|
48
46
|
order [:name]
|
49
47
|
|
50
48
|
model Artist do
|
@@ -62,9 +60,6 @@ and the controller class (either a Sinatra::Base or ActionController::Base subcl
|
|
62
60
|
pass <tt>AutoForme.for</tt> a block, which is instance evaled at the framework level. This
|
63
61
|
level sets the defaults.
|
64
62
|
|
65
|
-
Inside the framework block, you first call model_type with a symbol representing the ORM you are
|
66
|
-
using. Currently, only Sequel is supported, so this should be :sequel.
|
67
|
-
|
68
63
|
The order call in the framework block sets the default order for all models.
|
69
64
|
|
70
65
|
The model calls in the framework block take a ORM model class. As only Sequel is currently
|
data/Rakefile
CHANGED
@@ -34,6 +34,16 @@ begin
|
|
34
34
|
task :default => [:spec]
|
35
35
|
spec_with_cov.call("spec", Dir["spec/*_spec.rb"], "Run specs with sinatra/sequel")
|
36
36
|
|
37
|
+
desc "Run specs with roda/sequel"
|
38
|
+
task :roda_spec do
|
39
|
+
begin
|
40
|
+
ENV['FRAMEWORK'] = 'roda'
|
41
|
+
Rake::Task[:spec].invoke
|
42
|
+
ensure
|
43
|
+
ENV.delete('FRAMEWORK')
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
37
47
|
desc "Run specs with rails/sequel"
|
38
48
|
task :rails_spec do
|
39
49
|
begin
|
@@ -55,7 +65,6 @@ end
|
|
55
65
|
RDOC_DEFAULT_OPTS = ["--quiet", "--line-numbers", "--inline-source", '--title', 'AutoForme: Web Administrative Console for Sinatra/Rails and Sequel']
|
56
66
|
|
57
67
|
begin
|
58
|
-
gem 'rdoc', '= 3.12.2'
|
59
68
|
gem 'hanna-nouveau'
|
60
69
|
RDOC_DEFAULT_OPTS.concat(['-f', 'hanna'])
|
61
70
|
rescue Gem::LoadError
|
data/lib/autoforme/framework.rb
CHANGED
@@ -0,0 +1,68 @@
|
|
1
|
+
module AutoForme
|
2
|
+
module Frameworks
|
3
|
+
class Roda < AutoForme::Framework
|
4
|
+
class Request < AutoForme::Request
|
5
|
+
def initialize(roda, path)
|
6
|
+
@controller = roda
|
7
|
+
@request = roda.request
|
8
|
+
@params = @request.params
|
9
|
+
@session = roda.session
|
10
|
+
captures = @request.captures
|
11
|
+
@env = @request.env
|
12
|
+
@method = @env['REQUEST_METHOD']
|
13
|
+
@model = captures[-2]
|
14
|
+
@action_type = captures[-1]
|
15
|
+
@path = path
|
16
|
+
@id = @params['id'] || ($1 if @env['PATH_INFO'] =~ %r{\A\/(\w+)\z})
|
17
|
+
end
|
18
|
+
|
19
|
+
# Redirect to the given path
|
20
|
+
def redirect(path)
|
21
|
+
@request.redirect(path)
|
22
|
+
end
|
23
|
+
|
24
|
+
# Whether the request is an asynchronous request
|
25
|
+
def xhr?
|
26
|
+
@env['HTTP_X_REQUESTED_WITH'] =~ /XMLHttpRequest/i
|
27
|
+
end
|
28
|
+
|
29
|
+
# Use Rack::Csrf for csrf protection if it is defined.
|
30
|
+
def csrf_token_hash
|
31
|
+
{::Rack::Csrf.field=>::Rack::Csrf.token(@env)} if defined?(::Rack::Csrf)
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
attr_reader :route_proc
|
36
|
+
|
37
|
+
# Return a proc that should be instance_execed in the Roda routing and
|
38
|
+
# and handles the route if it recognizes it, otherwise doing nothing.
|
39
|
+
def initialize(*)
|
40
|
+
super
|
41
|
+
framework = self
|
42
|
+
|
43
|
+
matchers = [:model, :action_type]
|
44
|
+
if framework.prefix
|
45
|
+
matchers.unshift(framework.prefix[1..-1])
|
46
|
+
end
|
47
|
+
|
48
|
+
@route_proc = lambda do
|
49
|
+
r = request
|
50
|
+
path = r.env['SCRIPT_NAME']
|
51
|
+
current_matchers = matchers.dup
|
52
|
+
current_matchers << lambda do
|
53
|
+
@autoforme_action = framework.action_for(Request.new(self, path))
|
54
|
+
end
|
55
|
+
|
56
|
+
r.on *current_matchers do
|
57
|
+
@autoforme_text = @autoforme_action.handle
|
58
|
+
opts = {:inline=>"<%= @autoforme_text %>"}
|
59
|
+
opts[:layout] = false if @autoforme_action.request.xhr?
|
60
|
+
view opts
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
register_framework(:roda, Frameworks::Roda)
|
68
|
+
end
|
data/lib/autoforme/model.rb
CHANGED
@@ -41,13 +41,13 @@ module AutoForme
|
|
41
41
|
ds = model_class.apply_filter(:association, request, ds)
|
42
42
|
end
|
43
43
|
|
44
|
-
v = params[ref[:key]]
|
44
|
+
v = params[ref[:key].to_s]
|
45
45
|
v = nil if v.to_s.strip == ''
|
46
46
|
if v
|
47
47
|
v = ds.first!(S.qualify(ds.model.table_name, ref.primary_key)=>v)
|
48
48
|
end
|
49
49
|
else
|
50
|
-
v = params[col]
|
50
|
+
v = params[col.to_s]
|
51
51
|
end
|
52
52
|
|
53
53
|
obj.send("#{column}=", v)
|
@@ -162,7 +162,7 @@ module AutoForme
|
|
162
162
|
params = request.params
|
163
163
|
ds = apply_associated_eager(:search, request, all_dataset_for(type, request))
|
164
164
|
columns_for(:search_form, request).each do |c|
|
165
|
-
if (v = params[c]) && !v.empty?
|
165
|
+
if (v = params[c.to_s]) && !v.empty?
|
166
166
|
if association?(c)
|
167
167
|
ref = model.association_reflection(c)
|
168
168
|
ads = ref.associated_dataset
|
data/lib/autoforme/version.rb
CHANGED
@@ -0,0 +1,52 @@
|
|
1
|
+
require 'autoforme'
|
2
|
+
|
3
|
+
class Roda
|
4
|
+
module RodaPlugins
|
5
|
+
module AutoForme
|
6
|
+
# Require the render plugin, since it is required.
|
7
|
+
def self.load_dependencies(app, opts={})
|
8
|
+
app.plugin :render
|
9
|
+
end
|
10
|
+
|
11
|
+
# If a block is given, automatically setup AutoForme using
|
12
|
+
# the options and block.
|
13
|
+
def self.configure(app, opts={}, &block)
|
14
|
+
app.instance_exec do
|
15
|
+
@autoforme_routes ||= {}
|
16
|
+
if block
|
17
|
+
autoforme(opts, &block)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
module ClassMethods
|
23
|
+
# Setup AutoForme for the given Roda class using the given
|
24
|
+
# options and block. If the :name option is given, store
|
25
|
+
# this configuration for the given name.
|
26
|
+
def autoforme(opts={}, &block)
|
27
|
+
@autoforme_routes[opts[:name]] = ::AutoForme.for(:roda, self, opts, &block).route_proc
|
28
|
+
end
|
29
|
+
|
30
|
+
# Retrieve the route proc for the named or default AutoForme.
|
31
|
+
def autoforme_route(name=nil)
|
32
|
+
@autoforme_routes[name]
|
33
|
+
end
|
34
|
+
|
35
|
+
# Copy the autoforme configurations into the subclass.
|
36
|
+
def inherited(subclass)
|
37
|
+
super
|
38
|
+
subclass.instance_variable_set(:@autoforme_routes, @autoforme_routes.dup)
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
module InstanceMethods
|
43
|
+
# If this route matches the named or default AutoForme route, dispatch to AutoForme.
|
44
|
+
def autoforme(name=nil)
|
45
|
+
instance_exec(&self.class.autoforme_route(name))
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
register_plugin(:autoforme, AutoForme)
|
51
|
+
end
|
52
|
+
end
|
data/spec/basic_spec.rb
CHANGED
data/spec/rails_spec_helper.rb
CHANGED
@@ -0,0 +1,56 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'roda'
|
3
|
+
require 'autoforme'
|
4
|
+
require 'rack/csrf'
|
5
|
+
|
6
|
+
class AutoFormeSpec::App < Roda
|
7
|
+
LAYOUT = <<HTML
|
8
|
+
<!DOCTYPE html>
|
9
|
+
<html>
|
10
|
+
<head><title><%= @autoforme_action.title if @autoforme_action %></title></head>
|
11
|
+
<body>
|
12
|
+
<% if flash[:notice] %>
|
13
|
+
<div class="alert alert-success"><p><%= flash[:notice] %></p></div>
|
14
|
+
<% end %>
|
15
|
+
<% if flash[:error] %>
|
16
|
+
<div class="alert alert-error"><p><%= flash[:error] %></p></div>
|
17
|
+
<% end %>
|
18
|
+
<%= yield %>
|
19
|
+
</body></html>"
|
20
|
+
HTML
|
21
|
+
|
22
|
+
use Rack::Session::Cookie, :secret => '1'
|
23
|
+
use Rack::Csrf
|
24
|
+
|
25
|
+
plugin :render, :layout=>{:inline=>LAYOUT}
|
26
|
+
plugin :not_found do
|
27
|
+
'Unhandled Request'
|
28
|
+
end
|
29
|
+
plugin :flash
|
30
|
+
|
31
|
+
def self.autoforme(klass=nil, opts={}, &block)
|
32
|
+
sc = Class.new(self)
|
33
|
+
framework = nil
|
34
|
+
sc.class_eval do
|
35
|
+
plugin :autoforme, opts do
|
36
|
+
framework = self
|
37
|
+
if klass
|
38
|
+
model(klass, &block)
|
39
|
+
elsif block
|
40
|
+
instance_eval(&block)
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
route do |r|
|
45
|
+
r.get 'session/set' do
|
46
|
+
session.merge!(r.params)
|
47
|
+
''
|
48
|
+
end
|
49
|
+
|
50
|
+
autoforme
|
51
|
+
end
|
52
|
+
end
|
53
|
+
[sc, framework]
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
data/spec/sinatra_spec_helper.rb
CHANGED
data/spec/spec_helper.rb
CHANGED
@@ -8,13 +8,7 @@ module AutoFormeSpec
|
|
8
8
|
end
|
9
9
|
|
10
10
|
require './spec/sequel_spec_helper'
|
11
|
-
|
12
|
-
case ENV['FRAMEWORK']
|
13
|
-
when 'rails'
|
14
|
-
require './spec/rails_spec_helper'
|
15
|
-
else
|
16
|
-
require './spec/sinatra_spec_helper'
|
17
|
-
end
|
11
|
+
require "./spec/#{ENV['FRAMEWORK'] || 'sinatra'}_spec_helper"
|
18
12
|
|
19
13
|
RSpec::Core::ExampleGroup.class_eval do
|
20
14
|
include Rack::Test::Methods
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: autoforme
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 1.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jeremy Evans
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-
|
11
|
+
date: 2014-07-30 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: forme
|
@@ -80,6 +80,7 @@ files:
|
|
80
80
|
- lib/autoforme/action.rb
|
81
81
|
- lib/autoforme/framework.rb
|
82
82
|
- lib/autoforme/frameworks/rails.rb
|
83
|
+
- lib/autoforme/frameworks/roda.rb
|
83
84
|
- lib/autoforme/frameworks/sinatra.rb
|
84
85
|
- lib/autoforme/model.rb
|
85
86
|
- lib/autoforme/models/sequel.rb
|
@@ -87,10 +88,12 @@ files:
|
|
87
88
|
- lib/autoforme/request.rb
|
88
89
|
- lib/autoforme/table.rb
|
89
90
|
- lib/autoforme/version.rb
|
91
|
+
- lib/roda/plugins/autoforme.rb
|
90
92
|
- spec/associations_spec.rb
|
91
93
|
- spec/basic_spec.rb
|
92
94
|
- spec/mtm_spec.rb
|
93
95
|
- spec/rails_spec_helper.rb
|
96
|
+
- spec/roda_spec_helper.rb
|
94
97
|
- spec/sequel_spec_helper.rb
|
95
98
|
- spec/sinatra_spec_helper.rb
|
96
99
|
- spec/spec_helper.rb
|