opal-activesupport 0.1.0 → 0.2.0

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 68c3aa1ca269d78c62c238b7d32662a999ab0078
4
- data.tar.gz: 5d55aed5af016912fdaabf71ac1a9470a153e01c
3
+ metadata.gz: 87d2b460105407cc966e27d833b627f9f35922e1
4
+ data.tar.gz: 5c55b9cc4c9093242d4944dcf1d414f1f5b9c6a9
5
5
  SHA512:
6
- metadata.gz: c17e86c15b2d703f89eb8a6ef63719fff43ecaf245917a4b7ed6327e4253c4511004466228b9368b5730d9126c1406adcabdf57c6a5fa851d210f0e0983f7f73
7
- data.tar.gz: f5f730351e43750e5a06747bbb2528776fe6cbf488eec25dbadeae2d309eb83a0b9fd5f4dc4012b2b91bdf797d60013dceaac09033a7c64c44b148adb8a729c8
6
+ metadata.gz: 95d565c00c6a4628ed6baa96cfc735525b76dae8fe3ca8eb985479c936dec6213f1105dd6831ee4bfeea45f08251f16c3c682f13df0d9f32f01031d33abc32c7
7
+ data.tar.gz: 6b4f61e61dd0ef07188ea84f940dd781144dc64e5965e035be4676d33aea6c4f5c5e95a8cb77b67f6f4f7e1796ae3e93f4633331e606b1a965154a94f92cb960
@@ -1,5 +1,5 @@
1
1
  module Opal
2
2
  module Activesupport
3
- VERSION = '0.1.0'
3
+ VERSION = '0.2.0'
4
4
  end
5
5
  end
@@ -1,5 +1,10 @@
1
+ require 'active_support/core_ext/array'
2
+ require 'active_support/core_ext/class'
1
3
  require 'active_support/core_ext/enumerable'
4
+ require 'active_support/core_ext/hash'
2
5
  require 'active_support/core_ext/integer'
6
+ require 'active_support/core_ext/kernel'
7
+ require 'active_support/core_ext/module'
3
8
  require 'active_support/core_ext/numeric'
4
9
  require 'active_support/core_ext/object'
5
10
  require 'active_support/core_ext/string'
