rango 0.1.1.3 → 0.2.pre

Sign up to get free protection for your applications and to get access to all the features.
Files changed (80) hide show
  1. data/CHANGELOG +17 -1
  2. data/Rakefile +8 -3
  3. data/bin/rango +0 -13
  4. data/lib/rango.rb +23 -12
  5. data/lib/rango/controller.rb +70 -57
  6. data/lib/rango/core_ext.rb +100 -17
  7. data/lib/rango/environments.rb +33 -19
  8. data/lib/rango/exceptions.rb +1 -1
  9. data/lib/rango/forms/form.rb +2 -1
  10. data/lib/rango/helpers/assets.rb +6 -1
  11. data/lib/rango/helpers/general.rb +1 -1
  12. data/lib/rango/mixins/action_args.rb +48 -0
  13. data/lib/rango/mixins/chainable.rb +66 -0
  14. data/lib/rango/mixins/filters.rb +12 -20
  15. data/lib/rango/mixins/logger.rb +1 -0
  16. data/lib/rango/mixins/message.rb +5 -6
  17. data/lib/rango/mixins/render.rb +1 -1
  18. data/lib/rango/orm/tasks/datamapper.rake +4 -4
  19. data/lib/rango/path.rb +6 -1
  20. data/lib/rango/rack/request.rb +18 -29
  21. data/lib/rango/router.rb +1 -1
  22. data/lib/rango/stacks/controller.rb +0 -1
  23. data/lib/rango/templates/exts/tilt.rb +3 -3
  24. data/lib/rango/templates/helpers.rb +55 -27
  25. data/lib/rango/templates/template.rb +11 -9
  26. data/spec/rango/controller_spec.rb +0 -1
  27. data/spec/rango/{loggers/fireruby_spec.rb → core_ext_spec.rb} +0 -0
  28. data/spec/rango/environments_spec.rb +6 -6
  29. data/spec/rango/{mixins/application_spec.rb → gv/router_spec.rb} +0 -0
  30. data/spec/rango/{orm/adapter_spec.rb → gv/scaffolding_spec.rb} +0 -0
  31. data/spec/rango/{orm/adapters/datamapper_spec.rb → mini_render_spec.rb} +0 -0
  32. data/spec/rango/mixins/action_args_spec.rb +78 -0
  33. data/spec/rango/{orm/adapters/sequel_spec.rb → mixins/chainable_spec.rb} +0 -0
  34. data/spec/rango/{orm/support/datamapper/support_spec.rb → mixins/logger_spec.rb} +0 -0
  35. data/spec/rango/mixins/message_spec.rb +4 -1
  36. data/spec/rango/mixins/render_spec.rb +1 -1
  37. data/spec/rango/{settings/erubis_spec.rb → path_spec.rb} +0 -0
  38. data/spec/rango/{settings/framework_spec.rb → stacks/controller_spec.rb} +0 -0
  39. data/spec/rango/{settings/haml_spec.rb → stacks/mini_spec.rb} +0 -0
  40. data/spec/rango/templates/helpers_spec.rb +125 -0
  41. data/spec/rango/templates/template_spec.rb +1 -2
  42. data/spec/rango/{settings/template_spec.rb → version_spec.rb} +0 -0
  43. data/spec/rango_spec.rb +6 -1
  44. data/spec/spec_helper.rb +8 -2
  45. data/spec/stubs/templates/_basic.html.erb +6 -0
  46. data/spec/stubs/templates/block/block.html.haml +2 -0
  47. data/spec/stubs/templates/block/blocks.html.haml +5 -0
  48. data/spec/stubs/templates/block/error.html.haml +2 -0
  49. data/spec/stubs/templates/block/getter.html.haml +3 -0
  50. data/spec/stubs/templates/block/value.html.haml +1 -0
  51. data/spec/stubs/templates/enhance_block/basic.html.haml +5 -0
  52. data/spec/stubs/templates/enhance_block/error.html.haml +3 -0
  53. data/spec/stubs/templates/enhance_block/name_error.html.haml +1 -0
  54. data/spec/stubs/templates/enhance_block/nil.html.haml +3 -0
  55. data/spec/stubs/templates/enhance_block/standalone.html.haml +2 -0
  56. data/spec/stubs/templates/extend_block/basic.html.haml +5 -0
  57. data/spec/stubs/templates/extend_block/error.html.haml +5 -0
  58. data/spec/stubs/templates/extend_block/error2.html.haml +1 -0
  59. data/spec/stubs/templates/extend_block/name_error.html.haml +1 -0
  60. data/spec/stubs/templates/extend_block/nil.html.haml +4 -0
  61. data/spec/stubs/templates/includes/base.html.haml +1 -0
  62. data/spec/stubs/templates/includes/basic.html.haml +1 -0
  63. data/spec/stubs/templates/includes/includes.html.haml +7 -0
  64. data/spec/stubs/templates/includes/integration.html.haml +4 -0
  65. data/spec/stubs/templates/includes/integration2.html.haml +4 -0
  66. data/spec/stubs/templates/library.html.haml +3 -0
  67. data/stubs/features/content/shared/.gitignore +0 -0
  68. data/stubs/stack/content/.gitignore +18 -0
  69. data/stubs/stack/content/.rvmrc.rbt +2 -0
  70. data/stubs/stack/content/Gemfile.rbt +8 -1
  71. data/stubs/stack/content/{settings_local.rb.rbt → environments.rb.rbt} +11 -0
  72. data/stubs/stack/content/init.rb.rbt +8 -4
  73. data/stubs/stack/content/media/.gitignore +0 -0
  74. data/stubs/stack/content/spec/spec_helper.rb +1 -1
  75. data/stubs/stack/content/views.rb.rbt +13 -5
  76. data/stubs/stack/postprocess.rb +2 -9
  77. metadata +62 -29
  78. data/lib/rango/logger.rb +0 -19
  79. data/lib/rango/loggers/fireruby.rb +0 -1
  80. data/lib/rango/mixins/application.rb +0 -27
