rango 0.1.1.2.10 → 0.1.1.2.11
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.
- data/CHANGELOG +7 -0
- data/README.textile +2 -0
- data/bin/rango +5 -2
- data/lib/rango.rb +47 -78
- data/lib/rango/core_ext.rb +21 -0
- data/lib/rango/gv/router.rb +42 -0
- data/lib/rango/gv/scaffolding.rb +53 -0
- data/lib/rango/gv/static.rb +4 -5
- data/lib/rango/interactive.rb +18 -0
- data/lib/rango/logger.rb +14 -0
- data/lib/rango/mini.rb +0 -6
- data/lib/rango/mini_render.rb +16 -0
- data/lib/rango/mixins/logger.rb +19 -0
- data/lib/rango/mixins/message.rb +3 -3
- data/lib/rango/mixins/render.rb +5 -5
- data/lib/rango/mixins/rendering.rb +13 -13
- data/lib/rango/orm/README.textile +24 -0
- data/lib/rango/orm/tasks/datamapper.rake +40 -14
- data/lib/rango/orm/tasks/sequel.rake +21 -1
- data/lib/rango/path.rb +13 -0
- data/lib/rango/rack/request.rb +8 -4
- data/lib/rango/templates/helpers.rb +84 -86
- data/lib/rango/templates/template.rb +50 -53
- data/lib/rango/version.rb +1 -1
- data/spec/rango/controller_spec.rb +1 -0
- data/spec/rango/mixins/message_spec.rb +4 -4
- data/spec/rango/mixins/render_spec.rb +4 -4
- data/spec/rango/project_spec.rb +2 -0
- data/spec/rango/templates/template_spec.rb +18 -18
- data/stubs/{project → stack}/content/Gemfile.rbt +0 -0
- data/stubs/{project → stack}/content/Rakefile.rbt +0 -0
- data/stubs/{project → stack}/content/TODO.txt +0 -0
- data/stubs/{project → stack}/content/config.ru.rbt +0 -0
- data/stubs/{project → stack}/content/init.rb.rbt +4 -7
- data/stubs/{app → stack}/content/models.rb.rbt +0 -0
- data/stubs/stack/content/settings_local.rb.rbt +20 -0
- data/stubs/{project → stack}/content/spec/%name%/init_spec.rb.rbt +0 -0
- data/stubs/{project → stack}/content/spec/%name%/models_spec.rb.rbt +0 -0
- data/stubs/{project → stack}/content/spec/%name%/views_spec.rb.rbt +0 -0
- data/stubs/{project → stack}/content/spec/spec.opts +0 -0
- data/stubs/{project → stack}/content/spec/spec_helper.rb +0 -0
- data/stubs/{project → stack}/content/templates/base.html.haml.rbt +0 -0
- data/stubs/stack/content/templates/errors/404.html.haml +1 -0
- data/stubs/stack/content/templates/errors/500.html.haml +1 -0
- data/stubs/{project → stack}/content/templates/index.html.haml +0 -0
- data/stubs/{app → stack}/content/views.rb.rbt +13 -0
- data/stubs/{app → stack}/metadata.yml +0 -0
- data/stubs/{project → stack}/postprocess.rb +0 -0
- data/stubs/{project → stack}/setup.rb +0 -0
- metadata +82 -43
- data/lib/rango/orm/adapter.rb +0 -46
- data/lib/rango/orm/adapters/datamapper.rb +0 -26
- data/lib/rango/orm/adapters/sequel.rb +0 -18
- data/lib/rango/orm/orm.txt +0 -11
- data/lib/rango/orm/support/datamapper/support.rb +0 -17
- data/stubs/app/content/init.rb.rbt +0 -10
- data/stubs/app/setup.rb +0 -13
- data/stubs/bigapp/content/init.rb +0 -0
- data/stubs/bigapp/content/models/%model%.rb.rbt +0 -6
- data/stubs/bigapp/content/views/%controller%.rb.rbt +0 -10
- data/stubs/bigapp/content/views/application.rb +0 -0
- data/stubs/bigapp/metadata.yml +0 -3
- data/stubs/bigapp/setup.rb +0 -12
- data/stubs/project/content/settings.rb +0 -13
- data/stubs/project/content/settings_local.rb.rbt +0 -6
- data/stubs/project/metadata.yml +0 -3
data/CHANGELOG
CHANGED
@@ -33,3 +33,10 @@
|
|
33
33
|
* Shebang is just ruby rather than ruby1.9, so it plays well with rvm
|
34
34
|
* ImplicitRendering and ExplicitRendering mixins for using locals
|
35
35
|
vs. rendering in context of current controller instance
|
36
|
+
|
37
|
+
= Version 0.1.2, 10/12/2009, SHA1
|
38
|
+
* Sequel support
|
39
|
+
* Project generator renamed to stack generator
|
40
|
+
* Removed app and bigapp generators
|
41
|
+
* Added migration task for DataMapper
|
42
|
+
* Removed layer of ORM adapters
|
data/README.textile
CHANGED
@@ -31,11 +31,13 @@ rvm 1.9.1 ruby ./script/spec spec/rango/mixins/message_spec.rb
|
|
31
31
|
h1. Documentation
|
32
32
|
|
33
33
|
* "Wiki":http://wiki.github.com/botanicus/rango
|
34
|
+
* Presentation "Introduction to Rango":http://www.slideshare.net/botanicus/rango
|
34
35
|
* "Tutorial":http://wiki.github.com/botanicus/rango/tutorial
|
35
36
|
* "RDoc.info API Docs":http://rdoc.info/projects/botanicus/rango
|
36
37
|
* "Yardoc.org API Docs":http://yardoc.org/docs/botanicus-rango
|
37
38
|
* "Examples":http://github.com/botanicus/rango-examples
|
38
39
|
* "Bug reporting":http://github.com/botanicus/rango/issues
|
40
|
+
* "Caliper Code Metrics":http://devver.net/caliper/project?repo=git%3A%2F%2Fgithub.com%2Fbotanicus%2Frango.git
|
39
41
|
|
40
42
|
h1. Community
|
41
43
|
|
data/bin/rango
CHANGED
@@ -1,6 +1,10 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
# encoding: utf-8
|
3
3
|
|
4
|
+
if RUBY_VERSION < "1.9.1"
|
5
|
+
abort "Rango requires at least Ruby 1.9.1. If you run JRuby, please ensure you used the --1.9 switch for JRuby command, for example jruby --1.9 -S rango create project blog"
|
6
|
+
end
|
7
|
+
|
4
8
|
base = File.symlink?(__FILE__) ? File.readlink(__FILE__) : __FILE__
|
5
9
|
libdir = File.expand_path(File.join(File.dirname(base), "..", "lib"))
|
6
10
|
|
@@ -34,12 +38,11 @@ def usage
|
|
34
38
|
<<-HELP
|
35
39
|
=== Usage ===
|
36
40
|
rango create project mycoolproject Generate new site
|
37
|
-
rango create app mycoolapp Generate new application
|
38
41
|
HELP
|
39
42
|
end
|
40
43
|
|
41
44
|
begin
|
42
|
-
ARGV.shift # create
|
45
|
+
ARGV.shift || usage # create
|
43
46
|
generator_name = ARGV.shift
|
44
47
|
SimpleTemplater.logger = Rango.logger
|
45
48
|
templater = SimpleTemplater.new(:rango)
|
data/lib/rango.rb
CHANGED
@@ -1,104 +1,73 @@
|
|
1
1
|
# encoding: utf-8
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
require "rango/
|
3
|
+
if RUBY_VERSION < "1.9.1"
|
4
|
+
raise "Rango requires at least Ruby 1.9.1. If you run JRuby, please ensure you used the --1.9 switch for JRuby command."
|
5
|
+
end
|
6
|
+
|
7
|
+
require "rango/core_ext"
|
8
|
+
require "rubyexts/attribute"
|
8
9
|
|
9
10
|
rango_lib = File.dirname(__FILE__)
|
10
11
|
unless $:.include?(rango_lib) || $:.include?(File.expand_path(rango_lib))
|
11
12
|
$:.unshift(rango_lib)
|
12
13
|
end
|
13
14
|
|
14
|
-
if RUBY_VERSION < "1.9.1"
|
15
|
-
raise "Rango requires at least Ruby 1.9.1. If you run JRuby, please ensure you used the --1.9 switch for JRuby command, for example jruby --1.9 -S rango create project blog"
|
16
|
-
end
|
17
|
-
|
18
15
|
# It should solve problems with encoding in URL (flash messages) and templates
|
19
16
|
Encoding.default_internal = "utf-8"
|
20
17
|
|
21
|
-
module Rango
|
22
|
-
extend ApplicationMixin
|
23
|
-
def self.root
|
24
|
-
File.join(File.dirname(__FILE__), "rango")
|
25
|
-
end
|
26
|
-
end
|
27
|
-
|
28
|
-
require "rango/project"
|
29
|
-
|
30
18
|
module Rango
|
31
19
|
# all the helpers are in Rango::Helpers
|
32
20
|
# so if you want to register your own, just
|
33
21
|
# Rango::Helpers.send(:include, Pupu::Helpers)
|
34
22
|
Helpers ||= Module.new
|
35
23
|
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
# Rango.path
|
40
|
-
# # => /usr/lib/ruby/lib/ruby/site_ruby/1.8/rango
|
41
|
-
# @return [Path] Rango root path
|
42
|
-
def path
|
43
|
-
@path ||= MediaPath.new(self.root)
|
44
|
-
end
|
24
|
+
def self.root
|
25
|
+
File.expand_path(File.join(File.dirname(__FILE__), ".."))
|
26
|
+
end
|
45
27
|
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
# # => /usr/lib/ruby/lib/ruby/site_ruby/1.8/rango
|
50
|
-
# @return [RubyExts::Logger] Logger for logging framework-related stuff. For logging project-relating stuff please use Project.logger.
|
51
|
-
# @see Project::logger
|
52
|
-
def logger
|
53
|
-
@logger ||= RubyExts::Logger.new
|
54
|
-
end
|
28
|
+
def self.lib_root
|
29
|
+
File.join(self.root, "lib")
|
30
|
+
end
|
55
31
|
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
# @return [Boolean] Returns true if boot succeed or false if not. If ARGV includes "-i", IRB interactive session will start.
|
62
|
-
def boot(options = Hash.new, &block)
|
63
|
-
self.environment = options[:environment] if options[:environment]
|
64
|
-
block.call if block_given?
|
65
|
-
self.bootloaders.each do |name, bootloader|
|
66
|
-
logger.debug "Calling bootloader #{name}"
|
67
|
-
bootloader.call
|
68
|
-
end
|
69
|
-
end
|
32
|
+
def self.logger
|
33
|
+
@@logger
|
34
|
+
rescue
|
35
|
+
raise NameError, "You have to assign a logger to Rango.logger"
|
36
|
+
end
|
70
37
|
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
38
|
+
def self.logger=(logger)
|
39
|
+
require "rango/mixins/logger"
|
40
|
+
@@logger = logger.extend(LoggerMixin)
|
41
|
+
end
|
75
42
|
|
76
|
-
|
77
|
-
|
78
|
-
|
43
|
+
# @since 0.0.1
|
44
|
+
# @example
|
45
|
+
# Rango.boot # require init.rb
|
46
|
+
# Rango.boot { require_relative "config/init.rb" } # custom boot
|
47
|
+
# @param [Hash] options You can specify flat: true for sinatra-like flat application.
|
48
|
+
# @return [Boolean] Returns true if boot succeed or false if not. If ARGV includes "-i", IRB interactive session will start.
|
49
|
+
def self.boot(options = Hash.new, &block)
|
50
|
+
self.environment = options[:environment] if options[:environment]
|
51
|
+
block.call if block_given?
|
52
|
+
self.bootloaders.each do |name, bootloader|
|
53
|
+
logger.debug "Calling bootloader #{name}"
|
54
|
+
bootloader.call
|
79
55
|
end
|
56
|
+
end
|
80
57
|
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
end
|
58
|
+
# @since 0.0.2
|
59
|
+
def self.reboot(options = Hash.new)
|
60
|
+
self.boot(options.merge(force: true))
|
61
|
+
end
|
86
62
|
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
try_require "irb/completion" # some people can have ruby compliled without readline
|
97
|
-
Rango::Utils.load_rackup # so you can use Project.router etc
|
98
|
-
end
|
99
|
-
require "irb"
|
100
|
-
require "rango/utils"
|
101
|
-
IRB.start
|
102
|
-
end
|
63
|
+
attribute :bootloaders, Hash.new
|
64
|
+
def self.after_boot(name, &block)
|
65
|
+
self.bootloaders[name] = block
|
66
|
+
end
|
67
|
+
|
68
|
+
# Rango.loaded?("environments.rb")
|
69
|
+
def self.loaded?(relative_path) # would work just with Kernel#require, not with Kernel#load, I know that the name may be misleading, but better than required?
|
70
|
+
full_path = File.expand_path(File.join(File.dirname(__FILE__), relative_path))
|
71
|
+
$LOADED_FEATURES.any? { |file| file == full_path }
|
103
72
|
end
|
104
73
|
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
module Kernel
|
4
|
+
# @since 0.1.1.3
|
5
|
+
# @example
|
6
|
+
# try_require "term/ansicolor"
|
7
|
+
# @param [String] library Library to require.
|
8
|
+
# @return [Boolean] True if require was successful, false otherwise.
|
9
|
+
def try_require(library)
|
10
|
+
require library
|
11
|
+
rescue LoadError
|
12
|
+
return false
|
13
|
+
end
|
14
|
+
|
15
|
+
# @example require_gem "rubyexts", "rubyexts/logger"
|
16
|
+
def require_gem(gemname, library = gemname)
|
17
|
+
require library
|
18
|
+
rescue LoadError
|
19
|
+
raise LoadError, "You have to install #{gemname}!"
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require "rango/gv"
|
4
|
+
require "rango/mini"
|
5
|
+
|
6
|
+
# get("/").to(Rango::GV.defer do |request, response|
|
7
|
+
# if request.session[:user]
|
8
|
+
# LandingPages.dispatcher(:registered_user)
|
9
|
+
# else
|
10
|
+
# LandingPages.dispatcher(:unregistered_user)
|
11
|
+
# end
|
12
|
+
# end)
|
13
|
+
#
|
14
|
+
# - redirect in router
|
15
|
+
# - different action for iPhone vs. desktop
|
16
|
+
module Rango
|
17
|
+
module GV
|
18
|
+
def self.defer(&hook)
|
19
|
+
Rango::Mini.app do |request, response|
|
20
|
+
value = hook.call(request, response)
|
21
|
+
if value.respond_to?(:call)
|
22
|
+
return value.call(request.env)
|
23
|
+
elsif value.is_a?(Array) && value.length.eql?(3)
|
24
|
+
return value # if we use redirect
|
25
|
+
else
|
26
|
+
raise "Value returned from Rango::GV.defer has to be Rack response or Rack application. Returned value: #{value.inspect}"
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
# Usher has support for redirect, but Rango doesn't depend on
|
32
|
+
# any particular router and your router might not provide this
|
33
|
+
# functionality. In this case you can always use this generic view.
|
34
|
+
# get("/index.php").to(Rango::GV.redirect("/"))
|
35
|
+
def self.redirect(url, status = 302)
|
36
|
+
Rango::Mini.app do |request, response|
|
37
|
+
response.redirect(url, status)
|
38
|
+
return String.new
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
@@ -0,0 +1,53 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require "rango/gv"
|
4
|
+
require "rango/mini"
|
5
|
+
require "rango/mixins/render"
|
6
|
+
|
7
|
+
require "rango" # Rango.root
|
8
|
+
require "rango/project"
|
9
|
+
Rango::Template.template_paths.push(File.join(Rango.root, "templates"))
|
10
|
+
|
11
|
+
# NOTE: this is just proof of concept, do not use it so far!
|
12
|
+
# However this is the way how we can use CRUD in Rango.
|
13
|
+
module Rango
|
14
|
+
module GV
|
15
|
+
module Scaffolding
|
16
|
+
extend Rango::RenderMixin
|
17
|
+
def self.list(klass)
|
18
|
+
Rango::Mini.app do |request, response|
|
19
|
+
objects = klass.all
|
20
|
+
render "scaffolding/list.html", objects: objects
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
def self.show(klass)
|
25
|
+
Rango::Mini.app do |request, response|
|
26
|
+
object = klass.get(params[:id])
|
27
|
+
render "scaffolding/show.html", object: object
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
def self.new(klass)
|
32
|
+
Rango::Mini.app do |request, response|
|
33
|
+
render "scaffolding/new.html", object: klass.new
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
def self.create(klass, show_url)
|
38
|
+
Rango::Mini.app do |request, response|
|
39
|
+
klass.create!(params[:post])
|
40
|
+
response.redirect show_url
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
def self.destroy(klass, list_url)
|
45
|
+
Rango::Mini.app do |request, response|
|
46
|
+
object = klass.get(params[:id])
|
47
|
+
object.destroy
|
48
|
+
response.redirect list_url
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
data/lib/rango/gv/static.rb
CHANGED
@@ -5,17 +5,16 @@ require "rango/mini"
|
|
5
5
|
require "rango/mixins/render"
|
6
6
|
|
7
7
|
module Rango
|
8
|
-
extend Rango::RenderMixin
|
9
8
|
module GV
|
10
|
-
def self.static(template,
|
9
|
+
def self.static(template, scope = Object.new, context = Hash.new, &hook)
|
11
10
|
Rango::Mini.app do |request, response|
|
12
11
|
path = template || request.env["rango.router.params"][:template]
|
13
12
|
path = hook.call(path) unless hook.nil?
|
14
13
|
path = "#{path}.html" unless path.match(/\./)
|
15
14
|
Rango.logger.debug("Rendering '#{path}'")
|
16
|
-
# Rango::RenderMixin.
|
17
|
-
|
18
|
-
render path,
|
15
|
+
# Rango::RenderMixin.scope
|
16
|
+
context = context.call(request) if context.respond_to?(:call) # lambda { |request| {msg: request.message} }
|
17
|
+
Rango::RenderMixin.render path, scope, context
|
19
18
|
end
|
20
19
|
end
|
21
20
|
|
@@ -0,0 +1,18 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require "irb"
|
4
|
+
require "rango/utils"
|
5
|
+
require "rubyexts"
|
6
|
+
|
7
|
+
# Start IRB interactive session
|
8
|
+
# @since 0.0.1
|
9
|
+
def Rango.interactive
|
10
|
+
ARGV.delete("-i") # otherwise irb will read it
|
11
|
+
ENV["RACK_ENV"] = Rango.environment # for racksh
|
12
|
+
unless try_require("racksh/boot")
|
13
|
+
Rango.logger.info("For more goodies install racksh gem")
|
14
|
+
try_require "irb/completion" # some people can have ruby compliled without readline
|
15
|
+
Rango::Utils.load_rackup # so you can use Project.router etc
|
16
|
+
end
|
17
|
+
IRB.start
|
18
|
+
end
|
data/lib/rango/logger.rb
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require "rango"
|
4
|
+
require_gem "rubyexts", "rubyexts/logger"
|
5
|
+
|
6
|
+
# @since 0.0.1
|
7
|
+
# @example
|
8
|
+
# Rango.root
|
9
|
+
# # => /usr/lib/ruby/lib/ruby/site_ruby/1.8/rango
|
10
|
+
# @return [RubyExts::Logger] Logger for logging framework-related stuff. For logging project-relating stuff please use Project.logger.
|
11
|
+
# @see Project::logger
|
12
|
+
def Rango.logger
|
13
|
+
@@logger ||= RubyExts::Logger.new
|
14
|
+
end
|
data/lib/rango/mini.rb
CHANGED
@@ -1,16 +1,10 @@
|
|
1
1
|
# encoding: utf-8
|
2
2
|
|
3
|
-
# Rango::Mini is the most low-level part which can render
|
4
|
-
# templates standalone. More low-level is only the RenderMixin.
|
5
|
-
# See http://wiki.github.com/botanicus/rango/template-rendering
|
6
|
-
|
7
3
|
require "rango/router"
|
8
|
-
require "rango/mixins/render"
|
9
4
|
require "rango/rack/request"
|
10
5
|
|
11
6
|
module Rango
|
12
7
|
module Mini
|
13
|
-
include Rango::RenderMixin
|
14
8
|
extend self # so you can run Rango::Mini.app
|
15
9
|
def app(&block)
|
16
10
|
raise ArgumentError, "Block is required" unless block_given?
|
@@ -0,0 +1,16 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
# Rango::Mini is the most low-level part which can render
|
4
|
+
# templates standalone. More low-level is only the RenderMixin.
|
5
|
+
# See http://wiki.github.com/botanicus/rango/template-rendering
|
6
|
+
|
7
|
+
require "rango/mini"
|
8
|
+
require "rango/mixins/render"
|
9
|
+
|
10
|
+
module Rango
|
11
|
+
module MiniRender
|
12
|
+
include Rango::Mini
|
13
|
+
include Rango::RenderMixin
|
14
|
+
extend self # so you can run Rango::MiniRender.app
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
module Rango
|
4
|
+
module LoggerMixin
|
5
|
+
# Project.logger.inspect(@posts, item)
|
6
|
+
# Project.logger.inspect("@post" => @post)
|
7
|
+
# @since 0.0.1
|
8
|
+
def inspect(*args)
|
9
|
+
if args.first.is_a?(Hash) && args.length.eql?(1)
|
10
|
+
args.first.each do |name, value|
|
11
|
+
self.debug("#{name}: #{value.inspect}")
|
12
|
+
end
|
13
|
+
else
|
14
|
+
args = args.map { |arg| arg.inspect }
|
15
|
+
self.debug(*args)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
data/lib/rango/mixins/message.rb
CHANGED
@@ -8,10 +8,10 @@ module Rango
|
|
8
8
|
def self.included(controller)
|
9
9
|
# How to determine
|
10
10
|
# respond to not, it's a class
|
11
|
-
# if controller.instance_methods.include?(:
|
11
|
+
# if controller.instance_methods.include?(:context)
|
12
12
|
controller.class_eval do
|
13
|
-
def
|
14
|
-
@
|
13
|
+
def context
|
14
|
+
@context ||= super.merge!(message: self.message)
|
15
15
|
end
|
16
16
|
end
|
17
17
|
end
|