candle 0.0.1

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.
Files changed (164) hide show
  1. data/LICENSE.txt +20 -0
  2. data/README.md +4 -0
  3. data/VERSION +1 -0
  4. data/bin/candle +21 -0
  5. data/lib/candle.rb +68 -0
  6. data/lib/candle/command.rb +27 -0
  7. data/lib/candle/generators/actions.rb +183 -0
  8. data/lib/candle/generators/blank.rb +127 -0
  9. data/lib/candle/generators/cli.rb +55 -0
  10. data/lib/candle/generators/help.rb +47 -0
  11. data/lib/candle/generators/jam.rb +80 -0
  12. data/lib/candle/generators/lua/scripts/AppDelegate.lua +36 -0
  13. data/lib/candle/generators/lua/scripts/tests/init.lua +6 -0
  14. data/lib/candle/generators/lua/scripts/tests/someTest.lua +12 -0
  15. data/lib/candle/generators/lua/wax/ProtocolLoader.h +12 -0
  16. data/lib/candle/generators/lua/wax/bin/hammer +157 -0
  17. data/lib/candle/generators/lua/wax/bin/update-xibs +131 -0
  18. data/lib/candle/generators/lua/wax/bin/waxsim +0 -0
  19. data/lib/candle/generators/lua/wax/lib/build-scripts/compile-stdlib.sh +14 -0
  20. data/lib/candle/generators/lua/wax/lib/build-scripts/copy-scripts.sh +58 -0
  21. data/lib/candle/generators/lua/wax/lib/build-scripts/luac.lua +80 -0
  22. data/lib/candle/generators/lua/wax/lib/extensions/CGAffine/wax_CGTransform.h +12 -0
  23. data/lib/candle/generators/lua/wax/lib/extensions/CGAffine/wax_CGTransform.m +85 -0
  24. data/lib/candle/generators/lua/wax/lib/extensions/CGContext/wax_CGContext.h +12 -0
  25. data/lib/candle/generators/lua/wax/lib/extensions/CGContext/wax_CGContext.m +251 -0
  26. data/lib/candle/generators/lua/wax/lib/extensions/HTTP/wax_http.h +14 -0
  27. data/lib/candle/generators/lua/wax/lib/extensions/HTTP/wax_http.m +240 -0
  28. data/lib/candle/generators/lua/wax/lib/extensions/HTTP/wax_http_connection.h +54 -0
  29. data/lib/candle/generators/lua/wax/lib/extensions/HTTP/wax_http_connection.m +304 -0
  30. data/lib/candle/generators/lua/wax/lib/extensions/filesystem/wax_filesystem.h +9 -0
  31. data/lib/candle/generators/lua/wax/lib/extensions/filesystem/wax_filesystem.m +273 -0
  32. data/lib/candle/generators/lua/wax/lib/extensions/json/Rakefile +10 -0
  33. data/lib/candle/generators/lua/wax/lib/extensions/json/wax_json.c +304 -0
  34. data/lib/candle/generators/lua/wax/lib/extensions/json/wax_json.h +11 -0
  35. data/lib/candle/generators/lua/wax/lib/extensions/json/yajl-1.0.9.tar.gz +0 -0
  36. data/lib/candle/generators/lua/wax/lib/extensions/json/yajl/api/yajl_common.h +85 -0
  37. data/lib/candle/generators/lua/wax/lib/extensions/json/yajl/api/yajl_gen.h +159 -0
  38. data/lib/candle/generators/lua/wax/lib/extensions/json/yajl/api/yajl_parse.h +193 -0
  39. data/lib/candle/generators/lua/wax/lib/extensions/json/yajl/yajl.c +159 -0
  40. data/lib/candle/generators/lua/wax/lib/extensions/json/yajl/yajl_alloc.c +65 -0
  41. data/lib/candle/generators/lua/wax/lib/extensions/json/yajl/yajl_alloc.h +50 -0
  42. data/lib/candle/generators/lua/wax/lib/extensions/json/yajl/yajl_buf.c +119 -0
  43. data/lib/candle/generators/lua/wax/lib/extensions/json/yajl/yajl_buf.h +73 -0
  44. data/lib/candle/generators/lua/wax/lib/extensions/json/yajl/yajl_bytestack.h +85 -0
  45. data/lib/candle/generators/lua/wax/lib/extensions/json/yajl/yajl_common.h +85 -0
  46. data/lib/candle/generators/lua/wax/lib/extensions/json/yajl/yajl_encode.c +188 -0
  47. data/lib/candle/generators/lua/wax/lib/extensions/json/yajl/yajl_encode.h +50 -0
  48. data/lib/candle/generators/lua/wax/lib/extensions/json/yajl/yajl_gen.c +322 -0
  49. data/lib/candle/generators/lua/wax/lib/extensions/json/yajl/yajl_gen.h +159 -0
  50. data/lib/candle/generators/lua/wax/lib/extensions/json/yajl/yajl_lex.c +737 -0
  51. data/lib/candle/generators/lua/wax/lib/extensions/json/yajl/yajl_lex.h +133 -0
  52. data/lib/candle/generators/lua/wax/lib/extensions/json/yajl/yajl_parse.h +193 -0
  53. data/lib/candle/generators/lua/wax/lib/extensions/json/yajl/yajl_parser.c +448 -0
  54. data/lib/candle/generators/lua/wax/lib/extensions/json/yajl/yajl_parser.h +82 -0
  55. data/lib/candle/generators/lua/wax/lib/lua/lapi.c +1087 -0
  56. data/lib/candle/generators/lua/wax/lib/lua/lapi.h +16 -0
  57. data/lib/candle/generators/lua/wax/lib/lua/lauxlib.c +652 -0
  58. data/lib/candle/generators/lua/wax/lib/lua/lauxlib.h +174 -0
  59. data/lib/candle/generators/lua/wax/lib/lua/lbaselib.c +653 -0
  60. data/lib/candle/generators/lua/wax/lib/lua/lcode.c +839 -0
  61. data/lib/candle/generators/lua/wax/lib/lua/lcode.h +76 -0
  62. data/lib/candle/generators/lua/wax/lib/lua/ldblib.c +397 -0
  63. data/lib/candle/generators/lua/wax/lib/lua/ldebug.c +638 -0
  64. data/lib/candle/generators/lua/wax/lib/lua/ldebug.h +33 -0
  65. data/lib/candle/generators/lua/wax/lib/lua/ldo.c +518 -0
  66. data/lib/candle/generators/lua/wax/lib/lua/ldo.h +57 -0
  67. data/lib/candle/generators/lua/wax/lib/lua/ldump.c +164 -0
  68. data/lib/candle/generators/lua/wax/lib/lua/lfunc.c +174 -0
  69. data/lib/candle/generators/lua/wax/lib/lua/lfunc.h +34 -0
  70. data/lib/candle/generators/lua/wax/lib/lua/lgc.c +711 -0
  71. data/lib/candle/generators/lua/wax/lib/lua/lgc.h +110 -0
  72. data/lib/candle/generators/lua/wax/lib/lua/linit.c +38 -0
  73. data/lib/candle/generators/lua/wax/lib/lua/liolib.c +553 -0
  74. data/lib/candle/generators/lua/wax/lib/lua/llex.c +461 -0
  75. data/lib/candle/generators/lua/wax/lib/lua/llex.h +81 -0
  76. data/lib/candle/generators/lua/wax/lib/lua/llimits.h +128 -0
  77. data/lib/candle/generators/lua/wax/lib/lua/lmathlib.c +263 -0
  78. data/lib/candle/generators/lua/wax/lib/lua/lmem.c +86 -0
  79. data/lib/candle/generators/lua/wax/lib/lua/lmem.h +49 -0
  80. data/lib/candle/generators/lua/wax/lib/lua/loadlib.c +666 -0
  81. data/lib/candle/generators/lua/wax/lib/lua/lobject.c +214 -0
  82. data/lib/candle/generators/lua/wax/lib/lua/lobject.h +381 -0
  83. data/lib/candle/generators/lua/wax/lib/lua/lopcodes.c +102 -0
  84. data/lib/candle/generators/lua/wax/lib/lua/lopcodes.h +268 -0
  85. data/lib/candle/generators/lua/wax/lib/lua/loslib.c +243 -0
  86. data/lib/candle/generators/lua/wax/lib/lua/lparser.c +1339 -0
  87. data/lib/candle/generators/lua/wax/lib/lua/lparser.h +82 -0
  88. data/lib/candle/generators/lua/wax/lib/lua/lstate.c +214 -0
  89. data/lib/candle/generators/lua/wax/lib/lua/lstate.h +169 -0
  90. data/lib/candle/generators/lua/wax/lib/lua/lstring.c +111 -0
  91. data/lib/candle/generators/lua/wax/lib/lua/lstring.h +31 -0
  92. data/lib/candle/generators/lua/wax/lib/lua/lstrlib.c +869 -0
  93. data/lib/candle/generators/lua/wax/lib/lua/ltable.c +588 -0
  94. data/lib/candle/generators/lua/wax/lib/lua/ltable.h +40 -0
  95. data/lib/candle/generators/lua/wax/lib/lua/ltablib.c +287 -0
  96. data/lib/candle/generators/lua/wax/lib/lua/ltm.c +75 -0
  97. data/lib/candle/generators/lua/wax/lib/lua/ltm.h +54 -0
  98. data/lib/candle/generators/lua/wax/lib/lua/lua.h +388 -0
  99. data/lib/candle/generators/lua/wax/lib/lua/luaconf.h +753 -0
  100. data/lib/candle/generators/lua/wax/lib/lua/lualib.h +53 -0
  101. data/lib/candle/generators/lua/wax/lib/lua/lundump.c +227 -0
  102. data/lib/candle/generators/lua/wax/lib/lua/lundump.h +36 -0
  103. data/lib/candle/generators/lua/wax/lib/lua/lvm.c +763 -0
  104. data/lib/candle/generators/lua/wax/lib/lua/lvm.h +36 -0
  105. data/lib/candle/generators/lua/wax/lib/lua/lzio.c +82 -0
  106. data/lib/candle/generators/lua/wax/lib/lua/lzio.h +67 -0
  107. data/lib/candle/generators/lua/wax/lib/lua/print.c +227 -0
  108. data/lib/candle/generators/lua/wax/lib/project.rake +159 -0
  109. data/lib/candle/generators/lua/wax/lib/stdlib/enums.lua +396 -0
  110. data/lib/candle/generators/lua/wax/lib/stdlib/ext/http.lua +43 -0
  111. data/lib/candle/generators/lua/wax/lib/stdlib/ext/init.lua +4 -0
  112. data/lib/candle/generators/lua/wax/lib/stdlib/ext/number.lua +21 -0
  113. data/lib/candle/generators/lua/wax/lib/stdlib/ext/string.lua +97 -0
  114. data/lib/candle/generators/lua/wax/lib/stdlib/ext/table.lua +165 -0
  115. data/lib/candle/generators/lua/wax/lib/stdlib/helpers/WaxServer.lua +49 -0
  116. data/lib/candle/generators/lua/wax/lib/stdlib/helpers/autoload.lua +10 -0
  117. data/lib/candle/generators/lua/wax/lib/stdlib/helpers/base64.lua +64 -0
  118. data/lib/candle/generators/lua/wax/lib/stdlib/helpers/bit.lua +274 -0
  119. data/lib/candle/generators/lua/wax/lib/stdlib/helpers/cache.lua +73 -0
  120. data/lib/candle/generators/lua/wax/lib/stdlib/helpers/callback.lua +22 -0
  121. data/lib/candle/generators/lua/wax/lib/stdlib/helpers/frame.lua +76 -0
  122. data/lib/candle/generators/lua/wax/lib/stdlib/helpers/init.lua +78 -0
  123. data/lib/candle/generators/lua/wax/lib/stdlib/helpers/pickView.lua +54 -0
  124. data/lib/candle/generators/lua/wax/lib/stdlib/helpers/time.lua +102 -0
  125. data/lib/candle/generators/lua/wax/lib/stdlib/init.lua +18 -0
  126. data/lib/candle/generators/lua/wax/lib/stdlib/luaspec/init.lua +2 -0
  127. data/lib/candle/generators/lua/wax/lib/stdlib/luaspec/luamock.lua +84 -0
  128. data/lib/candle/generators/lua/wax/lib/stdlib/luaspec/luaspec.lua +377 -0
  129. data/lib/candle/generators/lua/wax/lib/stdlib/repl.lua +9 -0
  130. data/lib/candle/generators/lua/wax/lib/stdlib/structs.lua +11 -0
  131. data/lib/candle/generators/lua/wax/lib/stdlib/waxClass.lua +42 -0
  132. data/lib/candle/generators/lua/wax/lib/wax.h +16 -0
  133. data/lib/candle/generators/lua/wax/lib/wax.m +260 -0
  134. data/lib/candle/generators/lua/wax/lib/wax_class.h +18 -0
  135. data/lib/candle/generators/lua/wax/lib/wax_class.m +190 -0
  136. data/lib/candle/generators/lua/wax/lib/wax_gc.h +20 -0
  137. data/lib/candle/generators/lua/wax/lib/wax_gc.m +56 -0
  138. data/lib/candle/generators/lua/wax/lib/wax_helpers.h +102 -0
  139. data/lib/candle/generators/lua/wax/lib/wax_helpers.m +870 -0
  140. data/lib/candle/generators/lua/wax/lib/wax_instance.h +34 -0
  141. data/lib/candle/generators/lua/wax/lib/wax_instance.m +810 -0
  142. data/lib/candle/generators/lua/wax/lib/wax_server.h +47 -0
  143. data/lib/candle/generators/lua/wax/lib/wax_server.m +252 -0
  144. data/lib/candle/generators/lua/wax/lib/wax_stdlib.h +3 -0
  145. data/lib/candle/generators/lua/wax/lib/wax_struct.h +26 -0
  146. data/lib/candle/generators/lua/wax/lib/wax_struct.m +335 -0
  147. data/lib/candle/generators/templates/blank/WaxApplication.xcodeproj/project.pbxproj +836 -0
  148. data/lib/candle/generators/templates/blank/WaxApplication.xcodeproj/project.xcworkspace/contents.xcworkspacedata +7 -0
  149. data/lib/candle/generators/templates/blank/WaxApplication.xcodeproj/project.xcworkspace/xcuserdata/eiffel.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
  150. data/lib/candle/generators/templates/blank/WaxApplication.xcodeproj/xcuserdata/eiffel.xcuserdatad/xcschemes/WaxApplication.xcscheme +86 -0
  151. data/lib/candle/generators/templates/blank/WaxApplication.xcodeproj/xcuserdata/eiffel.xcuserdatad/xcschemes/xcschememanagement.plist +22 -0
  152. data/lib/candle/generators/templates/blank/WaxApplication/Default-568h@2x.png +0 -0
  153. data/lib/candle/generators/templates/blank/WaxApplication/Default.png +0 -0
  154. data/lib/candle/generators/templates/blank/WaxApplication/Default@2x.png +0 -0
  155. data/lib/candle/generators/templates/blank/WaxApplication/ProtocolLoader.h +12 -0
  156. data/lib/candle/generators/templates/blank/WaxApplication/WaxApplication-Info.plist.tt +38 -0
  157. data/lib/candle/generators/templates/blank/WaxApplication/WaxApplication-Prefix.pch.tt +14 -0
  158. data/lib/candle/generators/templates/blank/WaxApplication/en.lproj/InfoPlist.strings +2 -0
  159. data/lib/candle/generators/templates/blank/WaxApplication/main.m.tt +20 -0
  160. data/lib/candle/tasks.rb +22 -0
  161. data/lib/candle/utility.rb +30 -0
  162. data/lib/candle/version.rb +9 -0
  163. data/lib/candle/view.rb +48 -0
  164. metadata +582 -0