data/CHANGELOG CHANGED
@@ -34,7 +34,7 @@
34
34
  * ImplicitRendering and ExplicitRendering mixins for using locals
35
35
  vs. rendering in context of current controller instance
36
36
 
37
- = Version 0.1.2, 13/12/2009, 22651050ea20e2997a9e5d07c8a409eb8e5de4fe
37
+ = Version 0.1.2, 13/12/2009
38
38
  * Sequel support
39
39
  * Project generator renamed to stack generator
40
40
  * Removed app and bigapp generators
@@ -44,3 +44,19 @@
44
44
  * Much more modular design
45
45
  * Removed dependencies, since you can use whichever subset of Rango
46
46
  * There is Rango::Router.app instead of Project.router
47
+
48
+ = Version 0.2.0, 24/12/2009
49
+ * Sequel support
50
+ * Logger is now configurable, you don't have to use any particular one
51
+ * Rango doesn't depend on RubyExts anymore
52
+ * Fixed status and headers settings in controller
53
+ * Fixed partial, extend_block and created includes for required-like functionality for templates
54
+ * Generators refactored, better env support
55
+ * Rango::Controller#redirect returns escaped location URL
56
+ * More modularity and granularity, Rango now plays nicely with other frameworks
57
+ * Refactored controller and it's now possible to write strategies for arguments passed to views
58
+ * ActionArgs for passing data from params to views (default behaviour in stack application)
59
+ * Rango itself use bundler rather than git submodules
60
+ * rake hooks will install task for removing whitespace in pre-commit hook, contributors should use it!
61
+ * Template helpers can work with paths relative to current template via ./path.html resp. ../path.html. All other paths are relative to the template paths.
62
+ * Use simple-logger as a default logger or standar logger if the simple-logger isn't installed.
data/Rakefile CHANGED
@@ -3,14 +3,19 @@
3
3
  require_relative "lib/rango/version"
4
4
 
5
5
  # ENV setup for external commands
6
- ENV["RUBYLIB"] = Dir["vendor/*/lib"].join(":")
7
- $LOAD_PATH.clear.push(*Dir["vendor/*/lib"])
6
+ ENV["RUBYLIB"] = Dir["gems/gems/*/lib"].join(":")
7
+ $LOAD_PATH.clear.push(*Dir["gems/gems/*/lib"])
8
8
 
9
9
  # http://support.runcoderun.com/faqs/builds/how-do-i-run-rake-with-trace-enabled
10
10
  Rake.application.options.trace = true
