rango 0.1.1.2.10 → 0.1.1.2.11
Sign up to get free protection for your applications and to get access to all the features.
- 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
|