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.
Files changed (66) hide show
  1. data/CHANGELOG +7 -0
  2. data/README.textile +2 -0
  3. data/bin/rango +5 -2
  4. data/lib/rango.rb +47 -78
  5. data/lib/rango/core_ext.rb +21 -0
  6. data/lib/rango/gv/router.rb +42 -0
  7. data/lib/rango/gv/scaffolding.rb +53 -0
  8. data/lib/rango/gv/static.rb +4 -5
  9. data/lib/rango/interactive.rb +18 -0
  10. data/lib/rango/logger.rb +14 -0
  11. data/lib/rango/mini.rb +0 -6
  12. data/lib/rango/mini_render.rb +16 -0
  13. data/lib/rango/mixins/logger.rb +19 -0
  14. data/lib/rango/mixins/message.rb +3 -3
  15. data/lib/rango/mixins/render.rb +5 -5
  16. data/lib/rango/mixins/rendering.rb +13 -13
  17. data/lib/rango/orm/README.textile +24 -0
  18. data/lib/rango/orm/tasks/datamapper.rake +40 -14
  19. data/lib/rango/orm/tasks/sequel.rake +21 -1
  20. data/lib/rango/path.rb +13 -0
  21. data/lib/rango/rack/request.rb +8 -4
  22. data/lib/rango/templates/helpers.rb +84 -86
  23. data/lib/rango/templates/template.rb +50 -53
  24. data/lib/rango/version.rb +1 -1
  25. data/spec/rango/controller_spec.rb +1 -0
  26. data/spec/rango/mixins/message_spec.rb +4 -4
  27. data/spec/rango/mixins/render_spec.rb +4 -4
  28. data/spec/rango/project_spec.rb +2 -0
  29. data/spec/rango/templates/template_spec.rb +18 -18
  30. data/stubs/{project → stack}/content/Gemfile.rbt +0 -0
  31. data/stubs/{project → stack}/content/Rakefile.rbt +0 -0
  32. data/stubs/{project → stack}/content/TODO.txt +0 -0
  33. data/stubs/{project → stack}/content/config.ru.rbt +0 -0
  34. data/stubs/{project → stack}/content/init.rb.rbt +4 -7
  35. data/stubs/{app → stack}/content/models.rb.rbt +0 -0
  36. data/stubs/stack/content/settings_local.rb.rbt +20 -0
  37. data/stubs/{project → stack}/content/spec/%name%/init_spec.rb.rbt +0 -0
  38. data/stubs/{project → stack}/content/spec/%name%/models_spec.rb.rbt +0 -0
  39. data/stubs/{project → stack}/content/spec/%name%/views_spec.rb.rbt +0 -0
  40. data/stubs/{project → stack}/content/spec/spec.opts +0 -0
  41. data/stubs/{project → stack}/content/spec/spec_helper.rb +0 -0
  42. data/stubs/{project → stack}/content/templates/base.html.haml.rbt +0 -0
  43. data/stubs/stack/content/templates/errors/404.html.haml +1 -0
  44. data/stubs/stack/content/templates/errors/500.html.haml +1 -0
  45. data/stubs/{project → stack}/content/templates/index.html.haml +0 -0
  46. data/stubs/{app → stack}/content/views.rb.rbt +13 -0
  47. data/stubs/{app → stack}/metadata.yml +0 -0
  48. data/stubs/{project → stack}/postprocess.rb +0 -0
  49. data/stubs/{project → stack}/setup.rb +0 -0
  50. metadata +82 -43
  51. data/lib/rango/orm/adapter.rb +0 -46
  52. data/lib/rango/orm/adapters/datamapper.rb +0 -26
  53. data/lib/rango/orm/adapters/sequel.rb +0 -18
  54. data/lib/rango/orm/orm.txt +0 -11
  55. data/lib/rango/orm/support/datamapper/support.rb +0 -17
  56. data/stubs/app/content/init.rb.rbt +0 -10
  57. data/stubs/app/setup.rb +0 -13
  58. data/stubs/bigapp/content/init.rb +0 -0
  59. data/stubs/bigapp/content/models/%model%.rb.rbt +0 -6
  60. data/stubs/bigapp/content/views/%controller%.rb.rbt +0 -10
  61. data/stubs/bigapp/content/views/application.rb +0 -0
  62. data/stubs/bigapp/metadata.yml +0 -3
  63. data/stubs/bigapp/setup.rb +0 -12
  64. data/stubs/project/content/settings.rb +0 -13
  65. data/stubs/project/content/settings_local.rb.rbt +0 -6
  66. 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
- require "ostruct"
4
- require "uri"
5
- require "media-path"
6
- require "rubyexts/logger"
7
- require "rango/mixins/application"
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
- class << self
37
- # @since 0.0.2
38
- # @example
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
- # @since 0.0.1
47
- # @example
48
- # Rango.root
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
- # @since 0.0.1
57
- # @example
58
- # Rango.boot # require init.rb
59
- # Rango.boot { require_relative "config/init.rb" } # custom boot
60
- # @param [Hash] options You can specify flat: true for sinatra-like flat application.
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
- # @since 0.0.2
72
- def reboot(options = Hash.new)
73
- self.boot(options.merge(force: true))
74
- end
38
+ def self.logger=(logger)
39
+ require "rango/mixins/logger"
40
+ @@logger = logger.extend(LoggerMixin)
41
+ end
75
42
 
76
- attribute :bootloaders, Hash.new
77
- def after_boot(name, &block)
78
- self.bootloaders[name] = block
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
- # Rango.loaded?("environments.rb")
82
- def 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?
83
- full_path = File.expand_path(File.join(File.dirname(__FILE__), relative_path))
84
- $LOADED_FEATURES.any? { |file| file == full_path }
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
- # Start IRB interactive session
88
- # @since 0.0.1
89
- def interactive
90
- require "rango/utils"
91
- require "rubyexts"
92
- ARGV.delete("-i") # otherwise irb will read it
93
- ENV["RACK_ENV"] = Rango.environment # for racksh
94
- unless try_require("racksh/boot")
95
- Rango.logger.info("For more goodies install racksh gem")
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
@@ -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, locals = nil, &hook)
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.context
17
- locals = locals.call(request) if locals.respond_to?(:call) # lambda { |request| {msg: request.message} }
18
- render path, locals
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
@@ -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
@@ -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?(:locals)
11
+ # if controller.instance_methods.include?(:context)
12
12
  controller.class_eval do
13
- def locals
14
- @locals ||= super.merge!(message: self.message)
13
+ def context
14
+ @context ||= super.merge!(message: self.message)
15
15
  end
16
16
  end
17
17
  end