11
11
 
12
+ task :bundle do
13
+ # NOTE: the sense of the checkout is to avoid overwriting our changes in scripts
14
+ exec "gem bundle --cached && git checkout script"
15
+ end
16
+
12
17
  # default task for RunCodeRun.com
13
- task :default => ["submodules:init", :spec]
18
+ task :default => [:bundle, :spec]
14
19
 
15
20
  # load tasks
16
21
  Dir["tasks/*.rake"].each do |taskfile|
data/bin/rango CHANGED
@@ -8,17 +8,6 @@ end
8
8
  base = File.symlink?(__FILE__) ? File.readlink(__FILE__) : __FILE__
9
9
  libdir = File.expand_path(File.join(File.dirname(base), "..", "lib"))
10
10
 
11
- vendor = File.join(File.dirname(__FILE__), "..", "vendor")
12
- if File.directory?(vendor)
13
- Dir["#{vendor}/*"].each do |path|
14
- if File.directory?(path) && Dir["#{path}/*"].empty?
15
- warn "Dependency #{File.basename(path)} in vendor seems to be empty. Run git submodule init && git submodule update to checkout it."
16
- elsif File.directory?(path) && File.directory?(File.join(path, "lib"))
17
- $:.unshift(File.join(path, "lib"))
18
- end
19
- end
20
- end
21
-
22
11
  # because of system installation, there is bin/../lib, but not bin/../lib/rango
23
12
  if File.directory?(File.join(libdir, "rango"))
24
13
  $:.unshift(libdir) unless $:.include?(libdir)
@@ -31,7 +20,6 @@ rescue LoadError
31
20
  end
32
21
 
33
22
  require "rango"
34
- require "rango/logger"
35
23
 
36
24
  # === Helpers === #
37
25
  # TODO: Generators.each { |generator| puts generator.help }
@@ -45,7 +33,6 @@ end
45
33
  begin
46
34
  ARGV.shift || usage # create
47
35
  generator_name = ARGV.shift
48
- SimpleTemplater.logger = Rango.logger
49
36
  templater = SimpleTemplater.new(:rango)
50
37
  # This enables you to create custom generators for Rango
51
38
  load File.join(File.dirname(base), "..", "simple-templater.scope") # neccesary if we run rango locally and not from RubyGems
data/lib/rango.rb CHANGED
@@ -4,16 +4,11 @@ if RUBY_VERSION < "1.9.1"
4
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
5
  end
6
6
 
7
- require "rango/core_ext"
8
-
9
7
  rango_lib = File.dirname(__FILE__)
10
8
  unless $:.include?(rango_lib) || $:.include?(File.expand_path(rango_lib))
11
9
  $:.unshift(rango_lib)
12
10
  end
13
11
 
14
- # It should solve problems with encoding in URL (flash messages) and templates
15
- Encoding.default_internal = "utf-8"
16
-
17
12
  module Rango
18
13
  # all the helpers are in Rango::Helpers
19
14
  # so if you want to register your own, just
@@ -37,9 +32,17 @@ module Rango
37
32
  end
38
33
 
39
34
  def self.logger
40
- @@logger
41
- rescue
42
- raise NameError, "You have to assign a logger to Rango.logger"
35
+ @@logger ||= begin
36
+ require "simple-logger"
37
+ SimpleLogger::Logger.new(STDOUT).tap do |logger|
38
+ logger.auto_flush = true # disable in your code for production!
39
+ end
40
+ rescue LoadError
41
+ require "logger"
42
+ Logger.new(STDOUT).tap do |logger|
43
+ logger.warn("Using stdlib logger. If you want something more fancy with colors and #flush, install simple-logger.")
44
+ end
45
+ end
43
46
  end
44
47
 
45
48
  def self.logger=(logger)
@@ -89,13 +92,21 @@ module Rango
89
92
  require "irb"
90
93
  require "rango/utils"
91
94
 
92
- ARGV.delete("-i") # otherwise irb will read it
93
- ENV["RACK_ENV"] = Rango.environment # for racksh
94
- unless try_require("racksh/boot")
95
+ begin
96
+ require "racksh/boot"
97
+ rescue LoadError
95
98
  Rango.logger.info("For more goodies install racksh gem")