@@ -0,0 +1 @@
1
+ require 'active_support/core_ext/array/extract_options'
@@ -0,0 +1,29 @@
1
+ class Hash
2
+ # By default, only instances of Hash itself are extractable.
3
+ # Subclasses of Hash may implement this method and return
4
+ # true to declare themselves as extractable. If a Hash
5
+ # is extractable, Array#extract_options! pops it from
6
+ # the Array when it is the last element of the Array.
7
+ def extractable_options?
8
+ instance_of?(Hash)
9
+ end
10
+ end
11
+
12
+ class Array
13
+ # Extracts options from a set of arguments. Removes and returns the last
14
+ # element in the array if it's a hash, otherwise returns a blank hash.
15
+ #
16
+ # def options(*args)
17
+ # args.extract_options!
18
+ # end
19
+ #
20
+ # options(1, 2) # => {}
21
+ # options(1, 2, a: :b) # => {:a=>:b}
22
+ def extract_options!
23
+ if last.is_a?(Hash) && last.extractable_options?
24
+ pop
25
+ else
26
+ {}
27
+ end
28
+ end
29
+ end
@@ -0,0 +1 @@
1
+ require 'active_support/core_ext/class/attribute'
@@ -0,0 +1,129 @@
1
+ require 'active_support/core_ext/kernel/singleton_class'
2
+ require 'active_support/core_ext/module/remove_method'
3
+ require 'active_support/core_ext/array/extract_options'
4
+
5
+ class Class
6
+ # Declare a class-level attribute whose value is inheritable by subclasses.
7
+ # Subclasses can change their own value and it will not impact parent class.
8
+ #
9
+ # class Base
10
+ # class_attribute :setting
11
+ # end
12
+ #
13
+ # class Subclass < Base
14
+ # end
15
+ #
16
+ # Base.setting = true
17
+ # Subclass.setting # => true
18
+ # Subclass.setting = false
19
+ # Subclass.setting # => false
20
+ # Base.setting # => true
21
+ #
22
+ # In the above case as long as Subclass does not assign a value to setting
23
+ # by performing <tt>Subclass.setting = _something_ </tt>, <tt>Subclass.setting</tt>
24
+ # would read value assigned to parent class. Once Subclass assigns a value then
25
+ # the value assigned by Subclass would be returned.
26
+ #
27
+ # This matches normal Ruby method inheritance: think of writing an attribute
28
+ # on a subclass as overriding the reader method. However, you need to be aware
29
+ # when using +class_attribute+ with mutable structures as +Array+ or +Hash+.
30
+ # In such cases, you don't want to do changes in places but use setters:
31
+ #
32
+ # Base.setting = []
33
+ # Base.setting # => []
34
+ # Subclass.setting # => []
35
+ #
36
+ # # Appending in child changes both parent and child because it is the same object:
37
+ # Subclass.setting << :foo
38
+ # Base.setting # => [:foo]
39
+ # Subclass.setting # => [:foo]
40
+ #
41
+ # # Use setters to not propagate changes:
42
+ # Base.setting = []
43
+ # Subclass.setting += [:foo]
44
+ # Base.setting # => []
45
+ # Subclass.setting # => [:foo]
46
+ #
47
+ # For convenience, an instance predicate method is defined as well.
48
+ # To skip it, pass <tt>instance_predicate: false</tt>.
49
+ #
50
+ # Subclass.setting? # => false
51
+ #
52
+ # Instances may overwrite the class value in the same way:
53
+ #
54
+ # Base.setting = true
55
+ # object = Base.new
56
+ # object.setting # => true
57
+ # object.setting = false
58
+ # object.setting # => false
59
+ # Base.setting # => true
60
+ #
61
+ # To opt out of the instance reader method, pass <tt>instance_reader: false</tt>.
62
+ #
63
+ # object.setting # => NoMethodError
64
+ # object.setting? # => NoMethodError
65
+ #
66
+ # To opt out of the instance writer method, pass <tt>instance_writer: false</tt>.
67
+ #
68
+ # object.setting = false # => NoMethodError
69
+ #
70
+ # To opt out of both instance methods, pass <tt>instance_accessor: false</tt>.
71
+ def class_attribute(*attrs)
72
+ options = attrs.extract_options!
73
+ instance_reader = options.fetch(:instance_accessor, true) && options.fetch(:instance_reader, true)
74
+ instance_writer = options.fetch(:instance_accessor, true) && options.fetch(:instance_writer, true)
75
+ instance_predicate = options.fetch(:instance_predicate, true)
76
+
77
+ attrs.each do |name|
78
+ define_singleton_method(name) { nil }
79
+ define_singleton_method("#{name}?") { !!public_send(name) } if instance_predicate
80
+
81
+ ivar = "@#{name}"
82
+
83
+ define_singleton_method("#{name}=") do |val|
84
+ singleton_class.class_eval do
85
+ remove_possible_method(name)
86
+ define_method(name) { val }
87
+ end
88
+
89
+ if singleton_class?
90
+ class_eval do
91
+ remove_possible_method(name)
92
+ define_method(name) do
93
+ if instance_variable_defined? ivar
94
+ instance_variable_get ivar
95
+ else
96
+ singleton_class.send name
97
+ end
98
+ end
99
+ end
100
+ end
101
+ val
102
+ end
103
+
104
+ if instance_reader
105
+ remove_possible_method name
106
+ define_method(name) do
107
+ if instance_variable_defined?(ivar)
108
+ instance_variable_get ivar
109
+ else
110
+ self.class.public_send name
111
+ end
112
+ end
113
+ define_method("#{name}?") { !!public_send(name) } if instance_predicate
114
+ end
115
+
116
+ attr_writer name if instance_writer
117
+ end
118
+ end
119
+
120
+ private
121
+
122
+ unless respond_to?(:singleton_class?)
123
+ def singleton_class?
124
+ # Opal doesn't place singleton at ancestors.first. Returning true here
125
+ # seems to work in Opal anyway.
126
+ true || ancestors.first != self
127
+ end
128
+ end
129
+ end
@@ -0,0 +1 @@
1
+ require 'active_support/core_ext/hash/indifferent_access'
@@ -0,0 +1,23 @@
1
+ require 'active_support/hash_with_indifferent_access'
2
+
3
+ class Hash
4
+
5
+ # Returns an <tt>ActiveSupport::HashWithIndifferentAccess</tt> out of its receiver:
6
+ #
7
+ # { a: 1 }.with_indifferent_access['a'] # => 1
8
+ def with_indifferent_access
9
+ ActiveSupport::HashWithIndifferentAccess.new_from_hash_copying_default(self)
10
+ end
11
+
12
+ # Called when object is nested under an object that receives
13
+ # #with_indifferent_access. This method will be called on the current object
14
+ # by the enclosing object and is aliased to #with_indifferent_access by
15
+ # default. Subclasses of Hash may overwrite this method to return +self+ if
16
+ # converting to an <tt>ActiveSupport::HashWithIndifferentAccess</tt> would not be
17
+ # desirable.
18
+ #
19
+ # b = { b: 1 }
20
+ # { a: b }.with_indifferent_access['a'] # calls b.nested_under_indifferent_access
21
+ # # => {"b"=>1}
22
+ alias nested_under_indifferent_access with_indifferent_access
23
+ end
@@ -0,0 +1 @@
1
+ require 'active_support/core_ext/kernel/singleton_class'
@@ -0,0 +1,6 @@
1
+ module Kernel
2
+ # class_eval on an object acts like singleton_class.class_eval.
3
+ def class_eval(*args, &block)
4
+ singleton_class.class_eval(*args, &block)
5
+ end
6
+ end
@@ -0,0 +1 @@
1
+ require 'active_support/core_ext/module/remove_method'
@@ -0,0 +1,15 @@
1
+ class Module
2
+ # Removes the named method, if it exists.
3
+ def remove_possible_method(method)
4
+ if method_defined?(method) || private_method_defined?(method)
5
+ undef_method(method)
6
+ end
7
+ end
8
+
9
+ # Replaces the existing method definition, if there is one, with the passed
10
+ # block as its body.
11
+ def redefine_method(method, &block)
12
+ remove_possible_method(method)
13
+ define_method(method, &block)
14
+ end
15
+ end
@@ -1 +1,2 @@
1
1
  require 'active_support/core_ext/object/blank'
