monetra-ruby 0.0.6

Sign up to get free protection for your applications and to get access to all the features.
Files changed (93) hide show
  1. data/Rakefile +35 -0
  2. data/lib/monetra.rb +239 -0
  3. data/lib/monetra/active_support.rb +42 -0
  4. data/lib/monetra/active_support/binding_of_caller.rb +84 -0
  5. data/lib/monetra/active_support/breakpoint.rb +523 -0
  6. data/lib/monetra/active_support/caching_tools.rb +62 -0
  7. data/lib/monetra/active_support/clean_logger.rb +38 -0
  8. data/lib/monetra/active_support/core_ext.rb +1 -0
  9. data/lib/monetra/active_support/core_ext/array.rb +7 -0
  10. data/lib/monetra/active_support/core_ext/array/conversions.rb +72 -0
  11. data/lib/monetra/active_support/core_ext/array/grouping.rb +46 -0
  12. data/lib/monetra/active_support/core_ext/bigdecimal.rb +3 -0
  13. data/lib/monetra/active_support/core_ext/bigdecimal/formatting.rb +7 -0
  14. data/lib/monetra/active_support/core_ext/blank.rb +50 -0
  15. data/lib/monetra/active_support/core_ext/cgi.rb +5 -0
  16. data/lib/monetra/active_support/core_ext/cgi/escape_skipping_slashes.rb +14 -0
  17. data/lib/monetra/active_support/core_ext/class.rb +3 -0
  18. data/lib/monetra/active_support/core_ext/class/attribute_accessors.rb +44 -0
  19. data/lib/monetra/active_support/core_ext/class/inheritable_attributes.rb +115 -0
  20. data/lib/monetra/active_support/core_ext/class/removal.rb +24 -0
  21. data/lib/monetra/active_support/core_ext/date.rb +6 -0
  22. data/lib/monetra/active_support/core_ext/date/conversions.rb +39 -0
  23. data/lib/monetra/active_support/core_ext/enumerable.rb +62 -0
  24. data/lib/monetra/active_support/core_ext/exception.rb +33 -0
  25. data/lib/monetra/active_support/core_ext/hash.rb +13 -0
  26. data/lib/monetra/active_support/core_ext/hash/conversions.rb +148 -0
  27. data/lib/monetra/active_support/core_ext/hash/diff.rb +11 -0
  28. data/lib/monetra/active_support/core_ext/hash/indifferent_access.rb +88 -0
  29. data/lib/monetra/active_support/core_ext/hash/keys.rb +53 -0
  30. data/lib/monetra/active_support/core_ext/hash/reverse_merge.rb +25 -0
  31. data/lib/monetra/active_support/core_ext/integer.rb +7 -0
  32. data/lib/monetra/active_support/core_ext/integer/even_odd.rb +24 -0
  33. data/lib/monetra/active_support/core_ext/integer/inflections.rb +15 -0
  34. data/lib/monetra/active_support/core_ext/kernel.rb +4 -0
  35. data/lib/monetra/active_support/core_ext/kernel/agnostics.rb +11 -0
  36. data/lib/monetra/active_support/core_ext/kernel/daemonizing.rb +15 -0
  37. data/lib/monetra/active_support/core_ext/kernel/reporting.rb +51 -0
  38. data/lib/monetra/active_support/core_ext/kernel/requires.rb +24 -0
  39. data/lib/monetra/active_support/core_ext/load_error.rb +38 -0
  40. data/lib/monetra/active_support/core_ext/logger.rb +16 -0
  41. data/lib/monetra/active_support/core_ext/module.rb +7 -0
  42. data/lib/monetra/active_support/core_ext/module/aliasing.rb +57 -0
  43. data/lib/monetra/active_support/core_ext/module/attr_internal.rb +31 -0
  44. data/lib/monetra/active_support/core_ext/module/attribute_accessors.rb +44 -0
  45. data/lib/monetra/active_support/core_ext/module/delegation.rb +41 -0
  46. data/lib/monetra/active_support/core_ext/module/inclusion.rb +11 -0
  47. data/lib/monetra/active_support/core_ext/module/introspection.rb +21 -0
  48. data/lib/monetra/active_support/core_ext/module/loading.rb +13 -0
  49. data/lib/monetra/active_support/core_ext/name_error.rb +20 -0
  50. data/lib/monetra/active_support/core_ext/numeric.rb +7 -0
  51. data/lib/monetra/active_support/core_ext/numeric/bytes.rb +44 -0
  52. data/lib/monetra/active_support/core_ext/numeric/time.rb +72 -0
  53. data/lib/monetra/active_support/core_ext/object.rb +2 -0
  54. data/lib/monetra/active_support/core_ext/object/extending.rb +47 -0
  55. data/lib/monetra/active_support/core_ext/object/misc.rb +34 -0
  56. data/lib/monetra/active_support/core_ext/pathname.rb +7 -0
  57. data/lib/monetra/active_support/core_ext/pathname/clean_within.rb +14 -0
  58. data/lib/monetra/active_support/core_ext/proc.rb +12 -0
  59. data/lib/monetra/active_support/core_ext/range.rb +5 -0
  60. data/lib/monetra/active_support/core_ext/range/conversions.rb +21 -0
  61. data/lib/monetra/active_support/core_ext/string.rb +13 -0
  62. data/lib/monetra/active_support/core_ext/string/access.rb +58 -0
  63. data/lib/monetra/active_support/core_ext/string/conversions.rb +19 -0
  64. data/lib/monetra/active_support/core_ext/string/inflections.rb +153 -0
  65. data/lib/monetra/active_support/core_ext/string/iterators.rb +17 -0
  66. data/lib/monetra/active_support/core_ext/string/starts_ends_with.rb +20 -0
  67. data/lib/monetra/active_support/core_ext/symbol.rb +12 -0
  68. data/lib/monetra/active_support/core_ext/time.rb +7 -0
  69. data/lib/monetra/active_support/core_ext/time/calculations.rb +188 -0
  70. data/lib/monetra/active_support/core_ext/time/conversions.rb +36 -0
  71. data/lib/monetra/active_support/dependencies.rb +187 -0
  72. data/lib/monetra/active_support/deprecation.rb +106 -0
  73. data/lib/monetra/active_support/inflections.rb +53 -0
  74. data/lib/monetra/active_support/inflector.rb +179 -0
  75. data/lib/monetra/active_support/json.rb +37 -0
  76. data/lib/monetra/active_support/json/encoders.rb +25 -0
  77. data/lib/monetra/active_support/json/encoders/core.rb +65 -0
  78. data/lib/monetra/active_support/option_merger.rb +25 -0
  79. data/lib/monetra/active_support/ordered_options.rb +50 -0
  80. data/lib/monetra/active_support/reloadable.rb +30 -0
  81. data/lib/monetra/active_support/values/time_zone.rb +180 -0
  82. data/lib/monetra/active_support/vendor/builder.rb +13 -0
  83. data/lib/monetra/active_support/vendor/builder/blankslate.rb +63 -0
  84. data/lib/monetra/active_support/vendor/builder/xchar.rb +112 -0
  85. data/lib/monetra/active_support/vendor/builder/xmlbase.rb +145 -0
  86. data/lib/monetra/active_support/vendor/builder/xmlevents.rb +63 -0
  87. data/lib/monetra/active_support/vendor/builder/xmlmarkup.rb +328 -0
  88. data/lib/monetra/active_support/vendor/flexmock.rb +84 -0
  89. data/lib/monetra/active_support/vendor/xml_simple.rb +1019 -0
  90. data/lib/monetra/active_support/version.rb +9 -0
  91. data/lib/monetra/active_support/whiny_nil.rb +38 -0
  92. data/test/test.rb +21 -0
  93. metadata +167 -0