@@ -0,0 +1,73 @@
1
+ wax.cache = {}
2
+ setmetatable(wax.cache, wax.cache)
3
+
4
+ -- Returns contents of cache keys
5
+ -- key: string # value for cache
6
+ -- maxAge: number (optional) # max age of file in seconds
7
+ function wax.cache.get(key, maxAge)
8
+ local path = wax.cache.pathFor(key)
9
+
10
+ if not wax.filesystem.isFile(path) then return nil end
11
+
12
+ if maxAge then
13
+ local fileAge = os.time() - wax.filesystem.attributes(path).modifiedAt
14
+ if fileAge > maxAge then
15
+ return nil
16
+ end
17
+ end
18
+
19
+ local success, result = pcall(function()
20
+ return NSKeyedUnarchiver:unarchiveObjectWithFile(path)
21
+ end)
22
+
23
+ if not success then -- Bad cache
24
+ puts("Error: Couldn't read cache with key %s", key)
25
+ wax.cache.clear(key)
26
+ return nil
27
+ else
28
+ return result
29
+ end
30
+ end
31
+
32
+ -- Creates a cache for the key with contents
33
+ -- key: string # value for the cache
34
+ -- contents: object # whatever is NSKeyedArchive compatible
35
+ function wax.cache.set(key, contents)
36
+ local path = wax.cache.pathFor(key)
37
+
38
+ if not contents then -- delete the value from the cache
39
+ wax.cache.clear(key)
40
+ else
41
+ local success = NSKeyedArchiver:archiveRootObject_toFile(contents, path)
42
+ if not success then puts("Couldn't archive cache '%s' to '%s'", key, path) end
43
+ end
44
+ end
45
+
46
+ function wax.cache.age(key)
47
+ local path = wax.cache.pathFor(key)
48
+
49
+ -- If there is no file, just send them back a really big age. Cleaner than
50
+ -- dealing with nils
51
+ if not wax.filesystem.isFile(path) then return wax.time.days(1000) end
52
+
53
+ local fileAge = os.time() - wax.filesystem.attributes(path).modifiedAt
54
+ return fileAge
55
+ end
56
+
57
+ -- Removes specific keys from cache
58
+ function wax.cache.clear(...)
59
+ for i, key in ipairs({...}) do
60
+ local path = wax.cache.pathFor(key)
61
+ wax.filesystem.delete(path)
62
+ end
63
+ end
64
+
65
+ -- Removes entire cache dir
66
+ function wax.cache.clearAll()
67
+ wax.filesystem.delete(NSCacheDirectory)
68
+ wax.filesystem.createDir(NSCacheDirectory)
69
+ end
70
+
71
+ function wax.cache.pathFor(key)
72
+ return NSCacheDirectory .. "/" .. wax.base64.encode(key)
73
+ end
@@ -0,0 +1,22 @@
1
+ -- Let's us cancel a callback
2
+
3
+ wax.callback = function(callback)
4
+ local object = {callback = callback}
5
+
6
+ function object.cancel(self)
7
+ self.canceled = true
8
+ end
9
+
10
+ function object.__call(self, ...)
11
+ if self.canceled then
12
+ return
13
+ end
14
+
15
+ local args = self.scope and {self.scope, ...} or {...}
16
+ self.callback(unpack(args))
17
+ end
18
+
19
+ setmetatable(object, object)
20
+
21
+ return object
22
+ end
@@ -0,0 +1,76 @@
1
+ -- This is weird code... I'm just playing with an idea
2
+ function wax.frame(object)
3
+ return wax.dimensions(object, "frame")
4
+ end
5
+
6
+ function wax.bounds(object)
7
+ return wax.dimensions(object, "bounds")
8
+ end
9
+
10
+ function wax.dimensions(object, varName)
11
+ return setmetatable({
12
+ object = object,
13
+ center = function(self)
14
+ local offset = (wax.dimensions(self.object:superview(), varName).width - self.width) / 2
15
+ self.x = offset
16
+ return self
17
+ end,
18
+ },
19
+ {
20
+ __index = function(self, key)
21
+ if key == "y" then key = "top"
22
+ elseif key == "x" then key = "left"
23
+ end
24
+
25
+ local dimensions = (varName == "frame") and object:frame() or object:bounds()
26
+ if key == "left" then return dimensions.x
27
+ elseif key == "right" then return dimensions.x + dimensions.width
28
+ elseif key == "top" then return dimensions.y
29
+ elseif key == "bottom" then return dimensions.y + dimensions.height
30
+ elseif key == "height" then return dimensions.height
31
+ elseif key == "width" then return dimensions.width
32
+
33
+ elseif key == "size" then return CGSize(dimensions.width, dimensions.height)
34
+ elseif key == "origin" then return CGPoint(dimensions.x, dimensions.y)
35
+
36
+ else
37
+ error("Unknown frame key: " .. key)
38
+ end
39
+ end,
40
+
41
+ __newindex = function(self, key, value)
42
+ if key == "y" then key = "top"
43
+ elseif key == "x" then key = "left"
44
+ end
45
+
46
+ local dimensions = (varName == "frame") and object:frame() or object:bounds()
47
+ if key == "left" then dimensions.x = value
48
+ elseif key == "right" then dimensions.x = value - dimensions.width
49
+ elseif key == "top" then dimensions.y = value
50
+ elseif key == "bottom" then dimensions.y = value - dimensions.height
51
+ elseif key == "height" then dimensions.height = value
52
+ elseif key == "width" then dimensions.width = value
53
+
54
+ elseif key == "size" then dimensions.width = value.width dimensions.height = value.height
55
+ elseif key == "origin" then dimensions.x = value.x dimensions.y = value.y
56
+ elseif key == "stretchTop" then
57
+ dimensions.height = dimensions.height - (value - dimensions.y)
58
+ dimensions.y = value
59
+ elseif key == "stretchBottom" then
60
+ dimensions.height = dimensions.height + (value - (dimensions.height + dimensions.y))
61
+ elseif key == "stretchRight" then
62
+ dimensions.width = dimensions.width + (value - (dimensions.width + dimensions.x))
63
+ else
64
+ error("Unknown frame key: " .. key)
65
+ end
66
+
67
+ if (varName == "frame") then
68
+ object:setFrame(dimensions)
69
+ else
70
+ object:setBounds(dimensions)
71
+ end
72
+
73
+ return self
74
+ end
75
+ })
76
+ end
@@ -0,0 +1,78 @@
1
+ require "wax.helpers.bit"
2
+ require "wax.helpers.callback"
3
+ require "wax.helpers.frame"
4
+ require "wax.helpers.base64"
5
+ require "wax.helpers.time"
6
+ require "wax.helpers.cache"
7
+ require "wax.helpers.autoload"
8
+ require "wax.helpers.WaxServer"
9
+ require "wax.helpers.pickView"
10
+
11
+ -- Just a bunch of global helper functions
12
+
13
+ function IBOutlet(...)
14
+ -- does nothing... just used so we can parse it
15
+ end
16
+
17
+ function wax.alert(title, message, ...)
18
+ local alert = UIAlertView:init()
19
+ alert:setTitle(title)
20
+ alert:setMessage(message)
21
+
22
+ if not ... then
23
+ alert:addButtonWithTitle("OK")
24
+ else
25
+ for i, name in ipairs{...} do
26
+ alert:addButtonWithTitle(name)
27
+ end
28
+ end
29
+
30
+ alert:show()
31
+
32
+ return alert
33
+ end
34
+
35
+ -- Forces print to use NSLog
36
+ if not UIDevice:currentDevice():model():match("iPhone Simulator") then
37
+ function print(obj)
38
+ -- if there is an error, ignore it
39
+ pcall(function() wax.print(tostring(obj)) end)
40
+ end
41
+ end
42
+
43
+ function wax.tostring(obj, ...)
44
+ if type(obj) == "table" then
45
+ return table.tostring(obj)
46
+ end
47
+
48
+ if ... then
49
+ obj = string.format(tostring(obj), ...)
50
+ else
51
+ obj = tostring(obj)
52
+ end
53
+
54
+ return obj
55
+ end
56
+
57
+ function puts(obj, ...)
58
+ print(wax.tostring(obj, ...))
59
+ end
60
+
61
+ function wax.guid()
62
+ return NSProcessInfo:processInfo():globallyUniqueString()
63
+ end
64
+
65
+ function wax.eval(input)
66
+ return pcall(function()
67
+ if not input:match("=") then
68
+ input = "do return (" .. input .. ") end"
69
+ end
70
+
71
+ local code, err = loadstring(input, "REPL")
72
+ if err then
73
+ error("Syntax Error: " .. err)
74
+ else
75
+ puts(code())
76
+ end
77
+ end)
78
+ end
@@ -0,0 +1,54 @@
1
+
2
+ function startPick()
3
+ local w = UIApplication:sharedApplication():keyWindow()
4
+ _interceptor = InterceptorView:alloc():initWithFrame(w:bounds())
5
+ w:addSubview(_interceptor)
6
+ return "Go on, touch something. Get the view by calling endPick() when you're done."
7
+ end
8
+
9
+ function endPick()
10
+ local v = _interceptor:pickedView()
11
+ _interceptor:removeFromSuperview()
12
+ return v
13
+ end
14
+
15
+ -- wax doesn't automagically bridge C functions
16
+ function CGRectContainsPoint(rect, point)
17
+ return rect.x <= point.x
18
+ and point.x <= rect.x + rect.width
19
+ and rect.y <= point.y
20
+ and point.y <= rect.y + rect.height
21
+ end
22
+
23
+ waxClass{"InterceptorView", UIView}
24
+
25
+ function touchesEnded_withEvent(self, touches, event)
26
+ local point = touches:anyObject():locationInView(self)
27
+ local w = UIApplication:sharedApplication():keyWindow()
28
+ local pointInWindow = w:convertPoint_fromView(point, self)
29
+ self.pickedView_ = self:findOwnerOfPoint_startingWith(pointInWindow, w)
30
+ print(self.pickedView_:class())
31
+ end
32
+
33
+ function pickedView(self)
34
+ return self.pickedView_
35
+ end
36
+
37
+ function findOwnerOfPoint_startingWith(self, point, view)
38
+ if view == self then
39
+ return nil
40
+ end
41
+
42
+ if not CGRectContainsPoint(view:bounds(), point) then
43
+ return nil
44
+ end
45
+
46
+ local betterResult = nil
47
+
48
+ for i, subview in ipairs(view:subviews()) do
49
+ pointInSubview = subview:convertPoint_fromView(point, view)
50
+ betterResult = self:findOwnerOfPoint_startingWith(pointInSubview, subview) or betterResult
51
+ end
52
+
53
+ return betterResult or view
54
+ end
@@ -0,0 +1,102 @@
1
+ wax.time = {}
2
+
3
+ function wax.time.minutes(number)
4
+ return number * 60
5
+ end
6
+
7
+ function wax.time.hours(number)
8
+ return number * wax.time.minutes(60)
9
+ end
10
+
11
+ function wax.time.days(number)
12
+ return number * wax.time.hours(24)
13
+ end
14
+
15
+ -- Pattern match formats found here http://unicode.org/reports/tr35/tr35-6.html#Date_Format_Patterns
16
+ function wax.time.formatDate(date, pattern)
17
+ if not wax.time._outputFormatter then
18
+ wax.time._outputFormatter = NSDateFormatter:init()
19
+ local locale = NSLocale:initWithLocaleIdentifier("en_US_POSIX")
20
+ wax.time._outputFormatter:setLocale(locale)
21
+ end
22
+
23
+ wax.time._outputFormatter:setDateFormat(pattern or "MMMM d")
24
+ return wax.time._outputFormatter:stringFromDate(date)
25
+ end
26
+
27
+ -- Pattern match formats found here http://unicode.org/reports/tr35/tr35-6.html#Date_Format_Patterns
28
+ function wax.time.parseDate(dateString, pattern)
29
+ -- I don't think NSDateFormatter can handle times with Z at the end. Someone
30
+ -- prove me wrong!
31
+ dateString = dateString:gsub("Z$", " GMT")
32
+
33
+ if not wax.time._inputFormatter then
34
+ wax.time._inputFormatter = NSDateFormatter:init()
35
+ locale = NSLocale:initWithLocaleIdentifier("en_US_POSIX")
36
+ wax.time._inputFormatter:setLocale(locale)
37
+ end
38
+
39
+ wax.time._inputFormatter:setDateFormat(pattern or "yyyy-MM-dd'T'HH:mm:ss ZZZ")
40
+ return wax.time._inputFormatter:dateFromString(dateString)
41
+ end
42
+
43
+ function wax.time.beginingOfDay(date)
44
+ local calendar = NSCalendar:currentCalendar()
45
+ local dateComponents = calendar:components_fromDate(-1, date or NSDate:date())
46
+ local newComponents = NSDateComponents:init()
47
+ newComponents:setYear(dateComponents:year())
48
+ newComponents:setMonth(dateComponents:month())
49
+ newComponents:setDay(dateComponents:day())
50
+
51
+ return calendar:dateFromComponents(newComponents)
52
+ end
53
+
54
+ function wax.time.endOfDay(date)
55
+ local calendar = NSCalendar:currentCalendar()
56
+ local dateComponents = calendar:components_fromDate(-1, date)
57
+ local newComponents = NSDateComponents:init()
58
+ newComponents:setYear(dateComponents:year())
59
+ newComponents:setMonth(dateComponents:month())
60
+ newComponents:setDay(dateComponents:day())
61
+ newComponents:setHour(24)
62
+ newComponents:setMinute(59)
63
+ newComponents:setSecond(59)
64
+
65
+ return calendar:dateFromComponents(newComponents)
66
+ end
67
+
68
+ function wax.time.timeAgoInWords(firstDate, secondDate)
69
+ local difference = (secondDate or NSDate:date()):timeIntervalSince1970() - firstDate:timeIntervalSince1970()
70
+ local seconds = math.abs(difference)
71
+ local minutes = math.floor(seconds / 60)
72
+ local hours = math.floor(minutes / 60)
73
+ local days = math.floor(hours / 24)
74
+ local months = math.floor(days / 30)
75
+
76
+ if minutes <= 1 then return "less than a minute"
77
+ elseif minutes <= 44 then return ("%d minutes"):format(minutes)
78
+ elseif minutes <= 89 then return "about 1 hour"
79
+ elseif hours <= 24 then return ("about %d hours"):format(hours)
80
+ elseif hours <= 47 then return "1 day"
81
+ elseif days <= 29 then return ("%d days"):format(days)
82
+ elseif days <= 59 then return "about 1 month"
83
+ elseif months <= 15 then return "about 1 year"
84
+ elseif months <= 22 then return "over 1 year"
85
+ elseif years < 2 then return "almost 2 years"
86
+ elseif minutes <= 1051199 then return "about 1 year"
87
+ else return ("over %d years"):format(years)
88
+ end
89
+ end
90
+
91
+ function wax.time.since(date, referenceDate)
92
+ referenceDate = referenceDate or NSDate:date()
93
+ local difference = referenceDate:timeIntervalSince1970() - date:timeIntervalSince1970()
94
+ local timeSinceMidnight = date:timeIntervalSince1970() - wax.time.beginingOfDay():timeIntervalSince1970()
95
+
96
+ -- Also returns the preposition as second arg
97
+ if difference < wax.time.days(1) and timeSinceMidnight > 0 then return wax.time.formatDate(date, "h:mm a"), "at"
98
+ elseif difference < wax.time.days(2) then return "Yesterday", ""
99
+ elseif difference < wax.time.days(7) then return wax.time.formatDate(date, "EEEE"), "on"
100
+ else return wax.time.formatDate(date, "MM/dd/yy"), "on"
101
+ end
102
+ end
@@ -0,0 +1,18 @@
1
+ setmetatable(_G, {
2
+ __index = function(self, key)
3
+ local class = wax.class[key]
4
+ if class then self[key] = class end -- cache it for future use
5
+
6
+ if not class and key:match("^[A-Z][A-Z][A-Z][^A-Z]") then -- looks like they were trying to use an objective-c obj
7
+ print("WARNING: No object named '" .. key .. "' found.")
8
+ end
9
+
10
+ return class
11
+ end
12
+ })
13
+
14
+ require "wax.ext"
15
+ require "wax.enums"
16
+ require "wax.structs"
17
+ require "wax.waxClass"
18
+ require "wax.helpers"
@@ -0,0 +1,2 @@
1
+ require "wax.luaspec.luaspec"
2
+ require "wax.luaspec.luamock"
@@ -0,0 +1,84 @@
1
+ Mock = { calls = {}, return_values = {} }
2
+
3
+ -- we store all calls and requested return values indexed
4
+ -- by the mock object, we don't want to hold onto references
5
+ -- when they should be garbage collected to make the tables
6
+ -- be weak
7
+ setmetatable(Mock.calls, { __mode="k" })
8
+ setmetatable(Mock.return_values, { __mode="k" })
9
+
10
+ function Mock.__call(mock, ...)
11
+ Mock.calls[mock] = Mock.calls[mock] or {}
12
+ local calls = Mock.calls[mock]
13
+ calls[#calls+1] = {...}
14
+
15
+ local return_values = Mock.return_values[mock]
16
+
17
+ if return_values and return_values[#calls] then
18
+ return unpack(return_values[#calls])
19
+ end
20
+ end
21
+
22
+ function Mock.__index(mock, key)
23
+ local new_mock = Mock:new()
24
+ rawset(mock, key, new_mock)
25
+ return new_mock
26
+ end
27
+
28
+ function Mock:new()
29
+ local mock = { returns = self.returns, then_returns = self.returns }
30
+ setmetatable(mock, self)
31
+ return mock
32
+ end
33
+
34
+ function Mock:returns(...)
35
+ if getmetatable(self) ~= Mock then
36
+ error("returns must be called with : operator", 2)
37
+ end
38
+ local return_values = Mock.return_values[self] or {}
39
+ return_values[#return_values+1] = {...}
40
+ Mock.return_values[self] = return_values
41
+ return self
42
+ end
43
+
44
+ matchers = matchers or {}
45
+
46
+ function matchers.was_called(target, value)
47
+ if getmetatable(target) ~= Mock then
48
+ return false, "target must be a Mock"
49
+ end
50
+
51
+ local calls = Mock.calls[target] or {}
52
+
53
+ if #calls ~= value then
54
+ return false, "expecting "..tostring(value).." calls, actually "..#calls
55
+ end
56
+ return true
57
+ end
58
+
59
+ function matchers.was_called_with(target, ...)
60
+ if getmetatable(target) ~= Mock then
61
+ return false, "target must be a Mock"
62
+ end
63
+
64
+ local calls = Mock.calls[target] or {}
65
+
66
+ if #calls ~= 1 then
67
+ return false, "expecting "..tostring(1).." call, actually "..#calls
68
+ end
69
+
70
+ local params = calls[1] or {}
71
+
72
+ local args = {...}
73
+
74
+ if #args ~= #params then
75
+ return false, "expecting "..#args.." parameters, actually "..#params
76
+ end
77
+
78
+ for i=1,#args do
79
+ if args[i] ~= params[i] then
80
+ return false, "expecting parameter #"..tostring(i).." to be "..tostring(args[i]).." actually "..tostring(params[i])
81
+ end
82
+ end
83
+ return true
84
+ end