candle 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
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