96
- try_require "irb/completion" # some people can have ruby compliled without readline
99
+ else
97
100
  Rango::Utils.load_rackup # so you can use Rango::Router.app etc
98
101
  end
102
+
103
+ begin
104
+ require "irb/completion"
105
+ rescue LoadError
106
+ # some people can have ruby compliled without readline
107
+ end
108
+
109
+ ARGV.delete("-i") # otherwise irb will read it
99
110
  IRB.start
100
111
  end
101
112
  end
@@ -2,100 +2,113 @@
2
2
 
3
3
  # http://wiki.github.com/botanicus/rango/controllers
4
4
 
5
+ require "forwardable"
5
6
  require "rango/router"
6
7
  require "rango/exceptions"
7
8
  require "rango/rack/request"
8
- require "rubyexts/attribute"
9
9
 
10
10
  module Rango
11
11
  class Controller
12
12
  include Rango::UrlHelper
13
+ extend Forwardable
14
+ # for routers
15
+ def self.dispatcher(action)
16
+ lambda do |env|
17
+ Rango.logger.info("Dispatching to #{self}##{action} [#{env["REQUEST_METHOD"]} #{env["PATH_INFO"]}]")
18
+ env["rango.controller.action"] = action
19
+ return self.call(env)
20
+ end
21
+ end
22
+
13
23
  # [master] Change Merb::Controller to respond to #call and return a Rack Array. (wycats)http://rubyurl.com/BhoY
14
24
  # @since 0.0.2
15
25
  def self.call(env)
16
- Rango::Router.set_rack_env(env)
17
- request = Rango::Request.new(env)
18
- options = env["rango.router.params"] || raise("rango.router.params property has to be setup at least to empty hash")
19
- controller = self.new(env, options.merge(request.params))
26
+ Rango::Router.set_rack_env(env) # TODO: this shouldn't require router stuff, it might emit an event
27
+ controller = self.new(env)
20
28
  controller.to_response
21
29
  end
22
30
 
23
- def to_response
24
- method = request.env["rango.controller.action"].to_sym
25
- if self.respond_to?(method) # TODO: what about method_missing?
26
- self.process_action(method)
31
+ def run_action
32
+ if self.respond_to?(self.action)
33
+ self.invoke_action(self.action)
27
34
  else
28
- raise NotFound, "Controller #{self.class.name} doesn't have method #{method}"
35
+ raise NotFound, "Controller #{self.class.name} doesn't have method #{self.action}"
29
36
  end
30
- return self.response.finish
31
- rescue HttpError => exception
32
- self.rescue_http_error(exception)
33
37
  end
34
38
 
35
- def process_action(method)
36
- # If you don't care about arguments or if you prefer usage of params.
37
- if self.method(method).arity.eql?(0)
38
- Rango.logger.debug("Calling method #{self.class.name}##{method} without arguments")
39
- self.response.body = self.method(method).call
40
- else
41
- args = self.params.values
42
- Rango.logger.debug("Calling method #{self.class.name}##{method} with arguments #{args.inspect}")
43
- self.response.body = self.method(method).call(*args)
44
- end
39
+ # default, redefine in plugin if you need to
40
+ def invoke_action(action)
41
+ Rango.logger.debug("Calling method #{self.class.name}##{action} without arguments")
42
+ self.response.body = self.send(action)
45
43
  end
46
44
 
47
- # for routers
48
- def self.dispatcher(action)
49
- lambda do |env|
50
- Rango.logger.info("Dispatching to #{self}##{action} [#{env["REQUEST_METHOD"]} #{env["PATH_INFO"]}]")
51
- env["rango.controller.action"] = action
52
- return self.call(env)
53
- end
45
+ def action
46
+ env["rango.controller.action"].to_sym
47
+ rescue NoMethodError
48
+ raise "You have to setup env['rango.controller.action'] to name of action you want to call"
54
49
  end
55
50
 
56
- # @since 0.0.1
57
- # @return [RubyExts::Logger] Logger for logging project related stuff.
58
- # @see RubyExts::Logger
59
- attribute :logger, Rango.logger
60
- attribute :status
61
- attribute :headers, Hash.new
51
+ def to_response
52
+ self.run_action
53
+ #self.response.finish # do we need this?
54
+ [response.status, response.headers, [response.body]] # this way we got real body rather than response object
55
+ rescue HttpError => exception
56
+ self.rescue_http_error(exception)
57
+ end
62
58
 