2
+ require 'active_support/core_ext/object/try'
@@ -0,0 +1,100 @@
1
+ class Object
2
+ # Invokes the public method whose name goes as first argument just like
3
+ # +public_send+ does, except that if the receiver does not respond to it the
4
+ # call returns +nil+ rather than raising an exception.
5
+ #
6
+ # This method is defined to be able to write
7
+ #
8
+ # @person.try(:name)
9
+ #
10
+ # instead of
11
+ #
12
+ # @person.name if @person
13
+ #
14
+ # +try+ calls can be chained:
15
+ #
16
+ # @person.try(:spouse).try(:name)
17
+ #
18
+ # instead of
19
+ #
20
+ # @person.spouse.name if @person && @person.spouse
21
+ #
22
+ # +try+ will also return +nil+ if the receiver does not respond to the method:
23
+ #
24
+ # @person.try(:non_existing_method) #=> nil
25
+ #
26
+ # instead of
27
+ #
28
+ # @person.non_existing_method if @person.respond_to?(:non_existing_method) #=> nil
29
+ #
30
+ # +try+ returns +nil+ when called on +nil+ regardless of whether it responds
31
+ # to the method:
32
+ #
33
+ # nil.try(:to_i) # => nil, rather than 0
34
+ #
35
+ # Arguments and blocks are forwarded to the method if invoked:
36
+ #
37
+ # @posts.try(:each_slice, 2) do |a, b|
38
+ # ...
39
+ # end
40
+ #
41
+ # The number of arguments in the signature must match. If the object responds
42
+ # to the method the call is attempted and +ArgumentError+ is still raised
43
+ # in case of argument mismatch.
44
+ #
45
+ # If +try+ is called without arguments it yields the receiver to a given
46
+ # block unless it is +nil+:
47
+ #
48
+ # @person.try do |p|
49
+ # ...
50
+ # end
51
+ #
52
+ # You can also call try with a block without accepting an argument, and the block
53
+ # will be instance_eval'ed instead:
54
+ #
55
+ # @person.try { upcase.truncate(50) }
56
+ #
57
+ # Please also note that +try+ is defined on +Object+. Therefore, it won't work
58
+ # with instances of classes that do not have +Object+ among their ancestors,
59
+ # like direct subclasses of +BasicObject+. For example, using +try+ with
60
+ # +SimpleDelegator+ will delegate +try+ to the target instead of calling it on
61
+ # the delegator itself.
62
+ def try(*a, &b)
63
+ try!(*a, &b) if a.empty? || respond_to?(a.first)
64
+ end
65
+
66
+ # Same as #try, but will raise a NoMethodError exception if the receiver is not +nil+ and
67
+ # does not implement the tried method.
68
+
69
+ def try!(*a, &b)
70
+ if a.empty? && block_given?
71
+ if b.arity.zero?
72
+ instance_eval(&b)
73
+ else
74
+ yield self
75
+ end
76
+ else
77
+ public_send(*a, &b)
78
+ end
79
+ end
80
+ end
81
+
82
+ class NilClass
83
+ # Calling +try+ on +nil+ always returns +nil+.
84
+ # It becomes especially helpful when navigating through associations that may return +nil+.
85
+ #
86
+ # nil.try(:name) # => nil
87
+ #
88
+ # Without +try+
89
+ # @person && @person.children.any? && @person.children.first.name
90
+ #
91
+ # With +try+
92
+ # @person.try(:children).try(:first).try(:name)
93
+ def try(*args)
94
+ nil
95
+ end
96
+
97
+ def try!(*args)
98
+ nil
99
+ end
100
+ end
@@ -1,3 +1,5 @@
1
+ require 'active_support/core_ext/string/inflections'
2
+
1
3
  class String
