sugarcube 0.20.1 → 0.20.3
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 +22 -2
- data/lib/sugarcube-anonymous/anonymous.rb +16 -1
- data/lib/sugarcube-anonymous/anonymous_array.rb +46 -0
- data/lib/sugarcube/nsarray.rb +4 -0
- data/lib/sugarcube/nsdate.rb +15 -1
- data/lib/sugarcube/nsstring_files.rb +7 -0
- data/lib/sugarcube/nsurl.rb +4 -0
- data/lib/sugarcube/to_s/nsset.rb +2 -0
- data/lib/sugarcube/uiviewcontroller.rb +5 -1
- data/lib/sugarcube/version.rb +1 -1
- data/spec/anonymous_spec.rb +160 -0
- data/spec/nsarray_spec.rb +5 -0
- data/spec/nsdate_spec.rb +31 -0
- data/spec/nsset_spec.rb +7 -0
- data/spec/nsstring_files_spec.rb +6 -0
- data/spec/nsurl_spec.rb +4 -0
- data/spec/uiviewcontroller_spec.rb +22 -10
- metadata +5 -2
data/README.md
CHANGED
@@ -514,6 +514,7 @@ NSError.new('Error Message', code: 404, userInfo: { warnings: ['blabla'] })
|
|
514
514
|
# file operations
|
515
515
|
"my.plist".exists? # => NSFileManager.defaultManager.fileExistsAtPath("my.plist")
|
516
516
|
"my.plist".document # => NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, true)[0].stringByAppendingPathComponent("my.plist")
|
517
|
+
"my.plist".cache # => NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, true)[0].stringByAppendingPathComponent("my.plist")
|
517
518
|
"my.plist".remove! # => NSFileManager.defaultManager.removeItemAtPath("my.plist".document, error: error) (returns error, if any occurred)
|
518
519
|
|
519
520
|
# get the resource path, useful if you include json files or images you manipulate in the app
|
@@ -1184,6 +1185,16 @@ UIBarButtonItem.imaged(['portrate'.uiimage, 'landscape'.uiimage) {
|
|
1184
1185
|
UIBarButtonItem.alloc.initWithImage('portrate'.uiimage, landscapeImagePhone:'landscape'.uiimage, style: :bordered.uibarbuttonstyle, target:self, action:"action:")
|
1185
1186
|
```
|
1186
1187
|
|
1188
|
+
Example Usage:
|
1189
|
+
```ruby
|
1190
|
+
toolbar = UIToolbar.new
|
1191
|
+
toolbar.items = [
|
1192
|
+
@image_picker_button = UIBarButtonItem.camera { presentImagePickerController(self) },
|
1193
|
+
UIBarButtonItem.flexiblespace,
|
1194
|
+
@saveButton = UIBarButtonItem.save { save_photo(self) }
|
1195
|
+
]
|
1196
|
+
```
|
1197
|
+
|
1187
1198
|
NSNotificationCenter
|
1188
1199
|
----------------------
|
1189
1200
|
|
@@ -1208,15 +1219,24 @@ Makes it easy to post a notification to some or all objects.
|
|
1208
1219
|
---------
|
1209
1220
|
|
1210
1221
|
```ruby
|
1222
|
+
# once
|
1211
1223
|
1.second.later do
|
1212
1224
|
@view.shake
|
1213
1225
|
end
|
1214
|
-
|
1226
|
+
# repeating
|
1215
1227
|
1.second.every do
|
1216
1228
|
@view.shake
|
1217
1229
|
end
|
1218
1230
|
|
1219
|
-
#
|
1231
|
+
# you can assign the return value (an NSTimer)
|
1232
|
+
timer = 1.second.every do
|
1233
|
+
@view.shake
|
1234
|
+
end
|
1235
|
+
# and invalidate it
|
1236
|
+
timer.invalidate
|
1237
|
+
|
1238
|
+
# the `every` method is available in the SugarCube::Timer module,
|
1239
|
+
# which you might find more readable
|
1220
1240
|
include SugarCube::Timer
|
1221
1241
|
every 1.minute do
|
1222
1242
|
puts "tick"
|
@@ -26,13 +26,14 @@ module SugarCube
|
|
26
26
|
key = symbol
|
27
27
|
key = symbol.to_s unless self.include? key
|
28
28
|
if self.include?(key)
|
29
|
+
self[key] = self[key].to_object
|
29
30
|
return self[key]
|
30
31
|
end
|
31
32
|
elsif args.size == 1 && /(.*)=$/ =~ symbol.to_s
|
32
33
|
key = $1.to_sym
|
33
34
|
key = key.to_s unless self.include? key
|
34
35
|
if self.include?(key)
|
35
|
-
return self[key] = args.first
|
36
|
+
return self[key] = args.first.to_object
|
36
37
|
end
|
37
38
|
end
|
38
39
|
return super
|
@@ -42,10 +43,24 @@ module SugarCube
|
|
42
43
|
self
|
43
44
|
end
|
44
45
|
|
46
|
+
# replace enumerable methods
|
47
|
+
alias :anonymous_each :each
|
48
|
+
|
49
|
+
def each
|
50
|
+
anonymous_each {|k,v| yield k, v.to_object}
|
51
|
+
end
|
52
|
+
|
45
53
|
end
|
46
54
|
|
47
55
|
end
|
48
56
|
|
57
|
+
class NSObject
|
58
|
+
|
59
|
+
def to_object
|
60
|
+
self
|
61
|
+
end
|
62
|
+
|
63
|
+
end
|
49
64
|
|
50
65
|
class NSDictionary
|
51
66
|
|
@@ -0,0 +1,46 @@
|
|
1
|
+
module SugarCube
|
2
|
+
class AnonymousArray < Array
|
3
|
+
|
4
|
+
def [] index
|
5
|
+
o = super.to_object
|
6
|
+
self[index] = o
|
7
|
+
end
|
8
|
+
|
9
|
+
def first
|
10
|
+
self.size == 0 ? nil : self[0]
|
11
|
+
end
|
12
|
+
|
13
|
+
def last
|
14
|
+
c = self.size
|
15
|
+
c == 0 ? nil : self[c - 1]
|
16
|
+
end
|
17
|
+
|
18
|
+
def to_object
|
19
|
+
self
|
20
|
+
end
|
21
|
+
|
22
|
+
|
23
|
+
# replace enumerable methods
|
24
|
+
#
|
25
|
+
# In AnonymousArray:
|
26
|
+
# It was not satisfied with the :each method only.
|
27
|
+
|
28
|
+
[:each, :map, :collect].each do |method|
|
29
|
+
base_method = "anonymousarray_#{method.to_s}".to_sym
|
30
|
+
alias_method base_method, method
|
31
|
+
define_method method do
|
32
|
+
send(base_method) {|o| yield o.to_object}
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
end
|
37
|
+
|
38
|
+
end
|
39
|
+
|
40
|
+
class NSArray
|
41
|
+
|
42
|
+
def to_object
|
43
|
+
SugarCube::AnonymousArray.new(self)
|
44
|
+
end
|
45
|
+
|
46
|
+
end
|
data/lib/sugarcube/nsarray.rb
CHANGED
data/lib/sugarcube/nsdate.rb
CHANGED
@@ -3,7 +3,9 @@ class NSDate
|
|
3
3
|
# a string using string_with_format's templating, and strings are concatenated
|
4
4
|
# as-is
|
5
5
|
SugarCubeFormats = {
|
6
|
-
iso8601: [:yyyy, '-', :MM, '-', :dd, ' ', :'HH:mm:ss.SSS']
|
6
|
+
iso8601: [:yyyy, '-', :MM, '-', :dd, ' ', :'HH:mm:ss.SSS'],
|
7
|
+
ymd: [:yyyy, '-', :MM, '-', :dd],
|
8
|
+
hms: [:'HH:mm:ss.SSS'],
|
7
9
|
}
|
8
10
|
|
9
11
|
def self.from_components(components)
|
@@ -15,6 +17,18 @@ class NSDate
|
|
15
17
|
return calendar.dateFromComponents(date_components)
|
16
18
|
end
|
17
19
|
|
20
|
+
def self.today
|
21
|
+
NSDate.new.start_of_day
|
22
|
+
end
|
23
|
+
|
24
|
+
def self.tomorrow
|
25
|
+
NSDate.new.delta(days: 1).start_of_day
|
26
|
+
end
|
27
|
+
|
28
|
+
def self.yesterday
|
29
|
+
NSDate.new.delta(days: -1).start_of_day
|
30
|
+
end
|
31
|
+
|
18
32
|
def string_with_style(date_style=NSDateFormatterMediumStyle,time_style=NSDateFormatterNoStyle)
|
19
33
|
date_formatter = NSDateFormatter.new
|
20
34
|
date_style = date_style.nsdatestyle if date_style.is_a? Symbol
|
@@ -6,6 +6,13 @@ class NSString
|
|
6
6
|
|
7
7
|
@@sugarcube_docs.stringByAppendingPathComponent(self)
|
8
8
|
end
|
9
|
+
|
10
|
+
def cache
|
11
|
+
@@sugarcube_caches ||= NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, true)[0]
|
12
|
+
return self if self.hasPrefix(@@sugarcube_caches)
|
13
|
+
|
14
|
+
@@sugarcube_caches.stringByAppendingPathComponent(self)
|
15
|
+
end
|
9
16
|
|
10
17
|
def exists?
|
11
18
|
NSFileManager.defaultManager.fileExistsAtPath(self.document)
|
data/lib/sugarcube/nsurl.rb
CHANGED
data/lib/sugarcube/to_s/nsset.rb
CHANGED
@@ -2,7 +2,6 @@ class UIViewController
|
|
2
2
|
|
3
3
|
def push(view_controller)
|
4
4
|
self.addChildViewController(view_controller)
|
5
|
-
view_controller.didMoveToParentViewController(self)
|
6
5
|
self
|
7
6
|
end
|
8
7
|
|
@@ -12,6 +11,11 @@ class UIViewController
|
|
12
11
|
push view_controller
|
13
12
|
end
|
14
13
|
|
14
|
+
def pop
|
15
|
+
to_pop = self.childViewControllers[-1]
|
16
|
+
to_pop.removeFromParentViewController
|
17
|
+
end
|
18
|
+
|
15
19
|
end
|
16
20
|
|
17
21
|
|
data/lib/sugarcube/version.rb
CHANGED
data/spec/anonymous_spec.rb
CHANGED
@@ -59,3 +59,163 @@ describe "SugarCube::Anonymous" do
|
|
59
59
|
end
|
60
60
|
|
61
61
|
end
|
62
|
+
|
63
|
+
|
64
|
+
describe "SugarCube::Anonymous nested case" do
|
65
|
+
|
66
|
+
before do
|
67
|
+
@h = SugarCube::Anonymous[
|
68
|
+
{
|
69
|
+
dictionary: { foo: 'FOO', array: [ { is_fine: 'is_fine' } ] },
|
70
|
+
array: [ { bar: 'BAR' }, [ 1, 2, 3 ] ]
|
71
|
+
}
|
72
|
+
]
|
73
|
+
end
|
74
|
+
|
75
|
+
describe "dictionary" do
|
76
|
+
|
77
|
+
it 'should return an instance of SugarCube::Anonymous' do
|
78
|
+
@h.dictionary.class.should == SugarCube::Anonymous
|
79
|
+
end
|
80
|
+
|
81
|
+
it 'should return a hash which contains a string and an array' do
|
82
|
+
@h.dictionary.should == { foo: 'FOO', array: [ { is_fine: 'is_fine' } ] }
|
83
|
+
end
|
84
|
+
|
85
|
+
it 'should not copy again' do
|
86
|
+
@h.dictionary.object_id.should == @h.dictionary.object_id
|
87
|
+
end
|
88
|
+
|
89
|
+
it 'should return is_fine' do
|
90
|
+
@h.dictionary.array[0].is_fine.should == 'is_fine'
|
91
|
+
end
|
92
|
+
|
93
|
+
describe "Enumerable" do
|
94
|
+
|
95
|
+
describe "each" do
|
96
|
+
|
97
|
+
it 'should return an instance of [SugarCube::Anonymous, SugarCube::AnonymousArray]' do
|
98
|
+
a = []
|
99
|
+
@h.each{|k,v| a << v.class}
|
100
|
+
a[0].should == SugarCube::Anonymous
|
101
|
+
a[1].should == SugarCube::AnonymousArray
|
102
|
+
end
|
103
|
+
|
104
|
+
end
|
105
|
+
|
106
|
+
describe "map" do
|
107
|
+
|
108
|
+
it 'should return an instance of [SugarCube::Anonymous, SugarCube::AnonymousArray]' do
|
109
|
+
a = @h.map{|k,v| v.class}
|
110
|
+
a[0].should == SugarCube::Anonymous
|
111
|
+
a[1].should == SugarCube::AnonymousArray
|
112
|
+
end
|
113
|
+
|
114
|
+
end
|
115
|
+
|
116
|
+
describe "collect" do
|
117
|
+
|
118
|
+
it 'should return an instance of [SugarCube::Anonymous, SugarCube::AnonymousArray]' do
|
119
|
+
a = @h.collect{|k,v| v.class}
|
120
|
+
a[0].should == SugarCube::Anonymous
|
121
|
+
a[1].should == SugarCube::AnonymousArray
|
122
|
+
end
|
123
|
+
|
124
|
+
end
|
125
|
+
|
126
|
+
end
|
127
|
+
|
128
|
+
end
|
129
|
+
|
130
|
+
describe "array" do
|
131
|
+
|
132
|
+
it 'should return an instance of SugarCube::AnonymousArray' do
|
133
|
+
@h.array.class.should == SugarCube::AnonymousArray
|
134
|
+
end
|
135
|
+
|
136
|
+
it 'should not copy again' do
|
137
|
+
@h.array.object_id.should == @h.array.object_id
|
138
|
+
end
|
139
|
+
|
140
|
+
describe "inner object" do
|
141
|
+
|
142
|
+
it 'should return an instance of SugarCube::Anonymous' do
|
143
|
+
@h.array[0].class.should == SugarCube::Anonymous
|
144
|
+
end
|
145
|
+
|
146
|
+
it 'should return an instance of SugarCube::Anonymous' do
|
147
|
+
@h.array.first.class.should == SugarCube::Anonymous
|
148
|
+
end
|
149
|
+
|
150
|
+
it 'should return an instance of SugarCube::AnonymousArray' do
|
151
|
+
@h.array[1].class.should == SugarCube::AnonymousArray
|
152
|
+
end
|
153
|
+
|
154
|
+
it 'should return an instance of SugarCube::AnonymousArray' do
|
155
|
+
@h.array.last.class.should == SugarCube::AnonymousArray
|
156
|
+
end
|
157
|
+
|
158
|
+
end
|
159
|
+
|
160
|
+
describe "Enumerable" do
|
161
|
+
|
162
|
+
describe "each" do
|
163
|
+
|
164
|
+
it 'should return an instance of [SugarCube::Anonymous, SugarCube::AnonymousArray]' do
|
165
|
+
a = []
|
166
|
+
@h.array.each{|e| a << e.class}
|
167
|
+
a[0].should == SugarCube::Anonymous
|
168
|
+
a[1].should == SugarCube::AnonymousArray
|
169
|
+
end
|
170
|
+
|
171
|
+
end
|
172
|
+
|
173
|
+
describe "each_with_index" do
|
174
|
+
|
175
|
+
it 'should return an instance of [0,1]' do
|
176
|
+
a = []
|
177
|
+
@h.array.each_with_index{|e,i| a << i}
|
178
|
+
a.should == [0,1]
|
179
|
+
end
|
180
|
+
|
181
|
+
end
|
182
|
+
|
183
|
+
describe "map" do
|
184
|
+
|
185
|
+
it 'should return an instance of [SugarCube::Anonymous, SugarCube::AnonymousArray]' do
|
186
|
+
a = @h.array.map{|e| e.class}
|
187
|
+
a[0].should == SugarCube::Anonymous
|
188
|
+
a[1].should == SugarCube::AnonymousArray
|
189
|
+
end
|
190
|
+
|
191
|
+
end
|
192
|
+
|
193
|
+
describe "collect" do
|
194
|
+
|
195
|
+
it 'should return an instance of [SugarCube::Anonymous, SugarCube::AnonymousArray]' do
|
196
|
+
a = @h.array.collect{|e| e.class}
|
197
|
+
a[0].should == SugarCube::Anonymous
|
198
|
+
a[1].should == SugarCube::AnonymousArray
|
199
|
+
end
|
200
|
+
|
201
|
+
end
|
202
|
+
|
203
|
+
describe "find" do
|
204
|
+
|
205
|
+
it 'should return then first object' do
|
206
|
+
r = @h.array.find{|e| e.is_a? Hash}
|
207
|
+
r.should == @h.array[0]
|
208
|
+
end
|
209
|
+
|
210
|
+
it 'should return the second object' do
|
211
|
+
r = @h.array.find{|e| e.is_a? Array}
|
212
|
+
r.should == @h.array[1]
|
213
|
+
end
|
214
|
+
|
215
|
+
end
|
216
|
+
|
217
|
+
end
|
218
|
+
|
219
|
+
end
|
220
|
+
|
221
|
+
end
|
data/spec/nsarray_spec.rb
CHANGED
data/spec/nsdate_spec.rb
CHANGED
@@ -7,6 +7,37 @@ describe "NSDate" do
|
|
7
7
|
date.day.should == 2
|
8
8
|
end
|
9
9
|
|
10
|
+
it "Should have an NSDate##today method" do
|
11
|
+
now = NSDate.new
|
12
|
+
date = NSDate.today
|
13
|
+
date.year.should == now.year
|
14
|
+
date.month.should == now.month
|
15
|
+
date.day.should == now.day
|
16
|
+
date.hour.should == 0
|
17
|
+
date.min.should == 0
|
18
|
+
date.sec.should == 0
|
19
|
+
end
|
20
|
+
|
21
|
+
it "Should have an NSDate##yesterday method" do
|
22
|
+
now = NSDate.today
|
23
|
+
date = NSDate.yesterday
|
24
|
+
date.hour.should == 0
|
25
|
+
date.min.should == 0
|
26
|
+
date.sec.should == 0
|
27
|
+
(now - date).in_hours.should >= 23 # keep in mind daylight
|
28
|
+
(now - date).in_hours.should <= 25 # savings time.
|
29
|
+
end
|
30
|
+
|
31
|
+
it "Should have an NSDate##tomorrow method" do
|
32
|
+
now = NSDate.today
|
33
|
+
date = NSDate.tomorrow
|
34
|
+
date.hour.should == 0
|
35
|
+
date.min.should == 0
|
36
|
+
date.sec.should == 0
|
37
|
+
(date - now).in_hours.should >= 23 # keep in mind daylight
|
38
|
+
(date - now).in_hours.should <= 25 # savings time.
|
39
|
+
end
|
40
|
+
|
10
41
|
before do
|
11
42
|
@date = NSDate.from_components(year: 2013, month: 1, day: 2, hour:12, minute: 15, second: 30)
|
12
43
|
end
|
data/spec/nsset_spec.rb
ADDED
data/spec/nsstring_files_spec.rb
CHANGED
@@ -2,6 +2,12 @@ describe 'NSString' do
|
|
2
2
|
|
3
3
|
it "should have a #document method" do
|
4
4
|
'foo'.document.hasPrefix('/Users').should == true
|
5
|
+
'foo'.document.hasSuffix('Documents/foo').should == true
|
6
|
+
end
|
7
|
+
|
8
|
+
it "should have a #cache method" do
|
9
|
+
'foo'.cache.hasPrefix('/Users').should == true
|
10
|
+
'foo'.cache.hasSuffix('Library/Caches/foo').should == true
|
5
11
|
end
|
6
12
|
|
7
13
|
it "should have an #exists? method" do
|
data/spec/nsurl_spec.rb
CHANGED
@@ -1,19 +1,31 @@
|
|
1
1
|
describe 'UIViewController' do
|
2
2
|
|
3
|
+
before do
|
4
|
+
@root_controller = UIViewController.new
|
5
|
+
@second_controller = UIViewController.new
|
6
|
+
@third_controller = UIViewController.new
|
7
|
+
end
|
8
|
+
|
3
9
|
it 'should have `push` method' do
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
controller.childViewControllers.length.should == 2
|
10
|
+
@root_controller.push @second_controller
|
11
|
+
@root_controller.childViewControllers.length.should == 1
|
12
|
+
@root_controller.push @third_controller
|
13
|
+
@root_controller.childViewControllers.length.should == 2
|
9
14
|
end
|
10
15
|
|
11
16
|
it 'should have `<<` method' do
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
+
@root_controller << @second_controller
|
18
|
+
@root_controller.childViewControllers.length.should == 1
|
19
|
+
@root_controller << @third_controller
|
20
|
+
@root_controller.childViewControllers.length.should == 2
|
21
|
+
end
|
22
|
+
|
23
|
+
it 'should have `pop()` method' do
|
24
|
+
@root_controller.push(@second_controller)
|
25
|
+
length = @root_controller.childViewControllers.length
|
26
|
+
popped = @root_controller.pop
|
27
|
+
@root_controller.childViewControllers.length.should == length - 1
|
28
|
+
popped.should == @second_controller
|
17
29
|
end
|
18
30
|
|
19
31
|
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.20.
|
4
|
+
version: 0.20.3
|
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-04-01 00:00:00.000000000 Z
|
17
17
|
dependencies: []
|
18
18
|
description: ! '== Description
|
19
19
|
|
@@ -54,6 +54,7 @@ files:
|
|
54
54
|
- lib/sugarcube-568/uiimage.rb
|
55
55
|
- lib/sugarcube-anonymous.rb
|
56
56
|
- lib/sugarcube-anonymous/anonymous.rb
|
57
|
+
- lib/sugarcube-anonymous/anonymous_array.rb
|
57
58
|
- lib/sugarcube-attributedstring.rb
|
58
59
|
- lib/sugarcube-attributedstring/nsattributedstring.rb
|
59
60
|
- lib/sugarcube-gestures.rb
|
@@ -144,6 +145,7 @@ files:
|
|
144
145
|
- spec/nsdate_delta_spec.rb
|
145
146
|
- spec/nsdate_spec.rb
|
146
147
|
- spec/nsdate_upto_spec.rb
|
148
|
+
- spec/nsset_spec.rb
|
147
149
|
- spec/nsstring_files_spec.rb
|
148
150
|
- spec/nsstring_spec.rb
|
149
151
|
- spec/nsurl_spec.rb
|
@@ -207,6 +209,7 @@ test_files:
|
|
207
209
|
- spec/nsdate_delta_spec.rb
|
208
210
|
- spec/nsdate_spec.rb
|
209
211
|
- spec/nsdate_upto_spec.rb
|
212
|
+
- spec/nsset_spec.rb
|
210
213
|
- spec/nsstring_files_spec.rb
|
211
214
|
- spec/nsstring_spec.rb
|
212
215
|
- spec/nsurl_spec.rb
|