63
59
  # @since 0.0.1
64
- # @return [Rango::Request]
65
- # @see Rango::Request
66
- attr_accessor :request, :params, :cookies, :response
67
- # @since 0.0.1
68
- # @return [Hash] Hash with params from request. For example <code>{messages: {success: "You're logged in"}, post: {id: 2}}</code>
69
- attr_accessor :params
60
+ # @return [#debug, #info, #error, #fatal, #flush, #close] Logger for logging project related stuff.
61
+ def logger
62
+ Rango.logger
63
+ end
64
+
65
+ def_delegators :response, :status, :status=
66
+ def_delegators :response, :headers, :headers=
70
67
 
71
68
  # @since 0.0.2
69
+ # @return [String] Escaped URL (which is RFC recommendation)
72
70
  def redirect(url, options = Hash.new)
73
71
  self.status = 302
74
72
  self.headers["Location"] = URI.escape(url)
75
- return String.new
76
73
  end
77
74
 
78
- def initialize(env, params = Hash.new)
79
- @request = Rango::Request.new(env)
80
- @response = Rack::Response.new
81
- @params = params
82
- @cookies = request.cookies
83
- @session = request.session
84
- Rango.logger.inspect(params: params, cookies: cookies, session: session)
75
+ attr_reader :env
76
+ def initialize(env)
77
+ @env = env
78
+ end
79
+
80
+ def request
81
+ @request ||= Rango::Request.new(env)
82
+ end
83
+
84
+ def response
85
+ @response ||= Rack::Response.new
86
+ end
87
+
88
+ def_delegators :request, :cookies, :session
89
+
90
+ def router_params
91
+ @router_params ||= begin
92
+ self.env["rango.router.params"].symbolize_keys || raise("rango.router.params property has to be setup at least to empty hash")
93
+ end
94
+ end
95
+
96
+ def params
97
+ @params ||= self.request.params.merge(self.router_params).symbolize_keys
85
98
  end
86
- attr_reader :session
87
99
 
88
100
  # redefine this method for your controller if you want to provide custom error pages
89
101
  # returns response array for rack
90
102
  # if you need to change just body of error message, define render_http_error method
91
103
  # @api plugin
92
104
  def rescue_http_error(exception)
93
- status, headers, body = exception.to_response
94
- if self.respond_to?(:render_http_error)
95
- [status, headers, self.render_http_error(exception)]
96
- else
97
- [status, headers, body]
98
- end
105
+ # we need to call it before we assign the variables
106
+ body = self.render_http_error(exception)
107
+ [exception.status, exception.headers, body]
108
+ end
109
+
110
+ def render_http_error(exception)
111
+ "EXCEPTION"
99
112
  end
100
113
  end
101
114
  end
@@ -1,21 +1,104 @@
1
1
  # encoding: utf-8