2
4
  def parameterize
3
5
  self.downcase.strip.gsub(/\W+/, '-')
@@ -1,3 +1,5 @@
1
+ require 'active_support/inflector'
2
+
1
3
  class String
2
4
  def pluralize
3
5
  ActiveSupport::Inflector.pluralize(self)
@@ -6,4 +8,8 @@ class String
6
8
  def singularize
7
9
  ActiveSupport::Inflector.singularize(self)
8
10
  end
11
+
12
+ def constantize
13
+ ActiveSupport::Inflector.constantize(self)
14
+ end
9
15
  end
@@ -0,0 +1,34 @@
1
+ module ActiveSupport
2
+ class HashWithIndifferentAccess < Hash
3
+ # Returns +true+ so that <tt>Array#extract_options!</tt> finds members of
4
+ # this class.
5
+ def extractable_options?
6
+ true
7
+ end
8
+
9
+ def with_indifferent_access
10
+ dup
11
+ end
12
+
13
+ def nested_under_indifferent_access
14
+ self
15
+ end
16
+
17
+ def initialize(constructor = {})
18
+ if constructor.respond_to?(:to_hash)
19
+ super()
20
+ update(constructor)
21
+ else
22
+ super(constructor)
23
+ end
24
+ end
25
+
26
+ def self.new_from_hash_copying_default(hash)
27
+ hash = hash.to_hash
28
+ new(hash).tap do |new_hash|
29
+ new_hash.default = hash.default
30
+ new_hash.default_proc = hash.default_proc if hash.default_proc
31
+ end
32
+ end
33
+ end
34
+ end
@@ -1,3 +1,5 @@
1
+ require 'set'
2
+
1
3
  module ActiveSupport
