ki 0.4.9 → 0.4.10

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: ee2465764557ce14876065e4f99917fa50f25953
4
- data.tar.gz: 30c2a6140f02460947eb0b59efce669c3fa02a8b
3
+ metadata.gz: e570dca285d0879a444188fe3f855404b7eea148
4
+ data.tar.gz: bd7f3d50f1e5c475b8e04e263c498a1878d76408
5
5
  SHA512:
6
- metadata.gz: 25e62d3b33ea0c9e584b583bd0f985ac014686af0a8198da91b82524b49c1a6dbba70797cb89062a07d3f1885d0f85992b0449f9ac9936f21f7487a552f882ca
7
- data.tar.gz: 94800b4aa250f56fb8bd028acb4101ac69926d83711410155395d03d2df050bb07e82e072ba8f1600e25fcb721226731b7c53a6b816bce8e3d16fadc2431962c
6
+ metadata.gz: 69ae313e5b0596c6d064ca51a4b805ae7b3dd5785450e6987982d454ac27a56cfd61b15201ef4aa1511a888892f4b500d2ab47eeed850525db5d83a959a59ce7
7
+ data.tar.gz: 5de90c09ce1b696cefa724cf8a3a1569fe39843617c0465d717ea8c1ef467da94d64911fd80dca983eb50195a0aad986726d2f7b7f738521eed8805b8bae04ff
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- ki (0.4.9)
4
+ ki (0.4.10)
5
5
  bson_ext
6
6
  bundler (~> 1.5)
7
7
  coffee-script
@@ -154,8 +154,10 @@ module Ki
154
154
  #
155
155
  def delete(name, hash)
156
156
  hash = nourish_hash_id hash
157
- @db[name].remove hash
158
- {}
157
+ r = @db[name].remove hash
158
+ {
159
+ deleted_item_count: r["n"] || 0
160
+ }
159
161
  end
160
162
 
161
163
  # Count the number of hashes found in a specified collection, filtered
@@ -1,3 +1,3 @@
1
1
  module Ki
2
- VERSION = '0.4.9'
2
+ VERSION = '0.4.10'
3
3
  end
@@ -2,7 +2,7 @@
2
2
  lock '3.1.0'
3
3
 
4
4
  set :application, 'json.northpole.ro'
5
- set :repo_url, 'git@bitbucket.org:mess110/ki.git'
5
+ set :repo_url, 'git@github.com:mess110/ki.git'
6
6
 
7
7
  # Default branch is :master
8
8
  # ask :branch, proc { `git rev-parse --abbrev-ref HEAD`.chomp }
@@ -1,91 +1,13 @@
1
- userCreated = () ->
2
- notify("user created", "label label-success")
3
- $("#user").attr('disabled','disabled')
4
- $("#pass").attr('disabled','disabled')
5
- $("#signup")
6
- .blur()
7
- .fadeOut()
8
- $("#extra-info").fadeIn()
9
-
10
- userNotCreated = (jqXHR) ->
11
- result = JSON.parse(jqXHR.responseText)
12
- notify(result['error'], "label label-important")
13
-
14
1
  reqSuccess = (data) ->
15
2
  str = JSON.stringify(data, `undefined`, 2)
16
3
  output = $('#parsedJson')
17
4
  if (output.length > 0)
18
5
  output[0].innerHTML = syntaxHighlight(str)
19
6
 
20
- storageNotCreated = (jqXHR) ->
21
- $('#parsedJson')[0].innerHTML = syntaxHighlight("{}")
22
-
23
- signupPage = () ->
24
- $("#user").focus()
25
- notify("press enter to submit", "label label-info")
26
-
27
- $("#pass").keypress (event) ->
28
- if event.which is 13
29
- event.preventDefault()
30
- user = $('#user').val()
31
- pass = $('#pass').val()
32
- jNorthPole.createUser(user, pass, userCreated, userNotCreated)
33
-
34
- addTryRow = (keyVal, valVal) ->
35
- clone = $('.templateTr').clone().removeClass('templateTr')
36
- clone.find('.templateKey').val(keyVal)
37
- clone.find('.templateValue').val(valVal)
38
- clearButton = clone.find('.clearButton')
39
- clearButton.show()
40
- clearButton.click () ->
41
- $(this).parent().parent().remove()
42
- $('#tryNowTable tr:last').after(clone)
43
- $('#tryNowTable tr:last input:first').focus()
44
-
45
- tryNowPage = () ->
46
- npSecret = $('#tryNowTable').data('npsecret')
47
- npGuestSecret = $('#tryNowTable').data('npguestsecret')
48
-
49
- addTryRow(npSecret, npGuestSecret)
50
- addTryRow('color', 'green')
51
-
52
- $("#addTableRow").click ->
53
- addTryRow('', '')
54
-
55
- $("#postButton").click ->
56
- data = getDataFromTable()
57
- jNorthPole.createStorage(data, reqSuccess)
58
-
59
- $("#getButton").click ->
60
- data = getDataFromTable()
61
- jNorthPole.getStorage(data, reqSuccess)
62
-
63
- $("#putButton").click ->
64
- data = getDataFromTable()
65
- jNorthPole.putStorage(data, reqSuccess)
66
-
67
- $("#deleteButton").click ->
68
- data = getDataFromTable()
69
- jNorthPole.deleteStorage(data, reqSuccess)
70
-
71
7
  if typeof String::endsWith isnt "function"
