sugarcube 1.5.9 → 1.6.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: 095bfec455df3479380c6c660fc39317b97129a8
4
- data.tar.gz: 14ec967daf20d6b0ea2090abd8098cab5c8c67d7
3
+ metadata.gz: 1e1417a3329f05a87872dd59e8472640896a337c
4
+ data.tar.gz: 0e5f00b2c3c673b4ba29f3661ffd3bc5c27f1f58
5
5
  SHA512:
6
- metadata.gz: 718f2a93953af262d767e716c69ac2f824a639c9a5835590666b023082573fb0a4df6a2f02cbfe30055db44f573b7af79734fae1b6ef5ac8b7e37d14e799cc96
7
- data.tar.gz: 65c9bab6c3b42c9de6c2ec3b977a5a685b7787080591e2883b1d754278bd228654ca73c8056d5f51c252eab2eaafda99e56c0667ed19b9586af6b9ab2d3e2f09
6
+ metadata.gz: 47cbe203746a7c8cee85d0382542e72175fab5e8e9d61230b2decff908cb2a34abda874df732bdd770edcfcb02fe67778b4aea5ce70a5f248f8c96f6d317e2a9
7
+ data.tar.gz: 9d5506c2fb6b8dfe7b3ec64538c8cdee291e77be03305d017010222e1515305d2d1bad5a44289574c7fd6fb94ba0182ecd0bf001c4e1d91854a875dee4b3d4a0
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- sugarcube (1.5.9)
4
+ sugarcube (1.6.0)
5
5
 
6
6
  GEM
7
7
  remote: https://rubygems.org/
@@ -2,27 +2,49 @@ class CAAnimation
2
2
 
3
3
  class << self
4
4
 
5
- def basic(target, key_path, options={}, &block)
5
+ private def _sugarcube_apply_animation_options(animation, options)
6
+ animation.duration = options[:duration] if options.key?(:duration)
7
+ animation.delegate = options[:delegate] if options.key?(:delegate)
8
+ animation.speed = options[:speed] if options.key?(:speed)
9
+ animation.repeatCount = options[:repeat] if options.key?(:repeat)
10
+ animation.repeatCount = options[:repeat_count] if options.key?(:repeat_count)
11
+ animation.repeatDuration = options[:repeat_duration] if options.key?(:repeat_duration)
12
+ animation.removedOnCompletion = options.fetch(:remove, true)
13
+ end
14
+
15
+ # If you pass a block, that block will be called at the end of the
16
+ # animation.
17
+ def basic(key_path, options={}, &block)
6
18
  animation = CABasicAnimation.animationWithKeyPath(key_path)
7
- animation.duration = options[:duration] if options[:duration]
8
- animation.delegate = options[:delegate] if options[:delegate]
19
+ _sugarcube_apply_animation_options(animation, options)
9
20
 
10
21
  if options.key?(:from) || options.key?(:to) || options.key?(:by)
11
- add_animation = options.fetch(:add, true)
22
+ animation.fromValue = options[:from] if options.key?(:from)
23
+ animation.toValue = options[:to] if options.key?(:to)
24
+ animation.byValue = options[:by] if options.key?(:by)
25
+ end
12
26
 
13
- animation.fromValue = options[:from] if options[:from]
14
- animation.toValue = options[:to] if options[:to]
15
- animation.byValue = options[:by] if options[:by]
16
- else
17
- add_animation = options.fetch(:add, false)
27
+ return animation
28
+ end
29
+
30
+ def keyframe(key_path, options={}, &block)
31
+ timing_function = options.fetch(:timing, KCAMediaTimingFunctionDefault)
32
+ if timing_function.is_a?(NSString)
33
+ timing_function = CAMediaTimingFunction.functionWithName(timing_function)
18
34
  end
35
+ fill_mode = options.fetch(:fill_mode, KCAFillModeForwards)
36
+
37
+ animation = CAKeyframeAnimation.animationWithKeyPath(key_path)
38
+ _sugarcube_apply_animation_options(animation, options)
39
+ animation.timingFunction = timing_function
40
+ animation.fillMode = fill_mode
19
41
 
20
- if add_animation
21
- target.addAnimation(animation, forKey:key_path)
22
- target.send("#{key_path}=", options[:to])
42
+ if options.key?(:values)
43
+ animation.values = options[:values]
44
+ elsif options.key?(:path)
45
+ animation.path = options[:path]
23
46
  end
24
47
 
25
- block.call(animation) if block
26
48
  return animation
27
49
  end
28
50
 
@@ -1,7 +1,44 @@
1
1
  class CALayer
2
2
 
3
3
  def basic_animation(key_path, options={})
4
- CAAnimation.basic(self, key_path, options)
4
+ animation = CAAnimation.basic(key_path, options)
5
+
6
+ should_add = options.fetch(:add, true)
7
+ if should_add
8
+ if should_add.is_a?(NSString)
9
+ name = should_add
10
+ else
11
+ name = key_path
12
+ end
13
+
14
+ self.addAnimation(animation, forKey: name)
15
+ end
16
+
17
+ if options.key?(:to)
18
+ self.setValue(options[:to], forKeyPath: key_path)
19
+ end
20
+
21
+ return animation
22
+ end
23
+
24
+ def keyframe_animation(key_path, options={})
25
+ animation = CAAnimation.keyframe(key_path, options)
26
+
27
+ should_add = options.fetch(:add, true)
28
+ if should_add
29
+ if should_add.is_a?(NSString)
30
+ name = should_add
31
+ else
32
+ name = key_path
33
+ end
34
+ self.addAnimation(animation, forKey: name)
35
+ end
36
+
37
+ if options.key?(:values)
38
+ self.setValue(options[:values].last, forKeyPath: key_path)
39
+ end
40
+
41
+ return animation
5
42
  end
6
43
 
7
44
  end
@@ -2,6 +2,22 @@ class UIView
2
2
 
3
3
  class << self
4
4
 