2
4
  module Inflector
3
5
  extend self
@@ -10,6 +12,37 @@ module ActiveSupport
10
12
  end
11
13
  end
12
14
 
15
+ def constantize(camel_cased_word)
16
+ names = camel_cased_word.split('::')
17
+
18
+ # Trigger a built-in NameError exception including the ill-formed constant in the message.
19
+ Object.const_get(camel_cased_word) if names.empty?
20
+
21
+ # Remove the first blank element in case of '::ClassName' notation.
22
+ names.shift if names.size > 1 && names.first.empty?
23
+
24
+ names.inject(Object) do |constant, name|
25
+ if constant == Object
26
+ constant.const_get(name)
27
+ else
28
+ candidate = constant.const_get(name)
29
+ next candidate if constant.const_defined?(name, false)
30
+ next candidate unless Object.const_defined?(name)
31
+
32
+ # Go down the ancestors to check if it is owned directly. The check
33
+ # stops when we reach Object or the end of ancestors tree.
34
+ constant = constant.ancestors.inject do |const, ancestor|
35
+ break const if ancestor == Object
36
+ break ancestor if ancestor.const_defined?(name, false)
37
+ const
38
+ end
39
+
40
+ # owner is in Object, so raise
41
+ constant.const_get(name, false)
42
+ end
43
+ end
44
+ end
45
+
13
46
  def pluralize(word)
14
47
  apply_inflections(word, inflections.plurals)
15
48
  end