72
8
  String::endsWith = (suffix) ->
73
9
  @indexOf(suffix, @length - suffix.length) isnt -1
74
10
 
75
- window.syntaxHighlight = (json) ->
76
- json = json.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;")
77
- json.replace /("(\\u[a-zA-Z0-9]{4}|\\[^u]|[^\\"])*"(\s*:)?|\b(true|false|null)\b|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?)/g, (match) ->
78
- cls = "number"
79
- if /^"/.test(match)
80
- if /:$/.test(match)
81
- cls = "key"
82
- else
83
- cls = "string"
84
- else if /true|false/.test(match)
85
- cls = "boolean"
86
- else cls = "null" if /null/.test(match)
87
- "<span class=\"" + cls + "\">" + match + "</span>"
88
-
89
11
  setActiveMenuClass = () ->
90
12
  checkFor = (s) ->
91
13
  if document.URL.endsWith(s)
@@ -93,11 +15,26 @@ setActiveMenuClass = () ->
93
15
 
94
16
  checkFor 'playground'
95
17
  checkFor 'examples'
18
+ checkFor 'faq'
96
19
 
97
20
  randomlyFlipBear = () ->
98
21
  if Math.random() > 0.5
99
22
  $(".bear").toggleClass('flipit')
100
23
 
24
+ window.syntaxHighlight = (json) ->
25
+ json = json.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;")
26
+ json.replace /("(\\u[a-zA-Z0-9]{4}|\\[^u]|[^\\"])*"(\s*:)?|\b(true|false|null)\b|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?)/g, (match) ->
27
+ cls = "number value"
28
+ if /^"/.test(match)
29
+ if /:$/.test(match)
30
+ cls = "key"
31
+ else
32
+ cls = "string value"
33
+ else if /true|false/.test(match)
34
+ cls = "boolean value"
35
+ else cls = "null value" if /null/.test(match)
36
+ "<span class=\"" + cls + "\">" + match + "</span>"
37
+
101
38
  $(document).ready ->
102
39
  setActiveMenuClass()
103
40
  setInterval(randomlyFlipBear, 1000)
@@ -111,23 +48,20 @@ $(document).ready ->
111
48
  $('#myTab a').click (e) ->
112
49
  e.preventDefault()
113
50
  $(this).tab('show')
51
+ window.location.hash = $(this)[0].hash
52
+
53
+ if window.location.hash?
54
+ $("#myTab a[href='#{window.location.hash}']").tab('show')
114
55
 
115
56
  $('#npAction').click () ->
116
57
  verb = $('#verb').text();
117
- if verb == 'GET'
118
- verb = 'SEARCH'
58
+ verb = 'SEARCH' if verb == 'GET'
59
+
119
60
  resource = $('#resource').text()
120
61
  try
121
62
  jsonObj = JSON.parse(($('#playground').val()))
122
63
  catch err
123
- reqSuccess(JSON.parse('{}'))
124
- return 0
64
+ reqSuccess(JSON.parse('{"error": "invalid json input"}'))
65
+ return
125
66
 
126
- $.ajax
127
- type: verb
128
- url: "/" + resource + ".json"
129
- data: JSON.stringify(jsonObj)
130
- success: (data, textStatus, jqXHR) ->
131
- reqSuccess(data)
132
- error: (jqXHR, textstatus, errorthrown) ->
133
- reqSuccess(JSON.parse(jqXHR.responseText))
67
+ jNorthPole.genericRequest(jsonObj, verb, resource, reqSuccess)
@@ -1,34 +1,51 @@
1
1
  window.jNorthPole =