5
+ # This is an internal helper method to determine the animation options.
6
+ def sugarcube_animation_options(options)
7
+ animation_options = options[:options]
8
+ animation_options = animation_options.uianimationoption if animation_options.respond_to?(:uianimationoption)
9
+ unless animation_options
10
+ curve = options.fetch(:curve, UIViewAnimationOptionCurveEaseInOut)
11
+ curve = curve.uianimationoption if curve.respond_to?(:uianimationoption)
12
+
13
+ from_current = options.fetch(:from_current, true) ? UIViewAnimationOptionBeginFromCurrentState : 0
14
+ allow_interaction = options.fetch(:allow_interaction, false) ? UIViewAnimationOptionAllowUserInteraction : 0
15
+
16
+ animation_options = curve | from_current | allow_interaction
17
+ end
18
+ return animation_options
19
+ end
20
+
5
21
  # If options is a Numeric, it is used as the duration. Otherwise, duration
6
22
  # is an option, and defaults to 0.3. All the transition methods work this
7
23
  # way.
@@ -10,10 +26,10 @@ class UIView
10
26
  # @option options [Float] :damping Enables the "spring" animation. Value of 1.0 is a stiff spring.
11
27
  # @option options [Float] :velocity Used in a spring animation to set the initial velocity
12
28
  # @option options [Proc] :after A block that is executed when the animation is complete, useful for chaining (though the `animation_chain` method is better!)
13
- # @option options [Fixnum] :options The options parameter that is passed to the UIView.animateWithDuration(...) method. You can also use the more verbose options `:curve`, `:from_current`, and `:allow_interaction`
14
- # @option options [Fixnum] :curve The animation curve option. default: UIViewAnimationOptionCurveEaseIn
15
- # @option options [Boolean] :from_current Whether or not to have animations start from their current position (aka UIViewAnimationOptionBeginFromCurrentState)
16
- # @option options [Boolean] :allow_interaction aka UIViewAnimationOptionAllowUserInteraction
29
+ # @option options [Fixnum,Symbol] :options The options parameter that is passed to the UIView.animateWithDuration(...) method. You can also use the more intuitive options `:curve`, `:from_current`, and `:allow_interaction`. `uianimationcurve` symbols (e.g. :ease_in_out) are converted to Fixnum.
30
+ # @option options [Fixnum,Symbol] :curve The animation curve option. `uianimationcurve` symbols (e.g. :ease_in_out) are converted to Fixnum. default: UIViewAnimationOptionCurveEaseInOut
31
+ # @option options [Boolean] :from_current Whether or not to have animations start from their current position. default: true (aka UIViewAnimationOptionBeginFromCurrentState)
32
+ # @option options [Boolean] :allow_interaction default: false (aka UIViewAnimationOptionAllowUserInteraction)
17
33
  def animate(options={}, more_options={}, &animations)
18
34
  raise "animation block is required" unless animations
19
35
 
@@ -48,16 +64,7 @@ class UIView
48
64
  after_adjusted = nil
49
65
  end
50
66
 
51
- animation_options = options[:options]
52
- unless animation_options
53
- curve = options.fetch(:curve, UIViewAnimationOptionCurveEaseInOut)
54
- curve = curve.uianimationcurve if curve.is_a?(Symbol)
55
-
56
- from_current = options.fetch(:from_current, true) ? UIViewAnimationOptionBeginFromCurrentState : 0
57
- allow_interaction = options.fetch(:allow_interaction, false) ? UIViewAnimationOptionAllowUserInteraction : 0
58
-
59
- animation_options = curve | from_current
60
- end
67
+ animation_options = sugarcube_animation_options(options)
61
68
 
62
69
  if duration == 0 && delay == 0
63
70
  animations.call
@@ -443,7 +450,10 @@ class UIView
443
450
  end
444
451
 
445
452
  options[:duration] ||= default_duration
446
- options[:options] ||= UIViewAnimationOptionCurveEaseIn|UIViewAnimationOptionBeginFromCurrentState
453
+ unless options.key?(:options) || options.key?(:curve)
454
+ options[:options] = UIView.sugarcube_animation_options(curve: UIViewAnimationOptionCurveEaseIn)
455
+ end
456
+
447
457
  reset_transform = self.transform
448
458
  reset_after = ->(finished) do
449
459
  self.transform = reset_transform
@@ -504,7 +514,9 @@ class UIView
504
514
  reset_center = self.center
505
515
 
506
516
  options[:duration] ||= default_duration
507
- options[:options] ||= UIViewAnimationOptionCurveEaseOut
517
+ unless options.key?(:options) || options.key?(:curve)
518
+ options[:options] = UIView.sugarcube_animation_options(curve: UIViewAnimationOptionCurveEaseOut)
519
+ end
508
520
  options[:after] = after
509
521
 
510
522
  window = UIApplication.sharedApplication.windows[0]
@@ -6,7 +6,7 @@ class Fixnum
6
6
  # UIColor.colorWithRed(1.0, green:1.0, blue: 1.0, alpha:1.0)
7
7
  # UIColor.colorWithRed(1.0, green:1.0, blue: 1.0, alpha:0.33)
8
8
  def uicolor(alpha=nil)
9
- alpha = 1.0 if alpha.nil?
9
+ alpha ||= 1.0
10
10
 
11
11
  red = ((self & 0xFF0000) >> 16).to_f / 255.0
12
12
  green = ((self & 0xFF00) >> 8).to_f / 255.0
@@ -15,4 +15,8 @@ class Fixnum
15
15
  UIColor.colorWithRed(red, green:green, blue:blue, alpha:alpha.to_f)
16
16
  end
17
17
 
18
+ def cgcolor(alpha=nil)
19
+ self.uicolor(alpha).CGColor
20
+ end
21
+
18
22
  end
@@ -1,14 +1,20 @@
1
1
  class NSArray
2
2
 
3
3
  # [160, 210, 242].uicolor => 0xA0D2F2.uicolor
4
- def uicolor(alpha=1.0)
4
+ # [160, 210, 242, 0.5].uicolor => 0xA0D2F2.uicolor(0.5)
5
+ def uicolor(alpha=nil)
5
6
  red = self[0] / 255.0
6
7
  green = self[1] / 255.0
7
8
  blue = self[2] / 255.0
8
9
  if self[3]
9
10
  alpha = self[3]
10
11
  end