@@ -0,0 +1,49 @@
1
+ require 'spec_helper'
2
+
3
+ # require 'abstract_unit'
4
+ # require 'active_support/core_ext/array'
5
+ # require 'active_support/core_ext/hash'
6
+
7
+ class HashSubclass < Hash
8
+ end
9
+
10
+ class ExtractableHashSubclass < Hash
11
+ def extractable_options?
12
+ true
13
+ end
14
+ end
15
+
16
+ describe Array do
17
+ describe '#extract_options!' do
18
+ it 'extracts options' do
19
+ assert_equal({}, [].extract_options!)
20
+ assert_equal({}, [1].extract_options!)
21
+ assert_equal({ a: :b }, [{ a: :b }].extract_options!)
22
+ assert_equal({ a: :b }, [1, { a: :b }].extract_options!)
23
+ end
24
+
25
+ it 'doesnt extract hash subclasses' do
26
+ hash = HashSubclass.new
27
+ hash[:foo] = 1
28
+ array = [hash]
29
+ options = array.extract_options!
30
+ assert_equal({}, options)
31
+ assert_equal([hash], array)
32
+ end
33
+
34
+ it 'extracts extractable subclass' do
35
+ hash = ExtractableHashSubclass.new
36
+ hash[:foo] = 1
37
+ array = [hash]
38
+ options = array.extract_options!
39
+ assert_equal({ foo: 1 }, options)
40
+ assert_equal([], array)
41
+ end
42
+
43
+ it 'extracts hash with indifferent access' do
44
+ array = [{ foo: 1 }.with_indifferent_access]
45
+ options = array.extract_options!
46
+ assert_equal(1, options[:foo])
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,90 @@
1
+ require 'spec_helper'
2
+
3
+ describe Class do
4
+ before do
5
+ @klass = Class.new { class_attribute :setting }
6
+ @sub = Class.new(@klass)
7
+ end
8
+
9
+ it 'defaults to nil' do
10
+ assert_nil @klass.setting
11
+ assert_nil @sub.setting
12
+ end
13
+
14
+ it 'inheritable' do
15
+ @klass.setting = 1
16
+ assert_equal 1, @sub.setting
17
+ end
18
+
19
+ it 'overridable' do
20
+ @sub.setting = 1
21
+ assert_nil @klass.setting
22
+
23
+ @klass.setting = 2
24
+ assert_equal 1, @sub.setting
25
+
26
+ assert_equal 1, Class.new(@sub).setting
27
+ end
28
+
29
+ it 'predicate method' do
30
+ assert_equal false, @klass.setting?
31
+ @klass.setting = 1
32
+ assert_equal true, @klass.setting?
33
+ end
34
+
35
+ it 'instance reader delegates to class' do
36
+ assert_nil @klass.new.setting
37
+
38
+ @klass.setting = 1
39
+ assert_equal 1, @klass.new.setting
40
+ end
41
+
42
+ it 'instance override' do
43
+ object = @klass.new
44
+ object.setting = 1
45
+ assert_nil @klass.setting
46
+ @klass.setting = 2
47
+ assert_equal 1, object.setting
48
+ end
49
+
50
+ it 'instance predicate' do
51
+ object = @klass.new
52
+ assert_equal false, object.setting?
53
+ object.setting = 1
54
+ assert_equal true, object.setting?
55
+ end
56
+
57
+ it 'disabling instance writer' do
58
+ object = Class.new { class_attribute :setting, :instance_writer => false }.new
59
+ assert_raise(NoMethodError) { object.setting = 'boom' }
60
+ end
61
+
62
+ it 'disabling instance reader' do
63
+ object = Class.new { class_attribute :setting, :instance_reader => false }.new
64
+ assert_raise(NoMethodError) { object.setting }
65
+ assert_raise(NoMethodError) { object.setting? }
66
+ end
67
+
68
+ it 'disabling both instance writer and reader' do
69
+ object = Class.new { class_attribute :setting, :instance_accessor => false }.new
70
+ assert_raise(NoMethodError) { object.setting }
71
+ assert_raise(NoMethodError) { object.setting? }
72
+ assert_raise(NoMethodError) { object.setting = 'boom' }
73
+ end
74
+
75
+ it 'disabling instance predicate' do
76
+ object = Class.new { class_attribute :setting, instance_predicate: false }.new
77
+ assert_raise(NoMethodError) { object.setting? }
78
+ end
79
+
80
+ it 'works well with singleton classes' do
81
+ object = @klass.new
82
+ object.singleton_class.setting = 'foo'
83
+ assert_equal 'foo', object.setting
84
+ end
85
+
86
+ it 'setter returns set value' do
87
+ val = @klass.send(:setting=, 1)
88
+ assert_equal 1, val
89
+ end
90
+ end
@@ -0,0 +1,9 @@
1
+ require 'spec_helper'
2
+
3
+ describe 'Kernel' do
4
+ it 'adds class_eval to Object' do
5
+ o = Object.new
6
+ class << o; @x = 1; end
7
+ assert_equal 1, o.class_eval { @x }
8
+ end
9
+ end
@@ -0,0 +1,29 @@
1
+ require 'spec_helper'
2
+
3
+ module RemoveMethodTests
4
+ class A
5
+ def do_something
6
+ return 1
7
+ end
8
+ end
9
+ end
10
+
11
+ describe Module do
12
+ describe '#remove_possible_method' do
13
+ it 'removes method from an object' do
14
+ RemoveMethodTests::A.class_eval{
15
+ self.remove_possible_method(:do_something)
16
+ }
17
+ assert !RemoveMethodTests::A.new.respond_to?(:do_something)
18
+ end
19
+ end
20
+
21
+ describe '#redefine_method' do
22
+ it 'redefines method in an object' do
23
+ RemoveMethodTests::A.class_eval{
24
+ self.redefine_method(:do_something) { return 100 }
25
+ }
26
+ assert_equal 100, RemoveMethodTests::A.new.do_something
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,102 @@
1
+ require 'spec_helper'
2
+
3
+ describe Object do
4
+ describe '#try' do
5
+ before do
6
+ @string = "Hello"
7
+ end
8
+
9
+ it 'nonexisting method' do
10
+ method = :undefined_method
11
+ assert !@string.respond_to?(method)
12
+ assert_nil @string.try(method)
13
+ end
14
+
15
+ it 'nonexisting method with arguments' do
16
+ method = :undefined_method
17
+ assert !@string.respond_to?(method)
18
+ assert_nil @string.try(method, 'llo', 'y')
19
+ end
20
+
21
+ it 'nonexisting method bang' do
22
+ method = :undefined_method
23
+ assert !@string.respond_to?(method)
24
+ assert_raise(NoMethodError) { @string.try!(method) }
25
+ end
26
+
27
+ it 'nonexisting method with arguments bang' do
28
+ method = :undefined_method
29
+ assert !@string.respond_to?(method)
30
+ assert_raise(NoMethodError) { @string.try!(method, 'llo', 'y') }
31
+ end
32
+
33
+ it 'valid method' do
34
+ assert_equal 5, @string.try(:size)
35
+ end
36
+
37
+ it 'argument forwarding' do
38
+ assert_equal 'Hey', @string.try(:sub, 'llo', 'y')
39
+ end
40
+
41
+ it 'block forwarding' do
42
+ assert_equal 'Hey', @string.try(:sub, 'llo') { |match| 'y' }
43
+ end
44
+
45
+ it 'nil to type' do
46
+ assert_nil nil.try(:to_s)
47
+ assert_nil nil.try(:to_i)
48
+ end
49
+
50
+ it 'false try' do
51
+ assert_equal 'false', false.try(:to_s)
52
+ end
53
+
54
+ it 'try only block' do
55
+ assert_equal @string.reverse, @string.try { |s| s.reverse }
56
+ end
57
+
58
+ it 'try only block bang' do
59
+ assert_equal @string.reverse, @string.try! { |s| s.reverse }
60
+ end
61
+
62
+ it 'try only block nil' do
63
+ ran = false
64
+ nil.try { ran = true }
65
+ assert_equal false, ran
66
+ end
67
+
68
+ it 'try with instance eval block' do
69
+ assert_equal @string.reverse, @string.try { reverse }
70
+ end
71
+
72
+ it 'try with instance eval block bang' do
73
+ assert_equal @string.reverse, @string.try! { reverse }
74
+ end
75
+
76
+ it 'try with private method bang' do
77
+ klass = Class.new do
78
+ private
79
+
80
+ def private_method
81
+ 'private method'
82
+ end
83
+ end
84
+
85
+ # Opal doesn't currently support private methods
86
+ # assert_raise(NoMethodError) { klass.new.try!(:private_method) }
87
+ end
88
+
89
+ it 'try with private method' do
90
+ klass = Class.new do
91
+ private
92
+
93
+ def private_method
94
+ 'private method'
95
+ end
96
+ end
97
+
98
+ # Opal doesn't currently support private methods
99
+ # assert_nil klass.new.try(:private_method)
100
+ end
101
+ end
102
+ end
@@ -3,8 +3,20 @@ require 'opal-activesupport'
3
3
  require 'active_support/inflector'