@@ -0,0 +1,25 @@
1
+ module ActiveSupport #:nodoc:
2
+ module CoreExtensions #:nodoc:
3
+ module Hash #:nodoc:
4
+ # Allows for reverse merging where its the keys in the calling hash that wins over those in the <tt>other_hash</tt>.
5
+ # This is particularly useful for initializing an incoming option hash with default values:
6
+ #
7
+ # def setup(options = {})
8
+ # options.reverse_merge! :size => 25, :velocity => 10
9
+ # end
10
+ #
11
+ # The default :size and :velocity is only set if the +options+ passed in doesn't already have those keys set.
12
+ module ReverseMerge
13
+ def reverse_merge(other_hash)
14
+ other_hash.merge(self)
15
+ end
16
+
17
+ def reverse_merge!(other_hash)
18
+ replace(reverse_merge(other_hash))
19
+ end
20
+
21
+ alias_method :reverse_update, :reverse_merge
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,7 @@
1
+ require File.dirname(__FILE__) + '/integer/even_odd'
2
+ require File.dirname(__FILE__) + '/integer/inflections'
3
+
4
+ class Integer #:nodoc:
5
+ include ActiveSupport::CoreExtensions::Integer::EvenOdd
6
+ include ActiveSupport::CoreExtensions::Integer::Inflections
7
+ end
@@ -0,0 +1,24 @@
1
+ module ActiveSupport #:nodoc:
2
+ module CoreExtensions #:nodoc:
3
+ module Integer #:nodoc:
4
+ # For checking if a fixnum is even or odd.
5
+ # * 1.even? # => false
6
+ # * 1.odd? # => true
7
+ # * 2.even? # => true
8
+ # * 2.odd? # => false
9
+ module EvenOdd
10
+ def multiple_of?(number)
11
+ self % number == 0
12
+ end
13
+
14
+ def even?
15
+ multiple_of? 2
16
+ end
17
+
18
+ def odd?
19
+ !even?
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,15 @@
1
+ require File.dirname(__FILE__) + '/../../inflector' unless defined? Inflector
2
+ module ActiveSupport #:nodoc:
3
+ module CoreExtensions #:nodoc:
4
+ module Integer #:nodoc:
5
+ module Inflections
6
+ # 1.ordinalize # => "1st"
7
+ # 3.ordinalize # => "3rd"
8
+ # 10.ordinalize # => "10th"
9
+ def ordinalize
10
+ Inflector.ordinalize(self)
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,4 @@
1
+ require File.dirname(__FILE__) + '/kernel/daemonizing'
2
+ require File.dirname(__FILE__) + '/kernel/reporting'
3
+ require File.dirname(__FILE__) + '/kernel/agnostics'
4
+ require File.dirname(__FILE__) + '/kernel/requires'
@@ -0,0 +1,11 @@
1
+ class Object
2
+ # Makes backticks behave (somewhat more) similarly on all platforms.
3
+ # On win32 `nonexistent_command` raises Errno::ENOENT; on Unix, the
4
+ # spawned shell prints a message to stderr and sets $?. We emulate
5
+ # Unix on the former but not the latter.
6
+ def `(command) #:nodoc:
7
+ super
8
+ rescue Errno::ENOENT => e
9
+ STDERR.puts "#$0: #{e}"
10
+ end
11
+ end
@@ -0,0 +1,15 @@
1
+ module Kernel
2
+ # Turns the current script into a daemon process that detaches from the console.
3
+ # It can be shut down with a TERM signal.
4
+ def daemonize
5
+ exit if fork # Parent exits, child continues.
6
+ Process.setsid # Become session leader.
7
+ exit if fork # Zap session leader. See [1].
8
+ Dir.chdir "/" # Release old working directory.
9
+ File.umask 0000 # Ensure sensible umask. Adjust as needed.
10
+ STDIN.reopen "/dev/null" # Free file descriptors and
11
+ STDOUT.reopen "/dev/null", "a" # point them somewhere sensible.
12
+ STDERR.reopen STDOUT # STDOUT/ERR should better go to a logfile.
13
+ trap("TERM") { exit }
14
+ end
15
+ end
@@ -0,0 +1,51 @@
1
+ module Kernel
2
+ # Sets $VERBOSE to nil for the duration of the block and back to its original value afterwards.
3
+ #
4
+ # silence_warnings do
5
+ # value = noisy_call # no warning voiced
6
+ # end
7
+ #
8
+ # noisy_call # warning voiced
9
+ def silence_warnings
10
+ old_verbose, $VERBOSE = $VERBOSE, nil
11
+ yield
12
+ ensure
13
+ $VERBOSE = old_verbose
14
+ end
15
+
16
+ # Sets $VERBOSE to true for the duration of the block and back to its original value afterwards.
17
+ def enable_warnings
18
+ old_verbose, $VERBOSE = $VERBOSE, true
19
+ yield
20
+ ensure
21
+ $VERBOSE = old_verbose
22
+ end
23
+
24
+ # For compatibility
25
+ def silence_stderr #:nodoc:
26
+ silence_stream(STDERR) { yield }
27
+ end
28
+
29
+ # Silences any stream for the duration of the block.
30
+ #
31
+ # silence_stream(STDOUT) do
32
+ # puts 'This will never be seen'
33
+ # end
34
+ #
35
+ # puts 'But this will'
36
+ def silence_stream(stream)
37
+ old_stream = stream.dup
38
+ stream.reopen(RUBY_PLATFORM =~ /mswin/ ? 'NUL:' : '/dev/null')
39
+ stream.sync = true
40
+ yield
41
+ ensure
42
+ stream.reopen(old_stream)
43
+ end
44
+
45
+ def suppress(*exception_classes)
46
+ begin yield
47
+ rescue Exception => e
48
+ raise unless exception_classes.any? { |cls| e.kind_of?(cls) }
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,24 @@
1
+ module Kernel
2
+ # Require a library with fallback to RubyGems. Warnings during library
3
+ # loading are silenced to increase signal/noise for application warnings.
4
+ def require_library_or_gem(library_name)
5
+ silence_warnings do
6
+ begin
7
+ require library_name
8
+ rescue LoadError => cannot_require
9
+ # 1. Requiring the module is unsuccessful, maybe it's a gem and nobody required rubygems yet. Try.
10
+ begin
11
+ require 'rubygems'
12
+ rescue LoadError => rubygems_not_installed
13
+ raise cannot_require
14
+ end
15
+ # 2. Rubygems is installed and loaded. Try to load the library again
16
+ begin
17
+ require library_name
18
+ rescue LoadError => gem_not_installed
19
+ raise cannot_require
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,38 @@
1
+ class MissingSourceFile < LoadError #:nodoc:
2
+ attr_reader :path
3
+ def initialize(message, path)
4
+ super(message)
5
+ @path = path
6
+ end
7
+
8
+ def is_missing?(path)
9
+ path.gsub(/\.rb$/, '') == self.path.gsub(/\.rb$/, '')
10
+ end
11
+
12
+ def self.from_message(message)
13
+ REGEXPS.each do |regexp, capture|
14
+ match = regexp.match(message)
15
+ return MissingSourceFile.new(message, match[capture]) unless match.nil?
16
+ end
17
+ nil
18
+ end
19
+
20
+ REGEXPS = [
21
+ [/^no such file to load -- (.+)$/i, 1],
22
+ [/^Missing \w+ (file\s*)?([^\s]+.rb)$/i, 2],
23
+ [/^Missing API definition file in (.+)$/i, 1]
24
+ ] unless defined?(REGEXPS)
25
+ end
26
+
27
+ module ActiveSupport #:nodoc:
28
+ module CoreExtensions #:nodoc:
29
+ module LoadErrorExtensions #:nodoc:
30
+ module LoadErrorClassMethods #:nodoc:
31
+ def new(*args)
32
+ (self == LoadError && MissingSourceFile.from_message(args.first)) || super
33
+ end
34
+ end
35
+ ::LoadError.extend(LoadErrorClassMethods)
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,16 @@
1
+ # Adds the 'around_level' method to Logger.
2
+
3
+ class Logger
4
+ def self.define_around_helper(level)
5
+ module_eval <<-end_eval
6
+ def around_#{level}(before_message, after_message, &block)
7
+ self.#{level}(before_message)
8
+ return_value = block.call(self)
9
+ self.#{level}(after_message)
10
+ return return_value
11
+ end
12
+ end_eval
13
+ end
14
+ [:debug, :info, :error, :fatal].each {|level| define_around_helper(level) }
15
+
16
+ end
@@ -0,0 +1,7 @@
1
+ require File.dirname(__FILE__) + '/module/inclusion'
2
+ require File.dirname(__FILE__) + '/module/attribute_accessors'
3
+ require File.dirname(__FILE__) + '/module/attr_internal'
4
+ require File.dirname(__FILE__) + '/module/delegation'
5
+ require File.dirname(__FILE__) + '/module/introspection'
6
+ require File.dirname(__FILE__) + '/module/loading'
7
+ require File.dirname(__FILE__) + '/module/aliasing'
@@ -0,0 +1,57 @@
1
+ class Module
2
+ # Encapsulates the common pattern of:
3
+ #
4
+ # alias_method :foo_without_feature, :foo
5
+ # alias_method :foo, :foo_with_feature
6
+ #
7
+ # With this, you simply do:
8
+ #
9
+ # alias_method_chain :foo, :feature
10
+ #
11
+ # And both aliases are set up for you.
12
+ #
13
+ # Query and bang methods (foo?, foo!) keep the same punctuation:
14
+ #
15
+ # alias_method_chain :foo?, :feature
16
+ #
17
+ # is equivalent to
18
+ #
19
+ # alias_method :foo_without_feature?, :foo?
20
+ # alias_method :foo?, :foo_with_feature?
21
+ #
22
+ # so you can safely chain foo, foo?, and foo! with the same feature.
23
+ def alias_method_chain(target, feature)
24
+ # Strip out punctuation on predicates or bang methods since
25
+ # e.g. target?_without_feature is not a valid method name.
26
+ aliased_target, punctuation = target.to_s.sub(/([?!])$/, ''), $1
27
+ alias_method "#{aliased_target}_without_#{feature}#{punctuation}", target
28
+ alias_method target, "#{aliased_target}_with_#{feature}#{punctuation}"
29
+ end
30
+
31
+ # Allows you to make aliases for attributes, which includes
32
+ # getter, setter, and query methods.
33
+ #
34
+ # Example:
35
+ #
36
+ # class Content < ActiveRecord::Base
37
+ # # has a title attribute
38
+ # end
39
+ #
40
+ # class Email < ActiveRecord::Base
41
+ # alias_attribute :subject, :title
42
+ # end
43
+ #
44
+ # e = Email.find(1)
45
+ # e.title # => "Superstars"
46
+ # e.subject # => "Superstars"
47
+ # e.subject? # => true
48
+ # e.subject = "Megastars"
49
+ # e.title # => "Megastars"
50
+ def alias_attribute(new_name, old_name)
51
+ module_eval <<-STR, __FILE__, __LINE__+1
52
+ def #{new_name}; #{old_name}; end
53
+ def #{new_name}?; #{old_name}?; end
54
+ def #{new_name}=(v); self.#{old_name} = v; end
55
+ STR
56
+ end
57
+ end
@@ -0,0 +1,31 @@
1
+ class Module
2
+ # Declare an attribute reader backed by an internally-named instance variable.
3
+ def attr_internal_reader(*attrs)
4
+ attrs.each do |attr|
5
+ module_eval "def #{attr}() #{attr_internal_ivar_name(attr)} end"
6
+ end
7
+ end
8
+
9
+ # Declare an attribute writer backed by an internally-named instance variable.
10
+ def attr_internal_writer(*attrs)
11
+ attrs.each do |attr|
12
+ module_eval "def #{attr}=(v) #{attr_internal_ivar_name(attr)} = v end"
13
+ end
14
+ end
15
+
16
+ # Declare attributes backed by 'internal' instance variables names.
17
+ def attr_internal_accessor(*attrs)
18
+ attr_internal_reader *attrs
19
+ attr_internal_writer *attrs
20
+ end
21
+
22
+ alias_method :attr_internal, :attr_internal_accessor
23
+
24
+ private
25
+ mattr_accessor :attr_internal_naming_format
26
+ self.attr_internal_naming_format = '@_%s'
27
+
28
+ def attr_internal_ivar_name(attr)
29
+ attr_internal_naming_format % attr
30
+ end
31
+ end
@@ -0,0 +1,44 @@
1
+ # Extends the module object with module and instance accessors for class attributes,
2
+ # just like the native attr* accessors for instance attributes.
3
+ class Module # :nodoc:
4
+ def mattr_reader(*syms)
5
+ syms.each do |sym|
6
+ class_eval(<<-EOS, __FILE__, __LINE__)
7
+ unless defined? @@#{sym}
8
+ @@#{sym} = nil
9
+ end
10
+
11
+ def self.#{sym}
12
+ @@#{sym}
13
+ end
14
+
15
+ def #{sym}
16
+ @@#{sym}
17
+ end
18
+ EOS
19
+ end
20
+ end
21
+
22
+ def mattr_writer(*syms)
23
+ syms.each do |sym|
24
+ class_eval(<<-EOS, __FILE__, __LINE__)
25
+ unless defined? @@#{sym}
26
+ @@#{sym} = nil
27
+ end
28
+
29
+ def self.#{sym}=(obj)
30
+ @@#{sym} = obj
31
+ end
32
+
33
+ def #{sym}=(obj)
34
+ @@#{sym} = obj
35
+ end
36
+ EOS
37
+ end
38
+ end
39
+
40
+ def mattr_accessor(*syms)
41
+ mattr_reader(*syms)
42
+ mattr_writer(*syms)
43
+ end
44
+ end
@@ -0,0 +1,41 @@
1
+ class Module
2
+ # Provides a delegate class method to easily expose contained objects' methods
3
+ # as your own. Pass one or more methods (specified as symbols or strings)
4
+ # and the name of the target object as the final :to option (also a symbol
5
+ # or string). At least one method and the :to option are required.
6
+ #
7
+ # Delegation is particularly useful with Active Record associations:
8
+ # class Greeter < ActiveRecord::Base
9
+ # def hello() "hello" end
10
+ # def goodbye() "goodbye" end
11
+ # end
12
+ #
13
+ # class Foo < ActiveRecord::Base
14
+ # belongs_to :greeter
15
+ # delegate :hello, :to => :greeter
16
+ # end
17
+ #
18
+ # Foo.new.hello # => "hello"
19
+ # Foo.new.goodbye # => NoMethodError: undefined method `goodbye' for #<Foo:0x1af30c>
20
+ #
21
+ # Multiple delegates to the same target are allowed:
22
+ # class Foo < ActiveRecord::Base
23
+ # delegate :hello, :goodbye, :to => :greeter
24
+ # end
25
+ #
26
+ # Foo.new.goodbye # => "goodbye"
27
+ def delegate(*methods)
28
+ options = methods.pop
29
+ unless options.is_a?(Hash) && to = options[:to]
30
+ raise ArgumentError, "Delegation needs a target. Supply an options hash with a :to key as the last argument (e.g. delegate :hello, :to => :greeter)."
31
+ end
32
+
33
+ methods.each do |method|
34
+ module_eval(<<-EOS, "(__DELEGATION__)", 1)
35
+ def #{method}(*args, &block)
36
+ #{to}.__send__(#{method.inspect}, *args, &block)
37
+ end
38
+ EOS
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,11 @@
1
+ class Module
2
+ def included_in_classes
3
+ classes = []
4
+ ObjectSpace.each_object(Class) { |k| classes << k if k.included_modules.include?(self) }
5
+
6
+ classes.reverse.inject([]) do |unique_classes, klass|
7
+ unique_classes << klass unless unique_classes.collect { |k| k.to_s }.include?(klass.to_s)
8
+ unique_classes
9
+ end
10
+ end
11
+ end