pinkman 0.9.9.9.1 → 0.9.9.9.2

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
  SHA256:
3
- metadata.gz: a881ee79d0d66ed3ebc8f82b1b5d596ef5d373a5215a446bcf6e72166f81a8c0
4
- data.tar.gz: b47389d23b0a46031a0404f12d0dfd94a43cd630d3d2c99af179e25d89d6a66e
3
+ metadata.gz: 26b2352f1efe763891e31f6d339772e481d632c966c0f29e23054cdf61fd680d
4
+ data.tar.gz: cefb2ab1d34c1f4350c914af19b9664a43abea464aab82b136534d55e77f6d04
5
5
  SHA512:
6
- metadata.gz: 432dd76d2feaf437c60e2c636948442c429a2294d9794d2ce5bfcb89f6b5e614611104319a5ea0e40a87c1c2a64baaf2c98de182dc610834fff96a0fd5ab02ee
7
- data.tar.gz: c6210ddc7fa530694879c6d9e50ef3eabad31f118393b8e1415d1029fdee8a592d40c6cf35c23ab93acb53e11d953854fc56c9cc901771040c9f3bdab819ceae
6
+ metadata.gz: f6fce98f764b57135076ec3e5f29e24c7838cfd7d11cff5465f81b642611b6c2eb5520e6e14474434b212e233cda8535371331d8b5f009f08b5bf7b91ea2696f
7
+ data.tar.gz: 995648925ea96c74911ac0dc6818973a1547cd6d670aea3ca0e15bc8227252be12bd3ac6665424a13d544eb0db172f0e07820bd2224e74fd3c34b24db582eb0c
@@ -0,0 +1,280 @@
1
+ /*
2
+ * JavaScript MD5
3
+ * https://github.com/blueimp/JavaScript-MD5
4
+ *
5
+ * Copyright 2011, Sebastian Tschan
6
+ * https://blueimp.net
7
+ *
8
+ * Licensed under the MIT license:
9
+ * https://opensource.org/licenses/MIT
10
+ *
11
+ * Based on
12
+ * A JavaScript implementation of the RSA Data Security, Inc. MD5 Message
13
+ * Digest Algorithm, as defined in RFC 1321.
14
+ * Version 2.2 Copyright (C) Paul Johnston 1999 - 2009
15
+ * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
16
+ * Distributed under the BSD License
17
+ * See http://pajhome.org.uk/crypt/md5 for more info.
18
+ */
19
+
20
+ /* global define */
21
+
22
+ ;(function ($) {
23
+ 'use strict'
24
+
25
+ /*
26
+ * Add integers, wrapping at 2^32. This uses 16-bit operations internally
27
+ * to work around bugs in some JS interpreters.
28
+ */
29
+ function safeAdd (x, y) {
30
+ var lsw = (x & 0xffff) + (y & 0xffff)
31
+ var msw = (x >> 16) + (y >> 16) + (lsw >> 16)
32
+ return (msw << 16) | (lsw & 0xffff)
33
+ }
34
+
35
+ /*
36
+ * Bitwise rotate a 32-bit number to the left.
37
+ */
38
+ function bitRotateLeft (num, cnt) {
39
+ return (num << cnt) | (num >>> (32 - cnt))
40
+ }
41
+
42
+ /*
43
+ * These functions implement the four basic operations the algorithm uses.
44
+ */
45
+ function md5cmn (q, a, b, x, s, t) {
46
+ return safeAdd(bitRotateLeft(safeAdd(safeAdd(a, q), safeAdd(x, t)), s), b)
47
+ }
48
+ function md5ff (a, b, c, d, x, s, t) {
49
+ return md5cmn((b & c) | (~b & d), a, b, x, s, t)
50
+ }
51
+ function md5gg (a, b, c, d, x, s, t) {
52
+ return md5cmn((b & d) | (c & ~d), a, b, x, s, t)
53
+ }
54
+ function md5hh (a, b, c, d, x, s, t) {
55
+ return md5cmn(b ^ c ^ d, a, b, x, s, t)
56
+ }
57
+ function md5ii (a, b, c, d, x, s, t) {
58
+ return md5cmn(c ^ (b | ~d), a, b, x, s, t)
59
+ }
60
+
61
+ /*
62
+ * Calculate the MD5 of an array of little-endian words, and a bit length.
63
+ */
64
+ function binlMD5 (x, len) {
65
+ /* append padding */
66
+ x[len >> 5] |= 0x80 << (len % 32)
67
+ x[((len + 64) >>> 9 << 4) + 14] = len
68
+
69
+ var i
70
+ var olda
71
+ var oldb
72
+ var oldc
73
+ var oldd
74
+ var a = 1732584193
75
+ var b = -271733879
76
+ var c = -1732584194
77
+ var d = 271733878
78
+
79
+ for (i = 0; i < x.length; i += 16) {
80
+ olda = a
81
+ oldb = b
82
+ oldc = c
83
+ oldd = d
84
+
85
+ a = md5ff(a, b, c, d, x[i], 7, -680876936)
86
+ d = md5ff(d, a, b, c, x[i + 1], 12, -389564586)
87
+ c = md5ff(c, d, a, b, x[i + 2], 17, 606105819)
88
+ b = md5ff(b, c, d, a, x[i + 3], 22, -1044525330)
89
+ a = md5ff(a, b, c, d, x[i + 4], 7, -176418897)
90
+ d = md5ff(d, a, b, c, x[i + 5], 12, 1200080426)
91
+ c = md5ff(c, d, a, b, x[i + 6], 17, -1473231341)
92
+ b = md5ff(b, c, d, a, x[i + 7], 22, -45705983)
93
+ a = md5ff(a, b, c, d, x[i + 8], 7, 1770035416)
94
+ d = md5ff(d, a, b, c, x[i + 9], 12, -1958414417)
95
+ c = md5ff(c, d, a, b, x[i + 10], 17, -42063)
96
+ b = md5ff(b, c, d, a, x[i + 11], 22, -1990404162)
97
+ a = md5ff(a, b, c, d, x[i + 12], 7, 1804603682)
98
+ d = md5ff(d, a, b, c, x[i + 13], 12, -40341101)
99
+ c = md5ff(c, d, a, b, x[i + 14], 17, -1502002290)
100
+ b = md5ff(b, c, d, a, x[i + 15], 22, 1236535329)
101
+
102
+ a = md5gg(a, b, c, d, x[i + 1], 5, -165796510)
103
+ d = md5gg(d, a, b, c, x[i + 6], 9, -1069501632)
104
+ c = md5gg(c, d, a, b, x[i + 11], 14, 643717713)
105
+ b = md5gg(b, c, d, a, x[i], 20, -373897302)
106
+ a = md5gg(a, b, c, d, x[i + 5], 5, -701558691)
107
+ d = md5gg(d, a, b, c, x[i + 10], 9, 38016083)
108
+ c = md5gg(c, d, a, b, x[i + 15], 14, -660478335)
109
+ b = md5gg(b, c, d, a, x[i + 4], 20, -405537848)
110
+ a = md5gg(a, b, c, d, x[i + 9], 5, 568446438)
111
+ d = md5gg(d, a, b, c, x[i + 14], 9, -1019803690)
112
+ c = md5gg(c, d, a, b, x[i + 3], 14, -187363961)
113
+ b = md5gg(b, c, d, a, x[i + 8], 20, 1163531501)
114
+ a = md5gg(a, b, c, d, x[i + 13], 5, -1444681467)
115
+ d = md5gg(d, a, b, c, x[i + 2], 9, -51403784)
116
+ c = md5gg(c, d, a, b, x[i + 7], 14, 1735328473)
117
+ b = md5gg(b, c, d, a, x[i + 12], 20, -1926607734)
118
+
119
+ a = md5hh(a, b, c, d, x[i + 5], 4, -378558)
120
+ d = md5hh(d, a, b, c, x[i + 8], 11, -2022574463)
121
+ c = md5hh(c, d, a, b, x[i + 11], 16, 1839030562)
122
+ b = md5hh(b, c, d, a, x[i + 14], 23, -35309556)
123
+ a = md5hh(a, b, c, d, x[i + 1], 4, -1530992060)
124
+ d = md5hh(d, a, b, c, x[i + 4], 11, 1272893353)
125
+ c = md5hh(c, d, a, b, x[i + 7], 16, -155497632)
126
+ b = md5hh(b, c, d, a, x[i + 10], 23, -1094730640)
127
+ a = md5hh(a, b, c, d, x[i + 13], 4, 681279174)
128
+ d = md5hh(d, a, b, c, x[i], 11, -358537222)
129
+ c = md5hh(c, d, a, b, x[i + 3], 16, -722521979)
130
+ b = md5hh(b, c, d, a, x[i + 6], 23, 76029189)
131
+ a = md5hh(a, b, c, d, x[i + 9], 4, -640364487)
132
+ d = md5hh(d, a, b, c, x[i + 12], 11, -421815835)
133
+ c = md5hh(c, d, a, b, x[i + 15], 16, 530742520)
134
+ b = md5hh(b, c, d, a, x[i + 2], 23, -995338651)
135
+
136
+ a = md5ii(a, b, c, d, x[i], 6, -198630844)
137
+ d = md5ii(d, a, b, c, x[i + 7], 10, 1126891415)
138
+ c = md5ii(c, d, a, b, x[i + 14], 15, -1416354905)
139
+ b = md5ii(b, c, d, a, x[i + 5], 21, -57434055)
140
+ a = md5ii(a, b, c, d, x[i + 12], 6, 1700485571)
141
+ d = md5ii(d, a, b, c, x[i + 3], 10, -1894986606)
142
+ c = md5ii(c, d, a, b, x[i + 10], 15, -1051523)
143
+ b = md5ii(b, c, d, a, x[i + 1], 21, -2054922799)
144
+ a = md5ii(a, b, c, d, x[i + 8], 6, 1873313359)
145
+ d = md5ii(d, a, b, c, x[i + 15], 10, -30611744)
146
+ c = md5ii(c, d, a, b, x[i + 6], 15, -1560198380)
147
+ b = md5ii(b, c, d, a, x[i + 13], 21, 1309151649)
148
+ a = md5ii(a, b, c, d, x[i + 4], 6, -145523070)
149
+ d = md5ii(d, a, b, c, x[i + 11], 10, -1120210379)
150
+ c = md5ii(c, d, a, b, x[i + 2], 15, 718787259)
151
+ b = md5ii(b, c, d, a, x[i + 9], 21, -343485551)
152
+
153
+ a = safeAdd(a, olda)
154
+ b = safeAdd(b, oldb)
155
+ c = safeAdd(c, oldc)
156
+ d = safeAdd(d, oldd)
157
+ }
158
+ return [a, b, c, d]
159
+ }
160
+
161
+ /*
162
+ * Convert an array of little-endian words to a string
163
+ */
164
+ function binl2rstr (input) {
165
+ var i
166
+ var output = ''
167
+ var length32 = input.length * 32
168
+ for (i = 0; i < length32; i += 8) {
169
+ output += String.fromCharCode((input[i >> 5] >>> (i % 32)) & 0xff)
170
+ }
171
+ return output
172
+ }
173
+
174
+ /*
175
+ * Convert a raw string to an array of little-endian words
176
+ * Characters >255 have their high-byte silently ignored.
177
+ */
178
+ function rstr2binl (input) {
179
+ var i
180
+ var output = []
181
+ output[(input.length >> 2) - 1] = undefined
182
+ for (i = 0; i < output.length; i += 1) {
183
+ output[i] = 0
184
+ }
185
+ var length8 = input.length * 8
186
+ for (i = 0; i < length8; i += 8) {
187
+ output[i >> 5] |= (input.charCodeAt(i / 8) & 0xff) << (i % 32)
188
+ }
189
+ return output
190
+ }
191
+
192
+ /*
193
+ * Calculate the MD5 of a raw string
194
+ */
195
+ function rstrMD5 (s) {
196
+ return binl2rstr(binlMD5(rstr2binl(s), s.length * 8))
197
+ }
198
+
199
+ /*
200
+ * Calculate the HMAC-MD5, of a key and some data (raw strings)
201
+ */
202
+ function rstrHMACMD5 (key, data) {
203
+ var i
204
+ var bkey = rstr2binl(key)
205
+ var ipad = []
206
+ var opad = []
207
+ var hash
208
+ ipad[15] = opad[15] = undefined
209
+ if (bkey.length > 16) {
210
+ bkey = binlMD5(bkey, key.length * 8)
211
+ }
212
+ for (i = 0; i < 16; i += 1) {
213
+ ipad[i] = bkey[i] ^ 0x36363636
214
+ opad[i] = bkey[i] ^ 0x5c5c5c5c
215
+ }
216
+ hash = binlMD5(ipad.concat(rstr2binl(data)), 512 + data.length * 8)
217
+ return binl2rstr(binlMD5(opad.concat(hash), 512 + 128))
218
+ }
219
+
220
+ /*
221
+ * Convert a raw string to a hex string
222
+ */
223
+ function rstr2hex (input) {
224
+ var hexTab = '0123456789abcdef'
225
+ var output = ''
226
+ var x
227
+ var i
228
+ for (i = 0; i < input.length; i += 1) {
229
+ x = input.charCodeAt(i)
230
+ output += hexTab.charAt((x >>> 4) & 0x0f) + hexTab.charAt(x & 0x0f)
231
+ }
232
+ return output
233
+ }
234
+
235
+ /*
236
+ * Encode a string as utf-8
237
+ */
238
+ function str2rstrUTF8 (input) {
239
+ return unescape(encodeURIComponent(input))
240
+ }
241
+
242
+ /*
243
+ * Take string arguments and return either raw or hex encoded strings
244
+ */
245
+ function rawMD5 (s) {
246
+ return rstrMD5(str2rstrUTF8(s))
247
+ }
248
+ function hexMD5 (s) {
249
+ return rstr2hex(rawMD5(s))
250
+ }
251
+ function rawHMACMD5 (k, d) {
252
+ return rstrHMACMD5(str2rstrUTF8(k), str2rstrUTF8(d))
253
+ }
254
+ function hexHMACMD5 (k, d) {
255
+ return rstr2hex(rawHMACMD5(k, d))
256
+ }
257
+
258
+ function md5 (string, key, raw) {
259
+ if (!key) {
260
+ if (!raw) {
261
+ return hexMD5(string)
262
+ }
263
+ return rawMD5(string)
264
+ }
265
+ if (!raw) {
266
+ return hexHMACMD5(key, string)
267
+ }
268
+ return rawHMACMD5(key, string)
269
+ }
270
+
271
+ if (typeof define === 'function' && define.amd) {
272
+ define(function () {
273
+ return md5
274
+ })
275
+ } else if (typeof module === 'object' && module.exports) {
276
+ module.exports = md5
277
+ } else {
278
+ $.md5 = md5
279
+ }
280
+ })(this)
@@ -1,3 +1,5 @@
1
+ //= require pinkman/plugins/md5
2
+ //= require pinkman_base/cache
1
3
  //= require pinkman_base/tools