4
4
 
5
5
  module TestUnitHelpers
6
+ def assert actual
7
+ expect(actual).to be_truthy
8
+ end
9
+
10
+ def assert_nil actual
11
+ expect(actual).to be_nil
12
+ end
13
+
6
14
  def assert_equal actual, expected
7
- actual.should == expected
15
+ expect(expected).to eq(actual)
16
+ end
17
+
18
+ def assert_raise error, &block
19
+ expect(&block).to raise_error(error)
8
20
  end
9
21
  end
10
22
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: opal-activesupport
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Elia Schito
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-02-03 00:00:00.000000000 Z
11
+ date: 2015-10-08 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: opal
@@ -76,24 +76,41 @@ files:
76
76
  - opal-activesupport.gemspec
77
77
  - opal/active_support.rb
78
78
  - opal/active_support/core_ext.rb
79
+ - opal/active_support/core_ext/array.rb
80
+ - opal/active_support/core_ext/array/extract_options.rb
81
+ - opal/active_support/core_ext/class.rb
82
+ - opal/active_support/core_ext/class/attribute.rb
79
83
  - opal/active_support/core_ext/enumerable.rb
84
+ - opal/active_support/core_ext/hash.rb
85
+ - opal/active_support/core_ext/hash/indifferent_access.rb
80
86
  - opal/active_support/core_ext/integer.rb