11
- UIColor.colorWithRed(red, green:green, blue:blue, alpha:alpha.to_f)
12
+ alpha ||= 1.0
13
+ UIColor.colorWithRed(red, green: green, blue: blue, alpha: alpha.to_f)
14
+ end
15
+
16
+ def cgcolor(alpha=nil)
17
+ self.uicolor(alpha).CGColor
12
18
  end
13
19
 
14
20
  end
@@ -13,4 +13,8 @@ class NSString
13
13
  img && img.uicolor(alpha)
14
14
  end
15
15
 
16
+ def cgcolor(alpha=nil)
17
+ self.uicolor(alpha).CGColor
18
+ end
19
+
16
20
  end
@@ -29,6 +29,10 @@ class Symbol
29
29
  color
30
30
  end
31
31
 
32
+ def cgcolor(alpha=nil)
33
+ self.uicolor(alpha).CGColor
34
+ end
35
+
32
36
  @uicolors__deprecated = {
33
37
  darkgray: :dark_gray,
34
38
  lightgray: :light_gray,
@@ -8,8 +8,12 @@ class UIColor
8
8
  end
9
9
  end
10
10
 
11
- def cgcolor
12
- self.CGColor
11
+ def cgcolor(alpha=nil)
12
+ if alpha
13
+ self.uicolor(alpha).CGColor
14
+ else
15
+ self.CGColor
16
+ end
13
17
  end
14
18
 
15
19
  # blends two colors by averaging the RGB and alpha components.
@@ -3,11 +3,15 @@ class UIImage
3
3
  # @return [UIColor]
4
4
  def uicolor(alpha=nil)
5
5
  color = UIColor.colorWithPatternImage(self)
6
- if not alpha.nil?
6
+ if alpha
7
7
  color = color.colorWithAlphaComponent(alpha.to_f)
8
8
  end
9
9
 
10
10
  color
11
11
  end
12
12
 
13
+ def cgcolor(alpha=nil)
14
+ self.uicolor(alpha).CGColor
15
+ end
16
+
13
17
  end
@@ -149,6 +149,11 @@ class Symbol
149
149
  end
150
150
  alias uiviewanimationcurve uianimationcurve
151
151
 
152
+ def uianimationoption
153
+ SugarCube.look_in(self, Symbol.uianimationoption)
154
+ end
155
+ alias uiviewanimationoption uianimationoption
156
+
152
157
  def uitablestyle
153
158
  SugarCube.look_in(self, Symbol.uitablestyle)
154
159
  end
@@ -271,6 +276,7 @@ class Symbol
271
276
  attr :uicontentmode
272
277
  attr :uicontentmode__deprecated
273
278
  attr :uianimationcurve
279
+ attr :uianimationoption
274
280
 
275
281
  attr :uitablestyle
276
282
  attr :uitablerowanimation
@@ -657,6 +663,35 @@ class Symbol
657
663
  linear: UIViewAnimationCurveLinear
658
664
  }
659
665
 