2
- root: Math.sqrt,
3
- square: (x) -> x * x,
4
- cube: (x) -> x * this.square x,
5
- createUser: (api_key, secret, success, failer) ->
2
+
3
+ BASE_URL: '/'
4
+
5
+ help: """
6
+ NorthPole JS wrapper example usage:
7
+
8
+ responseHandler = function (data) {
9
+ console.log(data);
10
+ };
11
+
12
+ jNorthPole.BASE_URL = '/';
13
+ jNorthPole.getStorage(json, responseHandler);
14
+ """
15
+
16
+ genericRequest: (jsonObj, method, endPoint, responseHandler, errorHandler=responseHandler) ->
17
+ throw 'responseHandler function missing' unless responseHandler?
18
+
19
+ r = new XMLHttpRequest
20
+ r.open method, "#{@BASE_URL}#{endPoint}.json", true
21
+
22
+ r.onreadystatechange = ->
23
+ return if r.readyState != 4
24
+ if status == 200
25
+ responseHandler(JSON.parse(r.responseText), r.status)
26
+ else
27
+ errorHandler(JSON.parse(r.responseText), r.status)
28
+ return
29
+ r.send JSON.stringify(jsonObj)
30
+ return
31
+
32
+ createUser: (api_key, secret, success, failure) ->
6
33
  jsonObj = {'api_key': api_key, 'secret': secret}