2
4
  //= require pinkman_base/pinkman
3
5
  //= require pinkman_base/mixins
@@ -0,0 +1,17 @@
1
+ class window.PinkmanCache
2
+
3
+ @_caching = new Object
4
+
5
+ @md5: (args...) ->
6
+ md5(args...)
7
+
8
+ @cache: (name,value) ->
9
+ @_caching[name] = value
10
+
11
+ @has: (name) ->
12
+ @_caching[name]?
13
+
14
+ @get: (name) ->
15
+ @_caching[name]
16
+
17
+ window.$c = PinkmanCache
@@ -90,13 +90,19 @@ class window.PinkmanCollection extends window.PinkmanCommon
90
90
  # new version: accepts a object to match against the object attributes
91
91
  select: (criteria,callback='') ->
92
92
  selection = new @constructor
93
+ # id version
94
+ if $p.isNumber(criteria)
95
+ return(@select(id: Number(criteria), callback))
96
+
93
97
  # function version
94
- if typeof criteria == 'function'
98
+ else if $p.isFunction(criteria)
99
+ # console.log 'select: function'
95
100
  @each (object) ->
96
101
  selection.push(object) if criteria(object)
97
102
 
98
103
  # object version
99
- else if typeof criteria == 'object'
104
+ else if $p.isObject(criteria)
105
+ # console.log 'select: object'
100
106
  @each (object) ->
101
107
  value = true
102
108
  (value = false if object[k] != v) for k,v of criteria
@@ -467,8 +473,89 @@ class window.PinkmanCollection extends window.PinkmanCommon
467
473
  return filter
468
474
  else
469
475
  return false
476
+
477
+
478
+ # --- Cache Related --- #
479
+
480
+ @startCaching: () ->
481
+ # cache structure
482
+ @_name_md5 = md5(if @name then @name else @toString()) unless @_name_md5?
483
+ $c.cache(@_name_md5, new this) unless $c.has(@_name_md5)
470
484
 
471
485
  # --- Ajax related --- #
486
+
487
+ # @get: Smart caching system
488
+ # -------------
489
+ # Docs/Notes:
490
+ # It tries to find a cached version of the requested object/collection.
491
+ # If it is found, nice. Otherwise, it passes the responsability to the server.
492
+ # --
493
+ # Depending on the query argument type
494
+ # Pinkman will try to guess what you are trying to get. See below.
495
+ # Query types:
496
+ # number: find object by id
497
+ # string: search
498
+ # obj: select (cache) / where (server)
499
+ # function: select
500
+
501
+ @get: (query, callback) ->
502
+ @startCaching()
503
+
504
+ # query md5
505
+ query_md5 = md5(JSON.stringify(query) + @_name_md5)
506
+
507
+ if $c.has(query_md5)
508
+ @handleGetCollection($c.get(query_md5),callback)
509
+ else
510
+ # TRYING TO FIND IN CACHE
511
+ $c.get(@_name_md5).select query, (cache) =>
512
+ # CACHED FOUND
513
+ if cache.any()
514
+ # console.log 'cached'
515
+ @handleGetCollection(cache,callback)
516
+
517
+ # CACHED VERSION NOT FOUND -> ASK SERVER
518
+ else
519
+ # console.log 'server'
520
+ col = new this
521
+ obj = new col.config.memberClass
522
+ params = new Object
523
+ params.scope = Pinkman.scope(obj)
524
+ params.query = query
525
+ Pinkman.ajax.get
526
+ url: obj.api('get')
527
+ data: params
528
+ complete: (response) =>
529
+ col.fetchFromArray(response)
530
+ # PERFOMING INSTANCES CACHE
531
+ col.each (obj) =>
532
+ $c.get(@_name_md5).push(obj)
533
+
534
+ # CACHING THIS QUERY
535
+ $c.cache(query_md5,col)
536
+
537
+ callback(col) if $p.isFunction(callback)
538
+ return(col)
539
+
540
+ @handleGetCollection: (fetchedCollection,callback) ->
541
+ col = new this
542
+ col.collection = fetchedCollection.collection
543
+ callback(col) if $p.isFunction(callback)
544
+ return(col)
545
+
546
+ @one: (query,callback) ->
547
+ @get(query, (col) ->
548
+ callback(col.first()) if col.any() and $p.isFunction(callback)
549
+ ).first()
550
+
551
+ @single: (args...) ->
552
+ @one(args...)
553
+
554
+ @um: (args...) ->
555
+ @one(args...)
556
+
557
+ @first: (args...) ->
558
+ @one(args...)
472
559
 
473
560
  # Desc: Fetch records from API_URL
474
561
  # request: get /api/API_URL/
@@ -495,34 +582,46 @@ class window.PinkmanCollection extends window.PinkmanCommon
495
582
  # request: get /api/API_URL/
496
583
  fetchFromUrl: (options) ->
497
584
  if options? and typeof options == 'object' and options.url?
498
- if Pinkman.hasScope(this)
499
- options.params = new Object unless options.params?
500
- options.params.scope = Pinkman.scope(this)
501
-
502
- @doneFetching = null
503
- @fetchingFrom = options.url
585
+ options_md5 = md5(JSON.stringify(options) + @className())
586
+ if $c.has(options_md5)
587
+ response = $c.get(options_md5)
588
+ @handleFetchResponse(response,options)
589
+ else
590
+ if Pinkman.hasScope(this)
591
+ options.params = new Object unless options.params?
592
+ options.params.scope = Pinkman.scope(this)
593
+ @doneFetching = null
594
+ @fetchingFrom = options.url
595
+ Pinkman.ajax.get
596
+ url: Pinkman.json2url(options.url,options.params)
597
+ complete: (response) =>
598
+ $c.cache(options_md5,response)
599
+ @handleFetchResponse(response,options)
600
+ return(this)
601
+
602
+ handleFetchResponse: (response,options) ->
603
+ @constructor.startCaching()
604
+ if response?
605
+ [@errors, @error] = [response.errors, response.error] if response.errors? or response.error?
504
606
 
505
- Pinkman.ajax.get
506
- url: Pinkman.json2url(options.url,options.params)
507
- complete: (response) =>
508
- if response?
509
- [@errors, @error] = [response.errors, response.error] if response.errors? or response.error?
510
-
511
- if options.params? and options.params.limit?
512
- @doneFetching = response.length < options.params.limit
513
- else
514
- @doneFetching = response.length == 0
515
-
516
- # separate recent when this collection is already populated
517
- @_recent = new this.constructor
518
-
519
- if response.length > 0
520
- @_recent.fetchFromArray(response)
521
- @fetchFromArray(response)
522
-
523
- @doneFetching = true unless response?
524
- options.callback(this) if options.callback? and typeof options.callback == 'function'
525
- return(this)
607
+ if options.params? and options.params.limit?
608
+ @doneFetching = response.length < options.params.limit
609
+ else
610
+ @doneFetching = response.length == 0
611
+
612
+ # separate recent when this collection is already populated
613
+ @_recent = new this.constructor
614
+
615
+ if response.length > 0
616
+ # CACHING INSTANCES
617
+ $c.get(@constructor._name_md5).fetchFromArray(response)
618
+
619
+ @_recent.fetchFromArray(response)
620
+ @fetchFromArray(response)
621
+
622
+ @doneFetching = true unless response?
623
+ options.callback(this) if options.callback? and typeof options.callback == 'function'
624
+
526
625
 
527
626
  # Desc: Fetch next records from last fetched URL or main API_URl
528
627
  # request: get /api/API_URL/?offset="COLLECTION_SIZE"&limit=n
@@ -1,3 +1,3 @@
1
1
  module Pinkman
2
- VERSION = "0.9.9.9.1"
2
+ VERSION = "0.9.9.9.2"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pinkman
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.9.9.9.1
4
+ version: 0.9.9.9.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Agilso Oliveira
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2018-03-25 00:00:00.000000000 Z
11
+ date: 2018-03-26 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -182,7 +182,9 @@ files:
182
182
  - app/assets/javascripts/pinkman/engines/handlebars.js
183
183
  - app/assets/javascripts/pinkman/engines/hogan.js
184
184
  - app/assets/javascripts/pinkman/engines/markup.js
185
+ - app/assets/javascripts/pinkman/plugins/md5.js
185
186
  - app/assets/javascripts/pinkman_base/cable.coffee
187
+ - app/assets/javascripts/pinkman_base/cache.coffee
186
188
  - app/assets/javascripts/pinkman_base/collection.coffee
187
189
  - app/assets/javascripts/pinkman_base/common.coffee
188
190
  - app/assets/javascripts/pinkman_base/controller.coffee