2
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}!"
3
+ module Enumerable
4
+ # similar to
5
+ def inject!(&block)
6
+ self.inject(self.class.new, &block)
7
+ end
8
+ end
9
+
10
+ class String
11
+ ##
12
+ # Convert to snake case.
13
+ #
14
+ # "FooBar".snake_case #=> "foo_bar"
15
+ # "HeadlineCNNNews".snake_case #=> "headline_cnn_news"
16
+ # "CNN".snake_case #=> "cnn"
17
+ #
18
+ # @return [String] Receiver converted to snake case.
19
+ #
20
+ # @api public
21
+ def snake_case
22
+ return self.downcase if self =~ /^[A-Z]+$/
23
+ self.gsub(/([A-Z]+)(?=[A-Z][a-z]?)|\B[A-Z]/, '_\&') =~ /_*(.*)/
24
+ return $+.downcase
25
+ end
26
+
27
+ ##
28
+ # Convert to camel case.
29
+ #
30
+ # "foo_bar".camel_case #=> "FooBar"
31
+ #
32
+ # @return [String] Receiver converted to camel case.
33
+ #
34
+ # @api public
35
+ def camel_case
36
+ return self if self !~ /_/ && self =~ /[A-Z]+.*/
37
+ split('_').map{|e| e.capitalize}.join
38
+ end
39
+
40
+ ##
41
+ # Convert a path string to a constant name.
42
+ #
43
+ # "merb/core_ext/string".to_const_string #=> "Merb::CoreExt::String"
44
+ #
45
+ # @return [String] Receiver converted to a constant name.
46
+ #
47
+ # @api public
48
+ def to_const_string
49
+ gsub(/\/(.?)/) { "::#{$1.upcase}" }.gsub(/(?:^|_)(.)/) { $1.upcase }
50
+ end
51
+
52
+ ##
53
+ # Convert a constant name to a path, assuming a conventional structure.
54
+ #
55
+ # "FooBar::Baz".to_const_path # => "foo_bar/baz"
56
+ #
57
+ # @return [String] Path to the file containing the constant named by receiver
58
+ # (constantized string), assuming a conventional structure.
59
+ #
60
+ # @api public
61
+ def to_const_path
62
+ snake_case.gsub(/::/, "/")
63
+ end
64
+ end
65
+
66
+ class Hash
67
+ # Return duplication of self with all keys non-recursively converted to symbols
68
+ #
69
+ # @author Botanicus
70
+ # @since 0.0.2
71
+ # @return [Hash] A hash with all keys transformed into symbols
72
+ def symbolize_keys
73
+ self.inject(Hash.new) do |result, array|
74
+ result[array.first.to_sym] = array.last
75
+ result
76
+ end
77
+ end
78
+
79
+ # Replace keys in self by coresponding symbols
80
+ #
81
+ # @author Botanicus
82
+ # @since 0.0.2
83
+ # @return [Hash] A hash with all keys transformed into symbols
84
+ def symbolize_keys!
85
+ self.replace(self.symbolize_keys)
86
+ end
87
+
88
+ # Return duplication of self with all keys recursively converted to symbols
89
+ #
90
+ # @author Botanicus
91
+ # @since 0.0.2
92
+ # @return [Hash] A hash with all keys transformed into symbols even in inner hashes
93
+ def deep_symbolize_keys
94
+ self.inject(Hash.new) do |result, array|
95
+ key, value = array.first, array.last
96
+ if value.respond_to?(:symbolize_keys)
97
+ result[key.to_sym] = value.symbolize_keys
98
+ else
99
+ result[key.to_sym] = value
100
+ end
101
+ result
102
+ end
20
103
  end
21
104
  end
@@ -2,25 +2,39 @@
2
2
 
3
3
  # http://wiki.github.com/botanicus/rango/environments-support
4
4
 
5
- require "rubyexts/attribute"
6
-
7
5
  module Rango
8
- class << self
9
- # @since 0.0.1
10
- # @return [String] Returns current environment name.
11
- attribute :environment, "development"
12
-
13
- # clever environments support
14
- attribute :development_environments, ["development"]
15
- attribute :testing_environments, ["test", "spec", "cucumber"]
16
- attribute :production_environments, ["stage", "production"]
17
-
18
- questionable(:testing) { self.testing_environments.include?(Rango.environment) }
19
- questionable(:development) { self.development_environments.include?(Rango.environment) }
20
- questionable(:production) { self.production_environments.include?(Rango.environment) }
21
-
22
- def environment?(environment)
23
- self.environment.eql?(environment.to_s)
24
- end
6
+ # @since 0.0.1
7
+ # @return [String] Returns current environment name.
8
+ def self.environment
9
+ @@environment ||= "development"
10
+ end
11
+
12
+ def self.environment=(environment)
13
+ @@environment = environment
14
+ end
15
+
16
+ # clever environments support
17
+ def self.environments
18
+ @@environments ||= {
19
+ development: ["development"],
20
+ testing: ["test", "spec", "cucumber"],
21
+ production: ["stage", "production"]
22
+ }
23
+ end
24
+
25
+ def self.testing?
26
+ self.environments[:testing].include?(Rango.environment)
27
+ end
28
+
29
+ def self.development?
30
+ self.environments[:development].include?(Rango.environment)
31
+ end
32
+
33
+ def self.production?
34
+ self.environments[:production].include?(Rango.environment)
35
+ end
36
+
37
+ def self.environment?(environment)
38
+ self.environment.eql?(environment.to_s)
25
39
  end
26
40
  end