7
- $.ajax
8
- type: "POST"
9
- url: "/user.json"
10
- data: JSON.stringify(jsonObj)
11
- success: (data, textStatus, jqXHR) ->
12
- success()
13
- error: (jqXHR, textstatus, errorthrown) ->
14
- failer(jqXHR)
15
- genericRequest: (jsonObj, method, responseHandler) ->
16
- $.ajax
17
- type: method
18
- url: "/storage.json"
19
- data: JSON.stringify(jsonObj)
20
- success: (data, textStatus, jqXHR) ->
21
- responseHandler(data)
22
- error: (jqXHR, textstatus, errorthrown) ->
23
- console.log(jqXHR.responseText)
24
- responseHandler(JSON.parse(jqXHR.responseText))
25
- createStorage: (jsonObj, responseHandler) ->
26
- this.genericRequest(jsonObj, 'POST', responseHandler)
27
- putStorage: (jsonObj, responseHandler) ->
28
- this.genericRequest(jsonObj, 'PUT', responseHandler)
29
- getStorage: (jsonObj, responseHandler) ->
30
- this.genericRequest(jsonObj, 'SEARCH', responseHandler)
31
- deleteStorage: (jsonObj, responseHandler) ->
32
- this.genericRequest(jsonObj, 'DELETE', responseHandler)
33
- getUrl: (id) ->
34
- "http://localhost:9292/storage.json?id=" + id
34
+ @genericRequest(jsonObj, 'POST', 'user', success, failure)
35
+ return
36
+
37
+ createStorage: (jsonObj, responseHandler, errorHandler) ->
38
+ @genericRequest(jsonObj, 'POST', 'storage', responseHandler, errorHandler)
39
+ return
40
+
41
+ putStorage: (jsonObj, responseHandler, errorHandler) ->
42
+ @genericRequest(jsonObj, 'PUT', 'storage', responseHandler, errorHandler)
43
+ return
44
+
45
+ getStorage: (jsonObj, responseHandler, errorHandler) ->
46
+ @genericRequest(jsonObj, 'SEARCH', 'storage', responseHandler, errorHandler)
47
+ return
48
+
49
+ deleteStorage: (jsonObj, responseHandler, errorHandler) ->
50
+ @genericRequest(jsonObj, 'DELETE', 'storage', responseHandler, errorHandler)
51
+ return
@@ -0,0 +1,251 @@
1
+ if (!angular && require){
2
+ var angular = require('angular');
3
+ }
4
+
5
+ /* global YT */
6
+ angular.module('youtube-embed', ['ng'])
7
+ .service ('youtubeEmbedUtils', ['$window', '$rootScope', function ($window, $rootScope) {
8
+ var Service = {}
9
+
10
+ // adapted from http://stackoverflow.com/a/5831191/1614967
11
+ var youtubeRegexp = /https?:\/\/(?:[0-9A-Z-]+\.)?(?:youtu\.be\/|youtube(?:-nocookie)?\.com\S*[^\w\s-])([\w-]{11})(?=[^\w-]|$)(?![?=&+%\w.-]*(?:['"][^<>]*>|<\/a>))[?=&+%\w.-]*/ig;
12
+ var timeRegexp = /t=(\d+)[ms]?(\d+)?s?/;
13
+
14
+ function contains(str, substr) {
15
+ return (str.indexOf(substr) > -1);
16
+ }
17
+
18
+ Service.getIdFromURL = function getIdFromURL(url) {
19
+ var id = url.replace(youtubeRegexp, '$1');
20
+
21
+ if (contains(id, ';')) {
22
+ var pieces = id.split(';');
23
+
24
+ if (contains(pieces[1], '%')) {
25
+ // links like this:
26
+ // "http://www.youtube.com/attribution_link?a=pxa6goHqzaA&amp;u=%2Fwatch%3Fv%3DdPdgx30w9sU%26feature%3Dshare"
27
+ // have the real query string URI encoded behind a ';'.
28
+ // at this point, `id is 'pxa6goHqzaA;u=%2Fwatch%3Fv%3DdPdgx30w9sU%26feature%3Dshare'
29
+ var uriComponent = decodeURIComponent(id.split(';')[1]);
30
+ id = ('http://youtube.com' + uriComponent)
31
+ .replace(youtubeRegexp, '$1');
32
+ } else {
33
+ // https://www.youtube.com/watch?v=VbNF9X1waSc&amp;feature=youtu.be
34
+ // `id` looks like 'VbNF9X1waSc;feature=youtu.be' currently.
35
+ // strip the ';feature=youtu.be'
36
+ id = pieces[0];
37
+ }
38
+ } else if (contains(id, '#')) {
39
+ // id might look like '93LvTKF_jW0#t=1'
40
+ // and we want '93LvTKF_jW0'
41
+ id = id.split('#')[0];
42
+ }
43
+
44
+ return id;
45
+ };
46
+
47
+ Service.getTimeFromURL = function getTimeFromURL(url) {
48
+ url = url || '';
49
+
50
+ // t=4m20s
51
+ // returns ['t=4m20s', '4', '20']
52
+ // t=46s
53
+ // returns ['t=46s', '46']
54
+ // t=46
55
+ // returns ['t=46', '46']
56
+ var times = url.match(timeRegexp);
57
+
58
+ if (!times) {
59
+ // zero seconds
60
+ return 0;
61
+ }
62
+
63
+ // assume the first
64
+ var full = times[0],
65
+ minutes = times[1],
66
+ seconds = times[2];
67
+
68
+ // t=4m20s
69
+ if (typeof seconds !== 'undefined') {
70
+ seconds = parseInt(seconds, 10);
71
+ minutes = parseInt(minutes, 10);
72
+
73
+ // t=4m
74
+ } else if (contains(full, 'm')) {
75
+ minutes = parseInt(minutes, 10);
76
+ seconds = 0;
77
+
78
+ // t=4s
79
+ // t=4
80
+ } else {
81
+ seconds = parseInt(minutes, 10);
82
+ minutes = 0;
83
+ }
84
+
85
+ // in seconds
86
+ return seconds + (minutes * 60);
87
+ };
88
+
89
+ Service.ready = false;
90
+
91
+ function applyServiceIsReady() {
92
+ $rootScope.$apply(function () {
93
+ Service.ready = true;
94
+ });
95
+ };
96
+
97
+ // If the library isn't here at all,
98
+ if (typeof YT === "undefined") {
99
+ // ...grab on to global callback, in case it's eventually loaded
100
+ $window.onYouTubeIframeAPIReady = applyServiceIsReady;
101
+ } else if (YT.loaded) {
102
+ Service.ready = true;
103
+ } else {
104
+ YT.ready(applyServiceIsReady);
105
+ }
106
+
107
+ return Service;
108
+ }])
109
+ .directive('youtubeVideo', ['youtubeEmbedUtils', function (youtubeEmbedUtils) {
110
+ var uniqId = 1;
111
+
112
+ // from YT.PlayerState
113
+ var stateNames = {
114
+ '-1': 'unstarted',
115
+ 0: 'ended',
116
+ 1: 'playing',
117
+ 2: 'paused',
118
+ 3: 'buffering',
119
+ 5: 'queued'
120
+ };
121
+
122
+ var eventPrefix = 'youtube.player.';
123
+
124
+ return {
125
+ restrict: 'EA',
126
+ scope: {
127
+ videoId: '=?',
128
+ videoUrl: '=?',
129
+ player: '=?',
130
+ playerVars: '=?',
131
+ playerHeight: '=?',
132
+ playerWidth: '=?'
133
+ },
134
+ link: function (scope, element, attrs) {
135
+ // allows us to $watch `ready`
136
+ scope.utils = youtubeEmbedUtils;
137
+
138
+ // player-id attr > id attr > directive-generated ID
139
+ var playerId = attrs.playerId || element[0].id || 'unique-youtube-embed-id-' + uniqId++;
140
+ element[0].id = playerId;
141
+
142
+ // Attach to element
143
+ scope.playerHeight = scope.playerHeight || 390;
144
+ scope.playerWidth = scope.playerWidth || 640;
145
+ scope.playerVars = scope.playerVars || {};
146
+
147
+ // YT calls callbacks outside of digest cycle
148
+ function applyBroadcast () {
149
+ var args = Array.prototype.slice.call(arguments);
150
+ scope.$apply(function () {
151
+ scope.$emit.apply(scope, args);
152
+ });
153
+ }
154
+
155
+ function onPlayerStateChange (event) {
156
+ var state = stateNames[event.data];
157
+ if (typeof state !== 'undefined') {
158
+ applyBroadcast(eventPrefix + state, scope.player, event);
159
+ }
160
+ scope.$apply(function () {
161
+ scope.player.currentState = state;
162
+ });
163
+ }
164
+
165
+ function onPlayerReady (event) {
166
+ applyBroadcast(eventPrefix + 'ready', scope.player, event);
167
+ }
168
+
169
+ function onPlayerError (event) {
170
+ applyBroadcast(eventPrefix + 'error', scope.player, event);
171
+ }
172
+
173
+ function createPlayer () {
174
+ var playerVars = angular.copy(scope.playerVars);
175
+ playerVars.start = playerVars.start || scope.urlStartTime;
176
+ var player = new YT.Player(playerId, {
177
+ height: scope.playerHeight,
178
+ width: scope.playerWidth,
179
+ videoId: scope.videoId,
180
+ playerVars: playerVars,
181
+ events: {
182
+ onReady: onPlayerReady,
183
+ onStateChange: onPlayerStateChange,
184
+ onError: onPlayerError
185
+ }
186
+ });
187
+
188
+ player.id = playerId;
189
+ return player;
190
+ }
191
+
192
+ function loadPlayer () {
193
+ if (scope.videoId || scope.playerVars.list) {
194
+ if (scope.player && typeof scope.player.destroy === 'function') {
195
+ scope.player.destroy();
196
+ }
197
+
198
+ scope.player = createPlayer();
199
+ }
200
+ };
201
+
202
+ var stopWatchingReady = scope.$watch(
203
+ function () {
204
+ return scope.utils.ready
205
+ // Wait until one of them is defined...
206
+ && (typeof scope.videoUrl !== 'undefined'
207
+ || typeof scope.videoId !== 'undefined'
208
+ || typeof scope.playerVars.list !== 'undefined');
209
+ },
210
+ function (ready) {
211
+ if (ready) {
212
+ stopWatchingReady();
213
+
214
+ // URL takes first priority
215
+ if (typeof scope.videoUrl !== 'undefined') {
216
+ scope.$watch('videoUrl', function (url) {
217
+ scope.videoId = scope.utils.getIdFromURL(url);
218
+ scope.urlStartTime = scope.utils.getTimeFromURL(url);
219
+
220
+ loadPlayer();
221
+ });
222
+
223
+ // then, a video ID
224
+ } else if (typeof scope.videoId !== 'undefined') {
225
+ scope.$watch('videoId', function () {
226
+ scope.urlStartTime = null;
227
+ loadPlayer();
228
+ });
229
+
230
+ // finally, a list
231
+ } else {
232
+ scope.$watch('playerVars.list', function () {
233
+ scope.urlStartTime = null;
234
+ loadPlayer();
235
+ });
236
+ }
237
+ }
238
+ });
239
+
240
+ scope.$watchCollection(['playerHeight', 'playerWidth'], function() {
241
+ if (scope.player) {
242
+ scope.player.setSize(scope.playerWidth, scope.playerHeight);
243
+ }
244
+ });
245
+
246
+ scope.$on('$destroy', function () {
247
+ scope.player && scope.player.destroy();
248
+ });
249
+ }
250
+ };
251
+ }]);