666
+ @uianimationoption = {
667
+ layout_subviews: UIViewAnimationOptionLayoutSubviews,
668
+ allow_user_interaction: UIViewAnimationOptionAllowUserInteraction,
669
+ begin_from_current_state: UIViewAnimationOptionBeginFromCurrentState,
670
+ repeat: UIViewAnimationOptionRepeat,
671
+ autoreverse: UIViewAnimationOptionAutoreverse,
672
+ override_inherited_duration: UIViewAnimationOptionOverrideInheritedDuration,
673
+ override_inherited_curve: UIViewAnimationOptionOverrideInheritedCurve,
674
+ allow_animated_content: UIViewAnimationOptionAllowAnimatedContent,
675
+ show_hide_transition_views: UIViewAnimationOptionShowHideTransitionViews,
676
+ override_inherited_options: UIViewAnimationOptionOverrideInheritedOptions,
677
+ curve_ease_in_out: UIViewAnimationOptionCurveEaseInOut,
678
+ ease_in_out: UIViewAnimationOptionCurveEaseInOut,
679
+ curve_ease_in: UIViewAnimationOptionCurveEaseIn,
680
+ ease_in: UIViewAnimationOptionCurveEaseIn,
681
+ curve_ease_out: UIViewAnimationOptionCurveEaseOut,
682
+ ease_out: UIViewAnimationOptionCurveEaseOut,
683
+ curve_linear: UIViewAnimationOptionCurveLinear,
684
+ linear: UIViewAnimationOptionCurveLinear,
685
+ transition_none: UIViewAnimationOptionTransitionNone,
686
+ transition_flip_from_left: UIViewAnimationOptionTransitionFlipFromLeft,
687
+ transition_flip_from_right: UIViewAnimationOptionTransitionFlipFromRight,
688
+ transition_curl_up: UIViewAnimationOptionTransitionCurlUp,
689
+ transition_curl_down: UIViewAnimationOptionTransitionCurlDown,
690
+ transition_cross_dissolve: UIViewAnimationOptionTransitionCrossDissolve,
691
+ transition_flip_from_top: UIViewAnimationOptionTransitionFlipFromTop,
692
+ transition_flip_from_bottom: UIViewAnimationOptionTransitionFlipFromBottom,
693
+ }
694
+
660
695
  @uitablestyle = {
661
696
  plain: UITableViewStylePlain,
662
697
  grouped: UITableViewStyleGrouped,
@@ -17,7 +17,7 @@ class UIActionSheet
17
17
  # # use one handler for all buttons
18
18
  # UIActionSheet.alert("title", buttons: [...]) { |button| }
19
19
  def self.alert(title, options={}, &block)
20
- if title.is_a?(Hash)
20
+ if title.is_a?(NSDictionary)
21
21
  options = title
22
22
  title = options[:title]
23
23
  end
@@ -49,9 +49,14 @@ class UIActionSheet
49
49
  raise 'If you only have one button, use a :success handler, not :cancel or :destructive'
50
50
  end
51
51
 
52
+ # the button titles, mapped to how UIActionSheet orders them. These are
53
+ # passed to the success handler.
54
+ buttons_mapped = {}
55
+
52
56
  # cancelButtonTitle:destructiveButtonTitle:otherButtonTitles:
53
57
  # uses localized buttons in the actual alert
54
- if buttons.is_a?(Hash)
58
+ if buttons.is_a?(NSDictionary)
59
+ button_titles = buttons.keys
55
60
  if buttons.key?(:cancel)
56
61
  args << (buttons[:cancel] && buttons[:cancel].localized)
57
62
  else
@@ -64,19 +69,11 @@ class UIActionSheet
64
69
  end
65
70
  args.concat(buttons.select { |k, m| k != :cancel && k != :destructive }.map { |k, m| m && m.localized })
66
71
  else
72
+ button_titles = buttons
67
73
  args.concat(buttons.map { |m| m && m.localized })
68
74
  end
69
75
  args << nil # otherButtonTitles:..., nil
70
76
 
71
- # the button titles, mapped to how UIActionSheet orders them. These are
72
- # passed to the success handler.
73
- buttons_mapped = {}
74
- if buttons.is_a?(Hash)
75
- button_titles = buttons.keys
76
- else
77
- button_titles = buttons
78
- end
79
-
80
77
  if args[2] && args[3] # cancel && destructive buttons
81
78
  buttons_mapped[0] = button_titles[1] # destructiveIndex == 0, button == 1
82
79
  buttons_mapped[button_titles.length - 1] = button_titles[0] # cancelIndex == last, button == 0
@@ -19,7 +19,7 @@ class UIAlertView
19
19
  # success: proc{ |pressed| puts "pressed: #{pressed.inspect}" },
20
20
  # ) # pressed will be :ok or :no_way
21
21
  def self.alert(title, options={}, more_options={}, &block)
22
- if title.is_a?(Hash)
22
+ if title.is_a?(NSDictionary)
23
23
  options = title
24
24
  title = options[:title]
25
25
  message = options[:message]
@@ -59,22 +59,13 @@ class UIAlertView
59
59
  elsif options[:success]
60
60
  buttons << "OK"
61
61
  end
62
- elsif buttons.is_a?(Hash)
63
-
64
62
  elsif buttons.length == 1 && options[:cancel]
65
63
  raise "If you only have one button, use a :success handler, not :cancel (and definitely not BOTH)"
66
64
  end
67
65
 
68
- # the button titles. These are passed to the success handler.
69
- if buttons.is_a?(Hash)
70
- button_titles = buttons.keys
71
- else
72
- button_titles = buttons
73
- end
74
- delegate.buttons = button_titles
75
-
76
66
  # uses localized buttons in the actual alert
77
- if buttons.is_a?(Hash)
67
+ if buttons.is_a?(NSDictionary)
68
+ button_titles = buttons.keys
78
69
  if buttons.key?(:cancel)
79
70
  args << (buttons[:cancel] && buttons[:cancel].localized)
80
71
  else
@@ -82,8 +73,10 @@ class UIAlertView
82
73
  end
83
74
  args.concat(buttons.select { |k, m| k != :cancel }.map { |k, m| m && m.localized })
84
75
  else
76
+ button_titles = buttons
85
77
  args.concat(buttons.map { |m| m && m.localized })
86
78
  end
79
+ delegate.buttons = button_titles
87
80
  args << nil # otherButtonTitles:..., nil
88
81
 
89
82
  alert = self.alloc
@@ -51,15 +51,19 @@ class NSDate
51
51
  # and
52
52
  # <http://www.unicode.org/reports/tr35/tr35-19.html#Date_Field_Symbol_Table>
53
53
  # for more information about date format strings.
54
- def string_with_format(format)
54
+ def string_with_format(format, options={})
55
+ locale = options[:locale] || NSLocale.currentLocale
56
+ timezone = options[:timezone] || NSTimeZone.defaultTimeZone
57
+
55
58
  if format.is_a?(Symbol)
56
59
  formatters = SugarCubeFormats[format]
57
60
  raise "No format found for #{format.inspect}" unless formatters
61
+ locale = NSLocale.localeWithLocaleIdentifier "en_US"
58
62
  retval = ''
59
63
  formatters.each do |formatter|
60
64
  case formatter
61
65
  when Symbol
62
- retval << string_with_format(formatter.to_s)
66
+ retval << string_with_format(formatter.to_s, locale:locale, timezone:timezone)
63
67
  when String
64
68
  retval << formatter
65
69
  end
@@ -67,9 +71,10 @@ class NSDate
67
71
  return retval
68
72
  else
69
73
  format_template = NSDateFormatter.dateFormatFromTemplate(format, options:0,
70
- locale:NSLocale.currentLocale)
74
+ locale:locale)
71
75
  date_formatter = NSDateFormatter.new
72
76
  date_formatter.setDateFormat(format_template)
77
+ date_formatter.setTimeZone(timezone)
73
78
  return date_formatter.stringFromDate(self)
74
79
  end
75
80
  end
File without changes
@@ -1,3 +1,3 @@
1
1
  module SugarCube
2
- Version = '1.5.9'
2
+ Version = '1.6.0'
3
3
  end
@@ -0,0 +1,73 @@
1
+ describe CAAnimation do
2
+
3
+ describe "should have `basic` animation" do
4
+
5
+ it "should accept keypath" do
6
+ animation = CAAnimation.basic('opacity')
7
+ animation.keyPath.should == 'opacity'
8
+ end
9
+
10
+ it "should assign :to value" do
11
+ animation = CAAnimation.basic('opacity', to: 0)
12
+ animation.toValue.should == 0
13
+ end
14
+
15
+ it "should assign :from value" do
16
+ animation = CAAnimation.basic('opacity', from: 1)
17
+ animation.fromValue.should == 1
18
+ end
19
+
20
+ it "should assign :by value" do
21
+ animation = CAAnimation.basic('opacity', by: -1)
22
+ animation.byValue.should == -1
23
+ end
24
+
25
+ end
26
+
27
+ describe "should have `keyframe` animation" do
28
+
29
+ it "should accept keypath" do
30
+ animation = CAAnimation.keyframe('opacity')
31
+ animation.keyPath.should == 'opacity'
32
+ end
33
+
34
+ it "should assign :values" do
35
+ animation = CAAnimation.keyframe('opacity', values: [0, 0.5, 1])
36
+ animation.values.should == [0, 0.5, 1]
37
+ end
38
+
39
+ it "should assign :timing value" do
40
+ animation = CAAnimation.keyframe('opacity', timing: KCAMediaTimingFunctionLinear)
41
+ animation.timingFunction.should == CAMediaTimingFunction.functionWithName(KCAMediaTimingFunctionLinear)
42
+ end
43
+
44
+ end
45
+
46
+ describe "should have `CALayer#basic_animation` helper" do
47
+
48
+ it 'should create and add an animation' do
49
+ layer = CALayer.layer
50
+ animation = layer.basic_animation('opacity', to: 1, add: 'spec')
51
+ layer.animationForKey('spec').should.not == nil
52
+ # cannot compare animations because addAnimation creates a copy of the CAAnimation
53
+ # don't do this:
54
+ # layer.animationForKey('spec').should == animation
55
+ layer.animationForKey('spec').keyPath.should == 'opacity'
56
+ layer.animationForKey('spec').toValue.should == 1
57
+ end
58
+
59
+ end
60
+
61
+ describe "should have `CALayer#keyframe_animation` helper" do
62
+
63
+ it 'should create and add an animation' do
64
+ layer = CALayer.layer
65
+ animation = layer.keyframe_animation('opacity', values: [0, 1], add: 'spec')
66
+ layer.animationForKey('spec').should.not == nil
67
+ layer.animationForKey('spec').keyPath.should == 'opacity'
68
+ layer.animationForKey('spec').values.should == [0, 1]
69
+ end
70
+
71
+ end
72
+
73
+ end
data/spec/calayer_spec.rb CHANGED
@@ -1,4 +1,4 @@
1
- describe "CALayer" do
1
+ describe CALayer do
2
2
 
3
3
  it "should support <<" do
4
4
  layer = CALayer.layer
data/spec/color_spec.rb CHANGED
@@ -1,9 +1,15 @@
1
- describe 'UIColor' do
1
+ describe UIColor do
2
2
 
3
3
  it "should have a #uicolor method" do
4
4
  UIColor.redColor.uicolor.should == UIColor.redColor
5
5
  end
6
6
 
7
+ it "should have a #cgcolor method" do
8
+ -> do
9
+ UIColor.redColor.cgcolor.should == UIColor.redColor.CGColor
10
+ end.should.not.raise
11
+ end
12
+
7
13
  it "should have a #uicolor(alpha) method" do
8
14
  UIColor.redColor.uicolor(0.5).alpha.should == 0.5
9
15
  end
@@ -76,23 +82,23 @@ describe 'UIColor' do
76
82
  end
77
83
 
78
84
  it "should have a #invert method" do
79
- :red.uicolor.invert.should == UIColor.cyanColor
80
- :green.uicolor.invert.should == UIColor.magentaColor
81
- :blue.uicolor.invert.should == UIColor.yellowColor
85
+ UIColor.redColor.invert.should == UIColor.cyanColor
86
+ UIColor.greenColor.invert.should == UIColor.magentaColor
87
+ UIColor.blueColor.invert.should == UIColor.yellowColor
82
88
 
83
- :white.uicolor.invert.red.should == 0
84
- :white.uicolor.invert.green.should == 0
85
- :white.uicolor.invert.blue.should == 0
89
+ UIColor.whiteColor.invert.red.should == 0
90
+ UIColor.whiteColor.invert.green.should == 0
91
+ UIColor.whiteColor.invert.blue.should == 0
86
92
 
87
- :black.uicolor.invert.red.should == 1
88
- :black.uicolor.invert.green.should == 1
89
- :black.uicolor.invert.blue.should == 1
93
+ UIColor.blackColor.invert.red.should == 1
94
+ UIColor.blackColor.invert.green.should == 1
95
+ UIColor.blackColor.invert.blue.should == 1
90
96
  end
91
97
 
92
98
  it "should have a #mix_with method" do
93
- white = :white.uicolor
94
- black = :black.uicolor
95
- gray = :gray.uicolor
99
+ white = UIColor.whiteColor
100
+ black = UIColor.blackColor
101
+ gray = UIColor.grayColor
96
102
  white.mix_with(black, 0).red.should == 1
97
103
  white.mix_with(black, 0).green.should == 1
98
104
  white.mix_with(black, 0).blue.should == 1
@@ -115,3 +121,117 @@ describe 'UIColor' do
115
121
  end
116
122
 
117
123
  end
124
+
125
+
126
+ describe 'Fixnum UIColor extensions' do
127
+ it "should have a 0xffffff#uicolor method" do
128
+ color = 0xffffff.uicolor
129
+ color.red.should == 1
130
+ color.green.should == 1
131
+ color.blue.should == 1
132
+ color.alpha.should == 1
133
+ end
134
+
135
+ it "should have a 0xffffff#cgcolor method" do
136
+ -> do
137
+ 0xffffff.cgcolor.should.not == nil
138
+ end.should.not.raise
139
+ end
140
+
141
+ it "should have a 0x000000#uicolor(0.5) method" do
142
+ color = 0.uicolor(0.5)
143
+ color.red.should == 0
144
+ color.green.should == 0
145
+ color.blue.should == 0
146
+ color.alpha.should == 0.5
147
+ end
148
+ end
149
+
150
+
151
+ describe 'NSArray UIColor extensions' do
152
+ it "should have a [255, 255, 255]#uicolor method" do
153
+ color = [255, 255, 255].uicolor
154
+ color.red.should == 1
155
+ color.green.should == 1
156
+ color.blue.should == 1
157
+ color.alpha.should == 1
158
+ end
159
+
160
+ it "should have a [255, 255, 255]#cgcolor method" do
161
+ -> do
162
+ [255, 255, 255].cgcolor.should.not == nil
163
+ end.should.not.raise
164
+ end
165
+
166
+ it "should have a [0, 0, 0]#uicolor(0.5) method" do
167
+ color = [0, 0, 0].uicolor(0.5)
168
+ color.red.should == 0
169
+ color.green.should == 0
170
+ color.blue.should == 0
171
+ color.alpha.should == 0.5
172
+ end
173
+ end
174
+
175
+
176
+ describe 'NSString UIColor extensions' do
177
+ it "should have '#ffffff'.uicolor method" do
178
+ color = '#ffffff'.uicolor
179
+ color.should.be.kind_of(UIColor)
180
+ color.red.should == 1.0
181
+ color.green.should == 1.0
182
+ color.blue.should == 1.0
183
+
184
+ color = '#808080'.uicolor
185
+ color.should.be.kind_of(UIColor)
186
+ ((color.red * 2).round / 2.0).should == 0.5
187
+ ((color.green * 2).round / 2.0).should == 0.5
188
+ ((color.blue * 2).round / 2.0).should == 0.5
189
+ end
190
+
191
+ it "should have '#ffffff'.cgcolor method" do
192
+ -> do
193
+ '#ffffff'.cgcolor.should.not == nil
194
+ end.should.not.raise
195
+ end
196
+
197
+ it "should have '#000000'.uicolor(0.5) method" do
198
+ color = '#000000'.uicolor(0.5)
199
+ color.should.be.kind_of(UIColor)
200
+ color.red.should == 0
201
+ color.green.should == 0
202
+ color.blue.should == 0
203
+ color.alpha.should == 0.5
204
+ end
205
+
206
+ it "that supports image names" do
207
+ 'little_square'.uicolor.should == 'little_square'.uiimage.uicolor
208
+ end
209
+
210
+ it "that supports non-existant image names" do
211
+ 'this is not my beautiful house!'.uicolor.should == nil
212
+ end
213
+ end
214
+
215
+
216
+ describe 'UIImage UIColor extensions' do
217
+ it 'should support #uicolor' do
218
+ color = UIImage.imageNamed('little_square').uicolor
219
+ color.should.be.kind_of(UIColor)
220
+ end
221
+
222
+ it 'should support #cgcolor' do
223
+ -> do
224
+ UIImage.imageNamed('little_square').cgcolor
225
+ end.should.not.raise
226
+ end
227
+
228
+ it 'should support #uicolor(0.5)' do
229
+ -> do
230
+ UIImage.imageNamed('little_square').uicolor(0.5)
231
+ # unfortunately, this doesn't work:
232
+ # image.alpha.should == 0.5 # alpha returns 0 because this is not an RGB or HSB color
233
+ end.should.not.raise
234
+ end
235
+ end
236
+
237
+
data/spec/fixnum_spec.rb CHANGED
@@ -1,21 +1,5 @@
1
1
  describe "Fixnum" do
2
2
 
3
- it "should have a 0xffffff#uicolor method" do
4
- color = 0xffffff.uicolor
5
- color.red.should == 1
6
- color.green.should == 1
7
- color.blue.should == 1
8
- color.alpha.should == 1
9
- end
10
-
11
- it "should have a 0x000000#uicolor(0.5) method" do
12
- color = 0.uicolor(0.5)
13
- color.red.should == 0
14
- color.green.should == 0
15
- color.blue.should == 0
16
- color.alpha.should == 0.5
17
- end
18
-
19
3
  it "should have a #nth method" do
20
4
  {
21
5
  0 => 'th',
data/spec/nsarray_spec.rb CHANGED
@@ -27,22 +27,6 @@ describe "NSArray" do
27
27
  set.containsIndex(4).should == false
28
28
  end
29
29
 
30
- it "should have a [255,255,255]#uicolor method" do
31
- color = [255,255,255].uicolor
32
- color.red.should == 1
33
- color.green.should == 1
34
- color.blue.should == 1
35
- color.alpha.should == 1
36
- end
37
-
38
- it "should have a [0, 0, 0]#uicolor(0.5) method" do
39
- color = [0, 0, 0].uicolor(0.5)
40
- color.red.should == 0
41
- color.green.should == 0
42
- color.blue.should == 0
43
- color.alpha.should == 0.5
44
- end
45
-
46
30
  it "should have a method #nsset" do
47
31
  set = [0,1,0].nsset
48
32
  set.count.should == 2
data/spec/nsdate_spec.rb CHANGED
@@ -101,6 +101,19 @@ describe "NSDate" do
101
101
  @date.string_with_format(:iso8601).should == '2013-01-02 12:15:30.000'
102
102
  end
103
103
 
104
+ it "should have an NSDate#string_with_format method (:iso8601) and timezone" do
105
+ date = @date + @date.utc_offset
106
+ date.string_with_format(:iso8601, timezone:"UTC".nstimezone).should == '2013-01-02 12:15:30.000'
107
+ end
108
+
109
+ it "should have an NSDate#string_with_format method (:ymd)" do
110
+ @date.string_with_format(:ymd).should == '2013-01-02'
111
+ end
112
+
113
+ it "should have an NSDate#string_with_format method (:hms)" do
114
+ @date.string_with_format(:hms).should == '12:15:30.000'
115
+ end
116
+
104
117
  it "should have an NSDate#timezone method" do
105
118
  String.should === @date.timezone.name
106
119
  end
@@ -34,30 +34,6 @@ describe "NSString" do
34
34
  font.pointSize.should == UIFont.systemFontSize
35
35
  end
36
36
 
37
- describe "should have a #uicolor method" do
38
- it "that supports hex" do
39
- color = '#ffffff'.uicolor
40
- UIColor.should === color
41
- color.red.should == 1.0
42
- color.green.should == 1.0
43
- color.blue.should == 1.0
44
-
45
- color = '#808080'.uicolor
46
- UIColor.should === color
47
- ((color.red * 2).round / 2.0).should == 0.5
48
- ((color.green * 2).round / 2.0).should == 0.5
49
- ((color.blue * 2).round / 2.0).should == 0.5
50
- end
51
-
52
- it "that supports image names" do
53
- 'little_square'.uicolor.should == 'little_square'.uiimage.uicolor
54
- end
55
-
56
- it "that supports non-existant image names" do
57
- 'this is not my beautiful house!'.uicolor.should == nil
58
- end
59
- end
60
-
61
37
  it "should have a #uilabel method" do
62
38
  str = 'test'
63
39
  str_size = str.sizeWithFont(UIFont.systemFontOfSize(UIFont.labelFontSize))
data/spec/pipes_spec.rb CHANGED
@@ -10,27 +10,27 @@ describe "Pipes" do
10
10
  end
11
11
 
12
12
  it "should coerce into UIImage" do
13
- (@image | UIImage).should.is_a(UIImage)
13
+ (@image | UIImage).should.be.kind_of(UIImage)
14
14
  end
15
15
 
16
16
  it "should coerce into UIView" do
17
- (@image | UIView).should.is_a(UIView)
17
+ (@image | UIView).should.be.kind_of(UIView)
18
18
  end
19
19
 
20
20
  it "should coerce into UIImageView" do
21
- (@image | UIImageView).should.is_a(UIImageView)
21
+ (@image | UIImageView).should.be.kind_of(UIImageView)
22
22
  end
23
23
 
24
24
  it "should coerce into CIImage" do
25
- (@image | CIImage).should.is_a(CIImage)
25
+ (@image | CIImage).should.be.kind_of(CIImage)
26
26
  end
27
27
 
28
28
  it "should coerce into UIColor" do
29
- (@image | UIColor).should.is_a(UIColor)
29
+ (@image | UIColor).should.be.kind_of(UIColor)
30
30
  end
31
31
 
32
32
  it "should coerce into NSData" do
33
- (@image | NSData).should.is_a(NSData)
33
+ (@image | NSData).should.be.kind_of(NSData)
34
34
  end
35
35
 
36
36
  it "should not support arbitrary coercions" do
@@ -41,13 +41,13 @@ describe "Pipes" do
41
41
 
42
42
  it "should apply CIFilter" do
43
43
  filter = CIFilter.gaussian_blur
44
- (@image | filter).should.is_a(CIImage)
44
+ (@image | filter).should.be.kind_of(CIImage)
45
45
  end
46
46
 
47
47
  it "should apply multiple CIFilters" do
48
48
  filter1 = CIFilter.gaussian_blur(1)
49
49
  filter2 = CIFilter.gaussian_blur(2)
50
- (@image | filter1 | filter2).should.is_a(CIImage)
50
+ (@image | filter1 | filter2).should.be.kind_of(CIImage)
51
51
  end
52
52
 
53
53
  end
@@ -58,7 +58,7 @@ describe "Pipes" do
58
58
  end
59
59
 
60
60
  it "should coerce into UIImage" do
61
- (@view | UIImage).should.is_a(UIImage)
61
+ (@view | UIImage).should.be.kind_of(UIImage)
62
62
  end
63
63
 
64
64
  it "should not support arbitrary coercions" do
@@ -75,19 +75,19 @@ describe "Pipes" do
75
75
  end
76
76
 
77
77
  it "should coerce into UIImage" do
78
- (@image | UIImage).should.is_a(UIImage)
78
+ (@image | UIImage).should.be.kind_of(UIImage)
79
79
  end
80
80
 
81
81
  it "should coerce into UIView" do
82
- (@image | UIView).should.is_a(UIView)
82
+ (@image | UIView).should.be.kind_of(UIView)
83
83
  end
84
84
 
85
85
  it "should coerce into UIImageView" do
86
- (@image | UIImageView).should.is_a(UIImageView)
86
+ (@image | UIImageView).should.be.kind_of(UIImageView)
87
87
  end
88
88
 
89
89
  it "should coerce into CIImage" do
90
- (@image | CIImage).should.is_a(CIImage)
90
+ (@image | CIImage).should.be.kind_of(CIImage)
91
91
  end
92
92
 
93
93
  it "should not support arbitrary coercions" do
@@ -98,13 +98,13 @@ describe "Pipes" do
98
98
 
99
99
  it "should apply CIFilter" do
100
100
  filter = CIFilter.gaussian_blur
101
- (@image | filter).should.is_a(CIImage)
101
+ (@image | filter).should.be.kind_of(CIImage)
102
102
  end
103
103
 
104
104
  it "should apply multiple CIFilters" do
105
105
  filter1 = CIFilter.gaussian_blur(1)
106
106
  filter2 = CIFilter.gaussian_blur(2)
107
- (@image | filter1 | filter2).should.is_a(CIImage)
107
+ (@image | filter1 | filter2).should.be.kind_of(CIImage)
108
108
  end
109
109
 
110
110
  end
@@ -310,6 +310,35 @@ describe "Symbol - constants" do
310
310
  :linear.uianimationcurve.should == UIViewAnimationCurveLinear
311
311
  end
312
312
 
313
+ it 'should support `uianimationoption`' do
314
+ :layout_subviews.uianimationoption.should == UIViewAnimationOptionLayoutSubviews
315
+ :allow_user_interaction.uianimationoption.should == UIViewAnimationOptionAllowUserInteraction
316
+ :begin_from_current_state.uianimationoption.should == UIViewAnimationOptionBeginFromCurrentState
317
+ :repeat.uianimationoption.should == UIViewAnimationOptionRepeat
318
+ :autoreverse.uianimationoption.should == UIViewAnimationOptionAutoreverse
319
+ :override_inherited_duration.uianimationoption.should == UIViewAnimationOptionOverrideInheritedDuration
320
+ :override_inherited_curve.uianimationoption.should == UIViewAnimationOptionOverrideInheritedCurve
321
+ :allow_animated_content.uianimationoption.should == UIViewAnimationOptionAllowAnimatedContent
322
+ :show_hide_transition_views.uianimationoption.should == UIViewAnimationOptionShowHideTransitionViews
323
+ :override_inherited_options.uianimationoption.should == UIViewAnimationOptionOverrideInheritedOptions
324
+ :curve_ease_in_out.uianimationoption.should == UIViewAnimationOptionCurveEaseInOut
325
+ :ease_in_out.uianimationoption.should == UIViewAnimationOptionCurveEaseInOut
326
+ :curve_ease_in.uianimationoption.should == UIViewAnimationOptionCurveEaseIn
327
+ :ease_in.uianimationoption.should == UIViewAnimationOptionCurveEaseIn
328
+ :curve_ease_out.uianimationoption.should == UIViewAnimationOptionCurveEaseOut
329
+ :ease_out.uianimationoption.should == UIViewAnimationOptionCurveEaseOut
330
+ :curve_linear.uianimationoption.should == UIViewAnimationOptionCurveLinear
331
+ :linear.uianimationoption.should == UIViewAnimationOptionCurveLinear
332
+ :transition_none.uianimationoption.should == UIViewAnimationOptionTransitionNone
333
+ :transition_flip_from_left.uianimationoption.should == UIViewAnimationOptionTransitionFlipFromLeft
334
+ :transition_flip_from_right.uianimationoption.should == UIViewAnimationOptionTransitionFlipFromRight
335
+ :transition_curl_up.uianimationoption.should == UIViewAnimationOptionTransitionCurlUp
336
+ :transition_curl_down.uianimationoption.should == UIViewAnimationOptionTransitionCurlDown
337
+ :transition_cross_dissolve.uianimationoption.should == UIViewAnimationOptionTransitionCrossDissolve
338
+ :transition_flip_from_top.uianimationoption.should == UIViewAnimationOptionTransitionFlipFromTop
339
+ :transition_flip_from_bottom.uianimationoption.should == UIViewAnimationOptionTransitionFlipFromBottom
340
+ end
341
+
313
342
  it 'should support `uitablestyle`' do
314
343
  :plain.uitablestyle.should == UITableViewStylePlain
315
344
  :grouped.uitablestyle.should == UITableViewStyleGrouped
@@ -14,6 +14,12 @@ describe "Symbol uicolor" do
14
14
  :black.uicolor.should.be.kind_of(UIColor)
15
15
  end
16
16
 
17
+ it 'should have cgcolor method' do
18
+ -> do
19
+ :black.cgcolor.should.not == nil
20
+ end.should.not.raise
21
+ end
22
+
17
23
  it 'should have blue color' do
18
24
  @colors[:blue].should == :blueColor
19
25
  :blue.uicolor.should.be.kind_of(UIColor)
@@ -109,4 +109,35 @@ describe "UIView animation methods" do
109
109
  @after_called.should == true
110
110
  end
111
111
 
112
+ it 'should have sugarcube_animation_options helper' do
113
+ UIView.sugarcube_animation_options({}).should == (UIViewAnimationOptionCurveEaseInOut | UIViewAnimationOptionBeginFromCurrentState)
114
+ end
115
+
116
+ it 'should handle accept :options' do
117
+ UIView.sugarcube_animation_options(options: UIViewAnimationOptionCurveLinear).should == UIViewAnimationOptionCurveLinear
118
+ UIView.sugarcube_animation_options(options: UIViewAnimationOptionCurveLinear | UIViewAnimationOptionCurveEaseInOut).should == UIViewAnimationOptionCurveLinear | UIViewAnimationOptionCurveEaseInOut
119
+ end
120
+
121
+ it 'should accept :curve' do
122
+ opts = UIView.sugarcube_animation_options(curve: UIViewAnimationOptionCurveLinear)
123
+ (opts & UIViewAnimationOptionCurveLinear).should == UIViewAnimationOptionCurveLinear
124
+
125
+ opts = UIView.sugarcube_animation_options(curve: :linear)
126
+ (opts & UIViewAnimationOptionCurveLinear).should == UIViewAnimationOptionCurveLinear
127
+ end
128
+
129
+ it 'should accept :from_current' do
130
+ opts = UIView.sugarcube_animation_options(from_current: true)
131
+ (opts & UIViewAnimationOptionBeginFromCurrentState).should == UIViewAnimationOptionBeginFromCurrentState
132
+ opts = UIView.sugarcube_animation_options(from_current: false)
133
+ (opts & UIViewAnimationOptionBeginFromCurrentState).should == 0
134
+ end
135
+
136
+ it 'should accept :allow_interaction' do
137
+ opts = UIView.sugarcube_animation_options(allow_interaction: true)
138
+ (opts & UIViewAnimationOptionAllowUserInteraction).should == UIViewAnimationOptionAllowUserInteraction
139
+ opts = UIView.sugarcube_animation_options(allow_interaction: false)
140
+ (opts & UIViewAnimationOptionAllowUserInteraction).should == 0
141
+ end
142
+
112
143
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sugarcube
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.5.9
4
+ version: 1.6.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Colin T.A. Gray
@@ -11,7 +11,7 @@ authors:
11
11
  autorequire:
12
12
  bindir: bin
13
13
  cert_chain: []
14
- date: 2014-04-18 00:00:00.000000000 Z
14
+ date: 2014-04-23 00:00:00.000000000 Z
15
15
  dependencies: []
16
16
  description: |
17
17
  == Description
@@ -145,7 +145,7 @@ files:
145
145
  - lib/sugarcube-pointer.rb
146
146
  - lib/sugarcube-pointer/nsarray.rb
147
147
  - lib/sugarcube-repl.rb
148
- - lib/sugarcube-repl/object.rb
148
+ - lib/sugarcube-repl/kernel.rb
149
149
  - lib/sugarcube-resources.rb
150
150
  - lib/sugarcube-timer.rb
151
151
  - lib/sugarcube-timer/timer.rb
@@ -198,6 +198,7 @@ files:
198
198
  - spec/568_spec.rb
199
199
  - spec/animation_chain_spec.rb
200
200
  - spec/anonymous_spec.rb
201
+ - spec/caanimation_spec.rb
201
202
  - spec/calayer_spec.rb
202
203
  - spec/color_components_spec.rb
203
204
  - spec/color_other_representations_spec.rb
@@ -268,7 +269,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
268
269
  version: '0'
269
270
  requirements: []
270
271
  rubyforge_project:
271
- rubygems_version: 2.0.3
272
+ rubygems_version: 2.0.14
272
273
  signing_key:
273
274
  specification_version: 4
274
275
  summary: Extensions for Ruby to make Rubymotion development more enjoyable, and hopefully
@@ -277,6 +278,7 @@ test_files:
277
278
  - spec/568_spec.rb
278
279
  - spec/animation_chain_spec.rb
279
280
  - spec/anonymous_spec.rb
281
+ - spec/caanimation_spec.rb
280
282
  - spec/calayer_spec.rb
281
283
  - spec/color_components_spec.rb
282
284
  - spec/color_other_representations_spec.rb