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.
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