sugarcube 0.18.17 → 0.18.18
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.
- data/README.md +54 -29
- data/lib/sugarcube/date_parser.rb +67 -0
- data/lib/sugarcube/uibarbuttonitem.rb +25 -0
- data/lib/sugarcube/uiview.rb +3 -3
- data/lib/sugarcube/version.rb +1 -1
- data/spec/date_parser_spec.rb +26 -0
- data/spec/uibarbuttonitem_spec.rb +44 -0
- metadata +6 -4
data/README.md
CHANGED
|
@@ -820,10 +820,10 @@ Chains can also be written like this:
|
|
|
820
820
|
|
|
821
821
|
```ruby
|
|
822
822
|
chain = UIView.animation_chain
|
|
823
|
-
chain << proc { view.slide(:left, 20
|
|
824
|
-
chain << proc { view.slide(:up, 20
|
|
825
|
-
chain << proc { view.slide(:right, 20
|
|
826
|
-
chain << proc { view.slide(:down, 20
|
|
823
|
+
chain << proc { view.slide(:left, 20) }
|
|
824
|
+
chain << proc { view.slide(:up, 20) }
|
|
825
|
+
chain << proc { view.slide(:right, 20) }
|
|
826
|
+
chain << proc { view.slide(:down, 20) }
|
|
827
827
|
chain << proc { view.fade_out }
|
|
828
828
|
chain.start
|
|
829
829
|
```
|
|
@@ -1038,39 +1038,64 @@ text_view.off :change, :end, :begin
|
|
|
1038
1038
|
----------------------
|
|
1039
1039
|
|
|
1040
1040
|
```ruby
|
|
1041
|
+
# Get an instance containing the specified system item.
|
|
1041
1042
|
UIBarButtonItem.done {
|
|
1042
1043
|
self.dismissViewControllerAnimated true, completion:nil
|
|
1043
1044
|
}
|
|
1044
1045
|
# =>
|
|
1045
|
-
|
|
1046
|
+
UIBarButtonItem.alloc.initWithBarButtonSystemItem(:done.uibarbuttonitem, target:self, action:"action:")
|
|
1047
|
+
# with 'action' defined as:
|
|
1048
|
+
def action(sender)
|
|
1049
|
+
self.dismissViewControllerAnimated true, completion:nil
|
|
1050
|
+
end
|
|
1051
|
+
|
|
1052
|
+
# the method names are 1::1 with the uibarbuttonitem constants in symbol.rb
|
|
1053
|
+
UIBarButtonItem.cancel(&action) => UIBarButtonItem.alloc.initWithBarButtonSystemItem(:cancel.uibarbuttonitem, target:self, action:"action:")
|
|
1054
|
+
UIBarButtonItem.edit(&action) => UIBarButtonItem.alloc.initWithBarButtonSystemItem(:edit.uibarbuttonitem, target:self, action:"action:")
|
|
1055
|
+
UIBarButtonItem.save(&action) => UIBarButtonItem.alloc.initWithBarButtonSystemItem(:save.uibarbuttonitem, target:self, action:"action:")
|
|
1056
|
+
.
|
|
1057
|
+
.
|
|
1058
|
+
.
|
|
1059
|
+
UIBarButtonItem.pagecurl(&action) => UIBarButtonItem.alloc.initWithBarButtonSystemItem(:pagecurl.uibarbuttonitem, target:self, action:"action:")
|
|
1060
|
+
|
|
1061
|
+
# Get an instance containing the specified title.
|
|
1062
|
+
UIBarButtonItem.titled('Close') {
|
|
1063
|
+
self.dismissViewControllerAnimated true, completion:nil
|
|
1064
|
+
}
|
|
1065
|
+
# =>
|
|
1066
|
+
UIBarButtonItem.alloc.initWithTitle('Close', style: :bordered.uibarbuttonstyle, target:self, action:"action:")
|
|
1067
|
+
|
|
1068
|
+
def action:sender
|
|
1069
|
+
self.dismissViewControllerAnimated true, completion:nil
|
|
1070
|
+
end
|
|
1071
|
+
|
|
1072
|
+
# You can also specify a style.
|
|
1073
|
+
UIBarButtonItem.titled('Close', :plain.uibarbuttonstyle) {
|
|
1074
|
+
self.dismissViewControllerAnimated true, completion:nil
|
|
1075
|
+
}
|
|
1076
|
+
|
|
1077
|
+
|
|
1078
|
+
# Get an instance containing the specified image.
|
|
1079
|
+
UIBarButtonItem.imaged('close'.uiimage) {
|
|
1080
|
+
self.dismissViewControllerAnimated true, completion:nil
|
|
1081
|
+
}
|
|
1082
|
+
# =>
|
|
1083
|
+
UIBarButtonItem.alloc.initWithImage('Close'.uiimage, style: :bordered.uibarbuttonstyle, target:self, action:"action:")
|
|
1046
1084
|
def action:sender
|
|
1047
1085
|
self.dismissViewControllerAnimated true, completion:nil
|
|
1048
1086
|
end
|
|
1049
1087
|
|
|
1050
|
-
|
|
1051
|
-
|
|
1052
|
-
|
|
1053
|
-
|
|
1054
|
-
|
|
1055
|
-
|
|
1056
|
-
|
|
1057
|
-
|
|
1058
|
-
|
|
1059
|
-
|
|
1060
|
-
|
|
1061
|
-
UIBarButtonitem.bookmarks(&action) => UIBarButtonitem.alloc.initWithBarButtonSystemItem(:bookmarks.uibarbuttonitem, target:self, action:"action:")
|
|
1062
|
-
UIBarButtonitem.search(&action) => UIBarButtonitem.alloc.initWithBarButtonSystemItem(:search.uibarbuttonitem, target:self, action:"action:")
|
|
1063
|
-
UIBarButtonitem.refresh(&action) => UIBarButtonitem.alloc.initWithBarButtonSystemItem(:refresh.uibarbuttonitem, target:self, action:"action:")
|
|
1064
|
-
UIBarButtonitem.stop(&action) => UIBarButtonitem.alloc.initWithBarButtonSystemItem(:stop.uibarbuttonitem, target:self, action:"action:")
|
|
1065
|
-
UIBarButtonitem.camera(&action) => UIBarButtonitem.alloc.initWithBarButtonSystemItem(:camera.uibarbuttonitem, target:self, action:"action:")
|
|
1066
|
-
UIBarButtonitem.trash(&action) => UIBarButtonitem.alloc.initWithBarButtonSystemItem(:trash.uibarbuttonitem, target:self, action:"action:")
|
|
1067
|
-
UIBarButtonitem.play(&action) => UIBarButtonitem.alloc.initWithBarButtonSystemItem(:play.uibarbuttonitem, target:self, action:"action:")
|
|
1068
|
-
UIBarButtonitem.pause(&action) => UIBarButtonitem.alloc.initWithBarButtonSystemItem(:pause.uibarbuttonitem, target:self, action:"action:")
|
|
1069
|
-
UIBarButtonitem.rewind(&action) => UIBarButtonitem.alloc.initWithBarButtonSystemItem(:rewind.uibarbuttonitem, target:self, action:"action:")
|
|
1070
|
-
UIBarButtonitem.fastforward(&action) => UIBarButtonitem.alloc.initWithBarButtonSystemItem(:fastforward.uibarbuttonitem, target:self, action:"action:")
|
|
1071
|
-
UIBarButtonitem.undo(&action) => UIBarButtonitem.alloc.initWithBarButtonSystemItem(:undo.uibarbuttonitem, target:self, action:"action:")
|
|
1072
|
-
UIBarButtonitem.redo(&action) => UIBarButtonitem.alloc.initWithBarButtonSystemItem(:redo.uibarbuttonitem, target:self, action:"action:")
|
|
1073
|
-
UIBarButtonitem.pagecurl(&action) => UIBarButtonitem.alloc.initWithBarButtonSystemItem(:pagecurl.uibarbuttonitem, target:self, action:"action:")
|
|
1088
|
+
# You can also specify a style.
|
|
1089
|
+
UIBarButtonItem.imaged('close'.uiimage, :plain.uibarbuttonstyle) {
|
|
1090
|
+
self.dismissViewControllerAnimated true, completion:nil
|
|
1091
|
+
}
|
|
1092
|
+
|
|
1093
|
+
# Get an instance containing the specified array which contains a portrate image and a landscape iamge.
|
|
1094
|
+
UIBarButtonItem.imaged(['portrate'.uiimage, 'landscape'.uiimage) {
|
|
1095
|
+
self.dismissViewControllerAnimated true, completion:nil
|
|
1096
|
+
}
|
|
1097
|
+
# =>
|
|
1098
|
+
UIBarButtonItem.alloc.initWithImage('portrate'.uiimage, landscapeImagePhone:'landscape'.uiimage, style: :bordered.uibarbuttonstyle, target:self, action:"action:")
|
|
1074
1099
|
```
|
|
1075
1100
|
|
|
1076
1101
|
NSNotificationCenter
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
module SugarCube
|
|
2
|
+
module DateParser
|
|
3
|
+
# Parse a date string: E.g.:
|
|
4
|
+
#
|
|
5
|
+
# SugarCube::DateParser.parse_date "There is a date in here tomorrow at 9:00 AM"
|
|
6
|
+
#
|
|
7
|
+
# => 2013-02-20 09:00:00 -0800
|
|
8
|
+
def self.parse_date(date_string)
|
|
9
|
+
detect(date_string).first.date
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
# Parse time zone from date
|
|
13
|
+
#
|
|
14
|
+
# SugarCube::DateParser.parse_date "There is a date in here tomorrow at 9:00 AM EDT"
|
|
15
|
+
#
|
|
16
|
+
# Caveat: This is implemented per Apple documentation. I've never really
|
|
17
|
+
# seen it work.
|
|
18
|
+
def self.parse_time_zone(date_string)
|
|
19
|
+
detect(date_string).first.timeZone
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
# Parse a date string: E.g.:
|
|
23
|
+
#
|
|
24
|
+
# SugarCube::DateParser.parse_date "You have a meeting from 9:00 AM to 3:00 PM"
|
|
25
|
+
#
|
|
26
|
+
# => 21600.0
|
|
27
|
+
#
|
|
28
|
+
# Divide by 3600.0 to get number of hours duration.
|
|
29
|
+
def self.parse_duration(date_string)
|
|
30
|
+
detect(date_string).first.duration
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
# Parse a date into a raw match array for further processing
|
|
34
|
+
def self.match(date_string)
|
|
35
|
+
detect(date_string)
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
private
|
|
39
|
+
def self.detect(date_string)
|
|
40
|
+
error = Pointer.new(:object)
|
|
41
|
+
detector = NSDataDetector.dataDetectorWithTypes(NSTextCheckingTypeDate, error:error)
|
|
42
|
+
matches = detector.matchesInString(date_string, options:0, range:NSMakeRange(0, date_string.length))
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
class String
|
|
48
|
+
# Use NSDataDetector to parse a string containing a date
|
|
49
|
+
# or duration. These can be of the form:
|
|
50
|
+
#
|
|
51
|
+
# "tomorrow at 7:30 PM"
|
|
52
|
+
# "11.23.2013"
|
|
53
|
+
# "from 7:30 to 10:00 AM"
|
|
54
|
+
#
|
|
55
|
+
# etc.
|
|
56
|
+
def to_date
|
|
57
|
+
SugarCube::DateParser.parse_date(self)
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
def to_timezone
|
|
61
|
+
SugarCube::DateParser.parse_timezone(self)
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
def to_duration
|
|
65
|
+
SugarCube::DateParser.parse_duration(self)
|
|
66
|
+
end
|
|
67
|
+
end
|
|
@@ -97,6 +97,14 @@ class UIBarButtonItem
|
|
|
97
97
|
def pagecurl(&action)
|
|
98
98
|
sugarcube_barbuttonitem :pagecurl.uibarbuttonitem, action
|
|
99
99
|
end
|
|
100
|
+
|
|
101
|
+
def titled(title, style = :bordered.uibarbuttonstyle, &action)
|
|
102
|
+
sugarcube_barbuttonitem_with_title(title, style, action)
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
def imaged(image, style = :bordered.uibarbuttonstyle, &action)
|
|
106
|
+
sugarcube_barbuttonitem_with_image(image, style, action)
|
|
107
|
+
end
|
|
100
108
|
|
|
101
109
|
end
|
|
102
110
|
|
|
@@ -116,6 +124,23 @@ private
|
|
|
116
124
|
b
|
|
117
125
|
end
|
|
118
126
|
|
|
127
|
+
def self.sugarcube_barbuttonitem_with_title(title, style, action)
|
|
128
|
+
b = UIBarButtonItem.alloc.initWithTitle title, style:style, target:nil, action:nil
|
|
129
|
+
b.set_target_and_action b, action
|
|
130
|
+
b
|
|
131
|
+
end
|
|
132
|
+
|
|
133
|
+
def self.sugarcube_barbuttonitem_with_image(image, style, action)
|
|
134
|
+
case image
|
|
135
|
+
when Array
|
|
136
|
+
b = UIBarButtonItem.alloc.initWithImage image.first, landscapeImagePhone:image.last, style:style, target:nil, action:nil
|
|
137
|
+
else
|
|
138
|
+
b = UIBarButtonItem.alloc.initWithImage image, style:style, target:nil, action:nil
|
|
139
|
+
end
|
|
140
|
+
b.set_target_and_action b, action
|
|
141
|
+
b
|
|
142
|
+
end
|
|
143
|
+
|
|
119
144
|
def sugarcube_handle_action(sender)
|
|
120
145
|
handler = @sugarcube_action
|
|
121
146
|
if handler.arity == 0
|
data/lib/sugarcube/uiview.rb
CHANGED
|
@@ -157,7 +157,7 @@ class UIView
|
|
|
157
157
|
options[:after] = after
|
|
158
158
|
|
|
159
159
|
animate(options) {
|
|
160
|
-
self.
|
|
160
|
+
self.alpha = options[:opacity]
|
|
161
161
|
}
|
|
162
162
|
end
|
|
163
163
|
|
|
@@ -192,11 +192,11 @@ class UIView
|
|
|
192
192
|
options = { duration: options }
|
|
193
193
|
end
|
|
194
194
|
|
|
195
|
-
original_opacity = self.
|
|
195
|
+
original_opacity = self.alpha
|
|
196
196
|
|
|
197
197
|
after_remove = proc {
|
|
198
198
|
removeFromSuperview
|
|
199
|
-
self.
|
|
199
|
+
self.alpha = original_opacity
|
|
200
200
|
after.call if after
|
|
201
201
|
}
|
|
202
202
|
|
data/lib/sugarcube/version.rb
CHANGED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
describe "Base Methods" do
|
|
2
|
+
it "parses a relative natural language string, returning a date" do
|
|
3
|
+
today = Time.now
|
|
4
|
+
t = SugarCube::DateParser.parse_date("tomorrow at 7:30 PM")
|
|
5
|
+
t.should.is_a Time
|
|
6
|
+
t.hour.should == 19
|
|
7
|
+
t.min.should == 30
|
|
8
|
+
t.sec.should == 0
|
|
9
|
+
(t.day - today.day).should == 1
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
it "parses a specific natural language string, returning a date" do
|
|
13
|
+
t = SugarCube::DateParser.parse_date("6/18/13 at 7:30 AM")
|
|
14
|
+
t.month.should == 6
|
|
15
|
+
t.day.should == 18
|
|
16
|
+
t.year.should == 2013
|
|
17
|
+
t.hour.should == 7
|
|
18
|
+
t.min.should == 30
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
describe "String Extensions" do
|
|
23
|
+
it "parses a date the same as the base method" do
|
|
24
|
+
"tomorrow at 7:30 PM".to_date.should == SugarCube::DateParser.parse_date("tomorrow at 7:30 PM")
|
|
25
|
+
end
|
|
26
|
+
end
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
describe UIBarButtonItem do
|
|
2
2
|
|
|
3
|
+
# with system item
|
|
3
4
|
it 'should be :done' do
|
|
4
5
|
b = UIBarButtonItem.done {
|
|
5
6
|
@result = :done
|
|
@@ -192,4 +193,47 @@ describe UIBarButtonItem do
|
|
|
192
193
|
@result.should == :pagecurl
|
|
193
194
|
end
|
|
194
195
|
|
|
196
|
+
# with title
|
|
197
|
+
it 'should be :titled' do
|
|
198
|
+
b = UIBarButtonItem.titled('title') {
|
|
199
|
+
@result = :titled
|
|
200
|
+
}
|
|
201
|
+
b.target.send b.action, b
|
|
202
|
+
@result.should == :titled
|
|
203
|
+
end
|
|
204
|
+
|
|
205
|
+
it 'should be :titled_with_style' do
|
|
206
|
+
b = UIBarButtonItem.titled('title', :plain.uibarbuttonstyle) {
|
|
207
|
+
@result = :titled_with_style
|
|
208
|
+
}
|
|
209
|
+
b.target.send b.action, b
|
|
210
|
+
@result.should == :titled_with_style
|
|
211
|
+
end
|
|
212
|
+
|
|
213
|
+
it 'should be :imaged' do
|
|
214
|
+
b = UIBarButtonItem.imaged('little_square'.uiimage) {
|
|
215
|
+
@result = :imaged
|
|
216
|
+
}
|
|
217
|
+
b.target.send b.action, b
|
|
218
|
+
@result.should == :imaged
|
|
219
|
+
end
|
|
220
|
+
|
|
221
|
+
it 'should be :imaged_with_style' do
|
|
222
|
+
b = UIBarButtonItem.imaged('little_square'.uiimage, :plain.uibarbuttonstyle) {
|
|
223
|
+
@result = :imaged_with_style
|
|
224
|
+
}
|
|
225
|
+
b.target.send b.action, b
|
|
226
|
+
@result.should == :imaged_with_style
|
|
227
|
+
end
|
|
228
|
+
|
|
229
|
+
it 'should be :imaged_with_images' do
|
|
230
|
+
b = UIBarButtonItem.imaged(['little_square'.uiimage, 'little_square'.uiimage]) {
|
|
231
|
+
@result = :imaged_with_images
|
|
232
|
+
}
|
|
233
|
+
b.target.send b.action, b
|
|
234
|
+
@result.should == :imaged_with_images
|
|
235
|
+
end
|
|
236
|
+
|
|
237
|
+
|
|
238
|
+
|
|
195
239
|
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: 0.18.
|
|
4
|
+
version: 0.18.18
|
|
5
5
|
prerelease:
|
|
6
6
|
platform: ruby
|
|
7
7
|
authors:
|
|
@@ -13,7 +13,7 @@ authors:
|
|
|
13
13
|
autorequire:
|
|
14
14
|
bindir: bin
|
|
15
15
|
cert_chain: []
|
|
16
|
-
date: 2013-
|
|
16
|
+
date: 2013-03-07 00:00:00.000000000 Z
|
|
17
17
|
dependencies: []
|
|
18
18
|
description: ! '== Description
|
|
19
19
|
|
|
@@ -64,6 +64,7 @@ files:
|
|
|
64
64
|
- lib/sugarcube/calayer.rb
|
|
65
65
|
- lib/sugarcube/core_graphics.rb
|
|
66
66
|
- lib/sugarcube/core_location.rb
|
|
67
|
+
- lib/sugarcube/date_parser.rb
|
|
67
68
|
- lib/sugarcube/exceptions.rb
|
|
68
69
|
- lib/sugarcube/fixnum.rb
|
|
69
70
|
- lib/sugarcube/modal.rb
|
|
@@ -127,6 +128,7 @@ files:
|
|
|
127
128
|
- spec/calayer_spec.rb
|
|
128
129
|
- spec/core_graphics_spec.rb
|
|
129
130
|
- spec/core_location_spec.rb
|
|
131
|
+
- spec/date_parser_spec.rb
|
|
130
132
|
- spec/fixnum_spec.rb
|
|
131
133
|
- spec/notification_spec.rb
|
|
132
134
|
- spec/nsarray_spec.rb
|
|
@@ -173,7 +175,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
173
175
|
version: '0'
|
|
174
176
|
requirements: []
|
|
175
177
|
rubyforge_project:
|
|
176
|
-
rubygems_version: 1.8.
|
|
178
|
+
rubygems_version: 1.8.25
|
|
177
179
|
signing_key:
|
|
178
180
|
specification_version: 3
|
|
179
181
|
summary: Extensions for Ruby to make Rubymotion development more enjoyable, and hopefully
|
|
@@ -185,6 +187,7 @@ test_files:
|
|
|
185
187
|
- spec/calayer_spec.rb
|
|
186
188
|
- spec/core_graphics_spec.rb
|
|
187
189
|
- spec/core_location_spec.rb
|
|
190
|
+
- spec/date_parser_spec.rb
|
|
188
191
|
- spec/fixnum_spec.rb
|
|
189
192
|
- spec/notification_spec.rb
|
|
190
193
|
- spec/nsarray_spec.rb
|
|
@@ -210,4 +213,3 @@ test_files:
|
|
|
210
213
|
- spec/uiview_attr_updates_spec.rb
|
|
211
214
|
- spec/uiview_spec.rb
|
|
212
215
|
- spec/unholy_spec.rb
|
|
213
|
-
has_rdoc:
|