81
87
  - opal/active_support/core_ext/integer/time.rb
88
+ - opal/active_support/core_ext/kernel.rb
89
+ - opal/active_support/core_ext/kernel/singleton_class.rb
90
+ - opal/active_support/core_ext/module.rb
91
+ - opal/active_support/core_ext/module/remove_method.rb
82
92
  - opal/active_support/core_ext/numeric.rb
83
93
  - opal/active_support/core_ext/numeric/calculations.rb
84
94
  - opal/active_support/core_ext/numeric/time.rb
85
95
  - opal/active_support/core_ext/object.rb
86
96
  - opal/active_support/core_ext/object/blank.rb
87
97
  - opal/active_support/core_ext/object/json.rb
98
+ - opal/active_support/core_ext/object/try.rb
88
99
  - opal/active_support/core_ext/string.rb
89
100
  - opal/active_support/core_ext/string/inflections.rb
101
+ - opal/active_support/hash_with_indifferent_access.rb
90
102
  - opal/active_support/inflections.rb
91
103
  - opal/active_support/inflector.rb
92
104
  - opal/active_support/inflector/inflections.rb
93
105
  - opal/active_support/time.rb
94
106
  - opal/opal-activesupport.rb
107
+ - spec/core_ext/array/extract_options_spec.rb
108
+ - spec/core_ext/class/attribute_spec.rb
109
+ - spec/core_ext/kernel_spec.rb
110
+ - spec/core_ext/module/remove_method_spec.rb
95
111
  - spec/core_ext/numeric_spec.rb
96
112
  - spec/core_ext/object/blank_spec.rb
113
+ - spec/core_ext/object/try_spec.rb
97
114
  - spec/core_ext/string_spec.rb
98
115
  - spec/empty_bool.rb
99
116
  - spec/inflector_test_cases.rb
@@ -122,15 +139,19 @@ required_rubygems_version: !ruby/object:Gem::Requirement
122
139
  version: '0'
123
140
  requirements: []
124
141
  rubyforge_project:
125
- rubygems_version: 2.4.5
142
+ rubygems_version: 2.4.5.1
126
143
  signing_key:
127
144
  specification_version: 4
128
145
  summary: The port of the glorious ActiveSupport for Opal
129
146
  test_files:
147
+ - spec/core_ext/array/extract_options_spec.rb
148
+ - spec/core_ext/class/attribute_spec.rb
149
+ - spec/core_ext/kernel_spec.rb
150
+ - spec/core_ext/module/remove_method_spec.rb
130
151
  - spec/core_ext/numeric_spec.rb
131
152
  - spec/core_ext/object/blank_spec.rb
153
+ - spec/core_ext/object/try_spec.rb
132
154
  - spec/core_ext/string_spec.rb
133
155
  - spec/empty_bool.rb
134
156
  - spec/inflector_test_cases.rb
135
157
  - spec/spec_helper.rb
136
- has_rdoc: