slender_data 0.5.0 → 0.6.0
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.
- checksums.yaml +4 -4
- data/app/assets/javascripts/slender_data.coffee +14 -0
- data/app/assets/javascripts/slender_data/brest_loader.coffee +139 -0
- data/app/assets/javascripts/slender_data/cache.coffee +9 -24
- data/app/assets/javascripts/slender_data/entry_store.coffee +107 -0
- data/app/assets/javascripts/slender_data/loading_indicator.coffee +28 -0
- data/app/assets/javascripts/slender_data/loading_tracker.coffee +74 -0
- data/app/assets/javascripts/slender_data/parameterizable.coffee +50 -0
- data/app/assets/javascripts/slender_data/persistence_manager.coffee +114 -233
- data/app/assets/javascripts/slender_data/queries/base_query.coffee +32 -0
- data/app/assets/javascripts/slender_data/queries/multi_query.coffee +91 -0
- data/app/assets/javascripts/slender_data/queries/single_query.coffee +81 -0
- data/app/assets/javascripts/slender_data/query_cache.coffee +87 -0
- data/lib/slender_data/version.rb +1 -1
- data/spec/dummy/Rakefile +6 -0
- data/spec/dummy/app/assets/javascripts/application.js +13 -0
- data/spec/dummy/app/assets/stylesheets/application.css +13 -0
- data/spec/dummy/app/controllers/application_controller.rb +5 -0
- data/spec/dummy/app/helpers/application_helper.rb +2 -0
- data/spec/dummy/app/views/layouts/application.html.erb +14 -0
- data/spec/dummy/bin/bundle +3 -0
- data/spec/dummy/bin/rails +4 -0
- data/spec/dummy/bin/rake +4 -0
- data/spec/dummy/config.ru +4 -0
- data/spec/dummy/config/application.rb +23 -0
- data/spec/dummy/config/boot.rb +5 -0
- data/spec/dummy/config/database.yml +25 -0
- data/spec/dummy/config/environment.rb +5 -0
- data/spec/dummy/config/environments/development.rb +31 -0
- data/spec/dummy/config/environments/production.rb +80 -0
- data/spec/dummy/config/environments/test.rb +36 -0
- data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
- data/spec/dummy/config/initializers/filter_parameter_logging.rb +4 -0
- data/spec/dummy/config/initializers/inflections.rb +16 -0
- data/spec/dummy/config/initializers/mime_types.rb +5 -0
- data/spec/dummy/config/initializers/secret_token.rb +12 -0
- data/spec/dummy/config/initializers/session_store.rb +3 -0
- data/spec/dummy/config/initializers/wrap_parameters.rb +14 -0
- data/spec/dummy/config/locales/en.yml +23 -0
- data/spec/dummy/config/routes.rb +4 -0
- data/spec/dummy/db/test.sqlite3 +0 -0
- data/spec/dummy/lib/tasks/tasks.rake +13 -0
- data/spec/dummy/log/development.log +349013 -0
- data/spec/dummy/log/test.log +883 -0
- data/spec/dummy/public/404.html +58 -0
- data/spec/dummy/public/422.html +58 -0
- data/spec/dummy/public/500.html +57 -0
- data/spec/dummy/public/favicon.ico +0 -0
- data/spec/dummy/spec/javascripts/brest_loader_spec.coffee +314 -0
- data/spec/dummy/spec/javascripts/cache_spec.coffee +93 -0
- data/spec/dummy/spec/javascripts/entry_store_spec.coffee +315 -0
- data/spec/dummy/spec/javascripts/jquery.js +6 -0
- data/spec/dummy/spec/javascripts/loading_tracker_spec.coffee +95 -0
- data/spec/dummy/spec/javascripts/parameterizable_spec.coffee +138 -0
- data/spec/dummy/spec/javascripts/persistence_manager_spec.coffee +659 -0
- data/spec/dummy/spec/javascripts/queries/base_query_spec.coffee +41 -0
- data/spec/dummy/spec/javascripts/queries/multi_query_spec.coffee +143 -0
- data/spec/dummy/spec/javascripts/queries/single_query_spec.coffee +112 -0
- data/spec/dummy/spec/javascripts/query_cache_spec.coffee +347 -0
- data/spec/dummy/spec/javascripts/sinon-chai.js +109 -0
- data/spec/dummy/spec/javascripts/sinon.js +4290 -0
- data/spec/dummy/spec/javascripts/spec_helper.coffee +23 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/02dabf70b4ae4a034f349ce89b4831d8 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/031a6c2e3a4e952151301446bd3fc16d +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/0373c4e5507b3195c4ad15224d991609 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/05175bd457a57c3ad73ab9a2c8696c9b +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/086e89c7529d5063e771b41793bfe311 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/08b36042c3a4a79ebd9cee8ee1b88e6a +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/10513fd445754b59bd6001ea6ee727d9 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/124f6816f926ae28ad20cc56425f3c91 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/12ce2414098e368903aeb9923e275ef7 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/13fe41fee1fe35b49d145bcc06610705 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/14eca89f8dccac139fd132de35d22628 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/16c8b12ef6dcb486a7b771e43bbcc117 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/19cdfaa89f900500a03507b86afe1231 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/1b3a4d533a743ca2ccfbca0986613995 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/1ca8c5b832302c6c94692d0875a59605 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/2e2576241d2a4969c9277fe85851c92b +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/2ec1baba6d6dc634d091b3acf8127cf7 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/2ff315acad8ceec317fd566d792df64f +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/311f68c1b9e342ebab4c92c8cb2b5e54 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/324a5040c964d5e8d293564383c49b91 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/3310b5a70d0b220782ab3e87642834e9 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/33ea745e7aa9669831758b7d36db1cb4 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/357970feca3ac29060c1e3861e2c0953 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/3999afdceee7ca8dcf53757221c62d71 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/3ba03b9f1aab60e78424f36e0e6cce6c +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/3e9a6ed890157d94f18b480f0079d8e1 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/3ef50ccfe459d5c89ecc79a448586b49 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/46c298dc2ff12ec748c70c017684fc28 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/476318dd8109fbf173335456cabb4128 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/5602ee157ea76a2f44a43739a83b1a6c +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/5b390f4782d6b77f5aec7ec56f3ad934 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/5b5a66f4eefc591d284af6535ae474ea +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/5c41eeb2e98dc0833647e8547880435e +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/5cd2936d626662390288ab4c07ff3957 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/5fd362891a204d492d9fa57ffee6e114 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/643d60abdbcc813c95214920f12f09c3 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/6591bc7545da5a2f5f7dee20b1f110a5 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/6597f36181468ff92ba4284afe001181 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/69b7946c418b75e7ba78f9fc73d3e9b9 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/6c75b81de9afea82a6cbb56749157e3f +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/6e4bc63f9308eb5929a77f7607101af1 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/6ee2243cf1cf415b6267b84dd7b8ba77 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/6f8457b4ba418f572891745381a1e0f5 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/6fd5544e52538b06ac40e5b387b020a5 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/6fed8361766f5ae3cbf781986d6945b2 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/70ffa648dbbe0f2431e7f9307b569354 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/731f0bc492f775825f046d500938fc5a +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/76153dd2cc3d0c6e584080efb16e872a +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/76cd4393e7976d030f4623b8b6b372a0 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/78d5dac5e2f907dd68813ed23a0fd4ac +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/7a400f93bfb71a1a11c59b9804adda6d +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/7abf5e8d9666225cb1d7881798dbd87a +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/7d6f1f3e48f6cc97a9bb4606f8c5a020 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/814ca144649e7dec9e9158b3ec3460f1 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/83de5b2d2c5d49f7737ae1f0316435ec +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/84c67faa73fdd082d4bd7f7712cb0499 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/87a6ddc523ccbf2673750499bede3fc9 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/8a90082fa76a7f37dd92a9b9a9b9f593 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/8c5b622a33c6c034ecb4e78f131c5f73 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/8c9851849e82bb9670e56f046df437f9 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/8fc1455d3af69de5da04bf2a2a3f0b74 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/96af98519e5badf206b77c3ecaf86d20 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/98610661915880264fdb51c8f1a14141 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/9a00753cdfb01f357dc39eeada77d0bc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/9ad3db355e00d28ed3faed6dea5b1bff +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/9cbb3109d489692fd270c77ffa9d9559 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/a22afac508f5adc12bf48d2f8333b8f7 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/a49d020ee42c78bf7d22a21e8ee3b80f +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/a4f4f6c56c368263c0fbcf3f1542aa73 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/a56b8266298c4171918ee403aa1c9e0f +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/a73a44bfca198fdf779532b644ec8af5 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/aa4a22da44bd1b7dbdbb18f983d6c09b +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/ab0236bf3eac5cd30348c18efce8246b +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/abf215c8dc45135a91f4f993514c653f +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/ac1b8c30ad00cc489b7ec78bd6e2fc6c +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/ae8bd07980ad64ef8e9ac3fe38413c6d +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/b1950420978c68074fc6fd81d4320bc0 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/b2d6aa1cb303474ebf3bfc571904ad23 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/b59a10f85562b39fc7dd651965df9cab +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/b8d24bca037cf4b0a9e2979c11c8aea8 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/bc2f15f88df08b4265c83133d6107680 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/bd7ddfa86995ff5d259ea37e4a90c51c +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/c0515d57887926d6e28a0f87da31ee8e +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/c4820232e07d4e298e834c1011a72faa +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/c6babc078901541de3f4cb5cc2703bea +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/c9635dd5cbd79bdd9c58a89f6ea01595 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/c9962abce37f5a56d5f05afe1edfe1b8 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/cce1f28f0d1f5c2817e6eaf392bac615 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/d37cae0bfdf135e6e71bcd0572bef329 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/d4956056f6f35287a04295df6e52575d +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/d771ace226fc8215a3572e0aa35bb0d6 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/dc54acb6b8cd4b84b13f440d57db37b1 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/dd51c50b2d8231175e8da83e8b057120 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/dec2df59b57b3639f89847e50416c924 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/df45b0abc2c323093874639ceb72c012 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/e0393ec0ca968f0d4182c82802da79d5 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/e43bfee690613c316a59f122315314e5 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/ed1d892145be7053348b0ba28c27b427 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/ef2b922f05692ba49eb1f68801786b8e +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/efec5fde178e0875317a0d380222545d +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/f01906d52258e56e92a230dc3e55805d +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/f1b4ffa23205a95782c5c5050359429f +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/f2080a87aa027245a444b1486dce7792 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/f37842723e3572ba18f02519dab4ee77 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/f72501aca20f34d765720253853e6105 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/f74306735334107c5d17684f524b65cf +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/f89dc49f90e98b448540556861f0173e +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/feadb1611975b23f2647e1ac656ad90b +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/ff445b9646db9910af486791b285b112 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/ffa1eaa25729d9d4cd7e2fd666868936 +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/02dabf70b4ae4a034f349ce89b4831d8 +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/031a6c2e3a4e952151301446bd3fc16d +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/0373c4e5507b3195c4ad15224d991609 +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/05175bd457a57c3ad73ab9a2c8696c9b +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/086e89c7529d5063e771b41793bfe311 +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/08b36042c3a4a79ebd9cee8ee1b88e6a +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/10513fd445754b59bd6001ea6ee727d9 +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/124f6816f926ae28ad20cc56425f3c91 +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/13fe41fee1fe35b49d145bcc06610705 +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/14eca89f8dccac139fd132de35d22628 +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/16c8b12ef6dcb486a7b771e43bbcc117 +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/2b22662f42e9f485aafa6a333faaa256 +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/2e2576241d2a4969c9277fe85851c92b +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/2ec1baba6d6dc634d091b3acf8127cf7 +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/2ff315acad8ceec317fd566d792df64f +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/311f68c1b9e342ebab4c92c8cb2b5e54 +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/324a5040c964d5e8d293564383c49b91 +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/3310b5a70d0b220782ab3e87642834e9 +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/33ea745e7aa9669831758b7d36db1cb4 +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/357970feca3ac29060c1e3861e2c0953 +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/3999afdceee7ca8dcf53757221c62d71 +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/3e9a6ed890157d94f18b480f0079d8e1 +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/3ef50ccfe459d5c89ecc79a448586b49 +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/46c298dc2ff12ec748c70c017684fc28 +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/476318dd8109fbf173335456cabb4128 +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/5602ee157ea76a2f44a43739a83b1a6c +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/5b390f4782d6b77f5aec7ec56f3ad934 +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/5b5a66f4eefc591d284af6535ae474ea +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/5cd2936d626662390288ab4c07ff3957 +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/643d60abdbcc813c95214920f12f09c3 +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/6597f36181468ff92ba4284afe001181 +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/6c75b81de9afea82a6cbb56749157e3f +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/6e4bc63f9308eb5929a77f7607101af1 +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/6ee2243cf1cf415b6267b84dd7b8ba77 +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/6f8457b4ba418f572891745381a1e0f5 +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/6fd5544e52538b06ac40e5b387b020a5 +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/6fed8361766f5ae3cbf781986d6945b2 +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/70ffa648dbbe0f2431e7f9307b569354 +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/76cd4393e7976d030f4623b8b6b372a0 +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/7a400f93bfb71a1a11c59b9804adda6d +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/7abf5e8d9666225cb1d7881798dbd87a +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/7d6f1f3e48f6cc97a9bb4606f8c5a020 +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/814ca144649e7dec9e9158b3ec3460f1 +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/83de5b2d2c5d49f7737ae1f0316435ec +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/873c5252aa4eab7409b712c5e276bad2 +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/87a6ddc523ccbf2673750499bede3fc9 +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/8a90082fa76a7f37dd92a9b9a9b9f593 +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/8c5b622a33c6c034ecb4e78f131c5f73 +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/8c9851849e82bb9670e56f046df437f9 +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/8fc1455d3af69de5da04bf2a2a3f0b74 +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/98610661915880264fdb51c8f1a14141 +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/9a00753cdfb01f357dc39eeada77d0bc +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/9ad3db355e00d28ed3faed6dea5b1bff +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/a22afac508f5adc12bf48d2f8333b8f7 +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/a4f4f6c56c368263c0fbcf3f1542aa73 +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/a56b8266298c4171918ee403aa1c9e0f +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/a73a44bfca198fdf779532b644ec8af5 +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/aa4a22da44bd1b7dbdbb18f983d6c09b +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/ab0236bf3eac5cd30348c18efce8246b +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/ac1b8c30ad00cc489b7ec78bd6e2fc6c +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/ae8bd07980ad64ef8e9ac3fe38413c6d +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/b1950420978c68074fc6fd81d4320bc0 +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/b2d6aa1cb303474ebf3bfc571904ad23 +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/b8d24bca037cf4b0a9e2979c11c8aea8 +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/bc2f15f88df08b4265c83133d6107680 +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/c9962abce37f5a56d5f05afe1edfe1b8 +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/cce1f28f0d1f5c2817e6eaf392bac615 +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/d37cae0bfdf135e6e71bcd0572bef329 +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/d4956056f6f35287a04295df6e52575d +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/d771ace226fc8215a3572e0aa35bb0d6 +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/dc54acb6b8cd4b84b13f440d57db37b1 +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/dd51c50b2d8231175e8da83e8b057120 +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/df13b2e8a88a9dcdc4a830fdd8f8d7b8 +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/df45b0abc2c323093874639ceb72c012 +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/e0393ec0ca968f0d4182c82802da79d5 +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/e43bfee690613c316a59f122315314e5 +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/ed1d892145be7053348b0ba28c27b427 +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/ef2b922f05692ba49eb1f68801786b8e +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/f01906d52258e56e92a230dc3e55805d +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/f1b4ffa23205a95782c5c5050359429f +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/f2080a87aa027245a444b1486dce7792 +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/f37842723e3572ba18f02519dab4ee77 +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/f72501aca20f34d765720253853e6105 +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/feadb1611975b23f2647e1ac656ad90b +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/ff445b9646db9910af486791b285b112 +0 -0
- metadata +499 -6
- data/app/assets/javascripts/slender_data.js +0 -8
- data/app/assets/javascripts/slender_data/ajax_loader.coffee +0 -76
- data/app/assets/javascripts/slender_data/indexed_cache.coffee +0 -33
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA1:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 039f8fdfcd726201c423f28a0f3bb5128d6c82f9
|
|
4
|
+
data.tar.gz: e9ae11877f924d70673ea8d87367cb5230e34143
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: d737ee000404b4036b927a0d2fd523dcc8367c5052c859650dca758f7e1398043ad5ac87ae819abbc5d10ae8cd3a5effb19e6588a7c2195a37a0c2a63415f203
|
|
7
|
+
data.tar.gz: 70c48cb3d6b8aed81308ad2333f24b2e0744a220b3a705160e080bbfd45cf4ae5688060c2b5df72e99b8b5fb7df1afc7935cdd00cf5c9226477005e8cee72515
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
#= require_self
|
|
2
|
+
#= require ./slender_data/tools
|
|
3
|
+
#= require ./slender_data/persistence_manager
|
|
4
|
+
|
|
5
|
+
window.slender_data or= {}
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
# Makes sure the given query is an instance of the given query class.
|
|
9
|
+
# If not, creates an instance of the given query class from the given query.
|
|
10
|
+
slender_data.querify = (query, clazz, params) ->
|
|
11
|
+
if query instanceof clazz
|
|
12
|
+
query
|
|
13
|
+
else
|
|
14
|
+
new clazz query, params
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
#= require slender_data/queries/multi_query
|
|
2
|
+
#= require slender_data/queries/single_query
|
|
3
|
+
#= require slender_data/parameterizable
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
# High-level SDK for CRUD operations against a BREST API.
|
|
7
|
+
#
|
|
8
|
+
# Takes arguments as Queries (SingleQuery or MultiQuery),
|
|
9
|
+
# and expects the server to return self-describing data in raw query form,
|
|
10
|
+
# i.e. as "user: {...}" instead of just "{...}" when returning a user object.
|
|
11
|
+
# The server responses are forwarded as-is to the callers.
|
|
12
|
+
class slender_data.BrestLoader extends slender_data.Parameterizable
|
|
13
|
+
|
|
14
|
+
constructor: (params) ->
|
|
15
|
+
super params
|
|
16
|
+
|
|
17
|
+
# The base url of the BREST API on the server.
|
|
18
|
+
#
|
|
19
|
+
# Example: provide '/api' to access users at '/api/users'.
|
|
20
|
+
@base_url = params.base_url or ''
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
# Creates the entry described by the given query on the server.
|
|
24
|
+
create: (entry, callback) ->
|
|
25
|
+
data = {}
|
|
26
|
+
data[@entry_name] = entry
|
|
27
|
+
|
|
28
|
+
jQuery.ajax
|
|
29
|
+
url: @entries_url()
|
|
30
|
+
type: 'POST'
|
|
31
|
+
data: data
|
|
32
|
+
success: callback
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
# Creates the entries described by the given multi-query on the server.
|
|
36
|
+
create_many: (entries, callback) ->
|
|
37
|
+
data = {}
|
|
38
|
+
data[@entries_name] = entries
|
|
39
|
+
|
|
40
|
+
jQuery.ajax
|
|
41
|
+
url: @entries_url()
|
|
42
|
+
type: 'POST'
|
|
43
|
+
data: data
|
|
44
|
+
success: callback
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
# Deletes the entry described by the given query on the server.
|
|
48
|
+
delete: (query, callback) ->
|
|
49
|
+
query = @_querify_single query
|
|
50
|
+
jQuery.ajax
|
|
51
|
+
url: @entry_url(query)
|
|
52
|
+
type: 'DELETE'
|
|
53
|
+
success: callback
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
# Deletes the entries described by the given multi-query on the server.
|
|
57
|
+
delete_many: (multi_query, callback) ->
|
|
58
|
+
multi_query = @_querify_multi multi_query
|
|
59
|
+
data = {}
|
|
60
|
+
data[@ids_name] = multi_query.ids()
|
|
61
|
+
jQuery.ajax
|
|
62
|
+
url: @entries_url()
|
|
63
|
+
type: 'DELETE'
|
|
64
|
+
data: data
|
|
65
|
+
success: callback
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
# Returns the url to access a single entry.
|
|
69
|
+
entry_url: (query) ->
|
|
70
|
+
query = @_querify_single query
|
|
71
|
+
"#{@base_url}/#{@entries_name}/#{query.id()}.json"
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
# Returns the url to access the collection of entries.
|
|
75
|
+
entries_url: ->
|
|
76
|
+
@_entries_url_result or= "#{@base_url}/#{@entries_name}.json"
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
# Merges the entries described by the given ids
|
|
80
|
+
# into a new entry with the given data.
|
|
81
|
+
merge: (old_entry_ids, new_entry, callback) ->
|
|
82
|
+
data =
|
|
83
|
+
old_snippet_ids: old_entry_ids
|
|
84
|
+
merged_snippet_data: new_entry
|
|
85
|
+
$.ajax
|
|
86
|
+
url: "#{@base_url}/#{@entries_name}/merge.json"
|
|
87
|
+
type: 'POST'
|
|
88
|
+
data: data
|
|
89
|
+
success: callback
|
|
90
|
+
|
|
91
|
+
# Fetches the entry with the given key from the server.
|
|
92
|
+
read: (query, callback) ->
|
|
93
|
+
query = @_querify_single query
|
|
94
|
+
jQuery.get @entry_url(query), callback
|
|
95
|
+
|
|
96
|
+
|
|
97
|
+
# Loads all objects from the server.
|
|
98
|
+
# Provides the given params as parameters to the GET request.
|
|
99
|
+
read_many: (multi_query, callback) ->
|
|
100
|
+
multi_query = @_querify_multi multi_query
|
|
101
|
+
data = {}
|
|
102
|
+
data[multi_query.ids_name] = multi_query.ids().join(' ')
|
|
103
|
+
jQuery.ajax
|
|
104
|
+
url: @entries_url()
|
|
105
|
+
type: 'GET'
|
|
106
|
+
cache: no
|
|
107
|
+
data: data
|
|
108
|
+
success: callback
|
|
109
|
+
|
|
110
|
+
|
|
111
|
+
# Updates the given entry on the server.
|
|
112
|
+
#
|
|
113
|
+
# The entry can be a partial diff of the real entry,
|
|
114
|
+
# but must contain the key column.
|
|
115
|
+
update: (entry, callback) ->
|
|
116
|
+
data = {}
|
|
117
|
+
data[@entry_name] = entry
|
|
118
|
+
|
|
119
|
+
jQuery.ajax
|
|
120
|
+
url: @entry_url(entry: entry)
|
|
121
|
+
type: 'PUT'
|
|
122
|
+
data: data
|
|
123
|
+
success: callback
|
|
124
|
+
|
|
125
|
+
|
|
126
|
+
# Updates the given entries on the server.
|
|
127
|
+
#
|
|
128
|
+
# The entry can be a partial diff of the real entry,
|
|
129
|
+
# but must contain the key column.
|
|
130
|
+
update_many: (entries, callback) ->
|
|
131
|
+
data = {}
|
|
132
|
+
data[@entries_name] = entries
|
|
133
|
+
|
|
134
|
+
jQuery.ajax
|
|
135
|
+
url: @entries_url()
|
|
136
|
+
type: 'PUT'
|
|
137
|
+
data: data
|
|
138
|
+
success: callback
|
|
139
|
+
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
# A generic cache.
|
|
2
2
|
# Stores key-value pairs.
|
|
3
|
+
# This is pretty much a more comfortable hash object.
|
|
3
4
|
class slender_data.Cache
|
|
4
5
|
|
|
5
6
|
constructor: ->
|
|
@@ -22,20 +23,18 @@ class slender_data.Cache
|
|
|
22
23
|
# Looks up several entries at once.
|
|
23
24
|
# Returns a hash of found entries, and a list of missing entries.
|
|
24
25
|
get_many: (keys) ->
|
|
25
|
-
|
|
26
|
+
found = []
|
|
27
|
+
missing = []
|
|
26
28
|
for key in keys
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
result.missing.push key
|
|
33
|
-
result
|
|
34
|
-
getMany: Cache::get_many
|
|
29
|
+
if (entry = @cache[key])
|
|
30
|
+
found.push entry
|
|
31
|
+
else
|
|
32
|
+
missing.push key
|
|
33
|
+
found: found, missing: missing
|
|
35
34
|
|
|
36
35
|
|
|
37
36
|
# Returns the number of cached objects.
|
|
38
|
-
length:
|
|
37
|
+
length: ->
|
|
39
38
|
slender_data.object_length @cache
|
|
40
39
|
|
|
41
40
|
|
|
@@ -47,17 +46,3 @@ class slender_data.Cache
|
|
|
47
46
|
# Removes all entries with the given keys.
|
|
48
47
|
remove_many: (keys) ->
|
|
49
48
|
@remove(key) for key in keys
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
# Replaces the cache with the given data.
|
|
53
|
-
# When 'key' is given, treats 'data' as an array of objects, and indexes each element by the given key.
|
|
54
|
-
# When 'key' is not given, treats 'data' as an already indexed hash object.
|
|
55
|
-
replace_all: (data, key) ->
|
|
56
|
-
if key
|
|
57
|
-
# Key given --> index the data array.
|
|
58
|
-
@add(entry[key], entry) for entry in data
|
|
59
|
-
else
|
|
60
|
-
# Key not given --> use data as the new cache.
|
|
61
|
-
@cache = data
|
|
62
|
-
replaceAll: Cache::replace_all
|
|
63
|
-
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
#= require slender_data/query_cache
|
|
2
|
+
#= require slender_data/queries/single_query
|
|
3
|
+
#= require slender_data/queries/multi_query
|
|
4
|
+
#= require slender_data/parameterizable
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
# Stores JSON data objects, and tracks changes to them.
|
|
8
|
+
class slender_data.EntryStore extends slender_data.Parameterizable
|
|
9
|
+
|
|
10
|
+
constructor: (params) ->
|
|
11
|
+
super params
|
|
12
|
+
|
|
13
|
+
# Unmodified copies of the serverside data.
|
|
14
|
+
@server_data = new slender_data.QueryCache params
|
|
15
|
+
|
|
16
|
+
# Replicas of the server data, to be modified by the client.
|
|
17
|
+
@client_data = new slender_data.QueryCache params
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
# Adds the given entry to the caches.
|
|
21
|
+
# Treats the given entry as coming from the server.
|
|
22
|
+
add: (entry) ->
|
|
23
|
+
@server_data.add entry
|
|
24
|
+
@client_data.remove entry
|
|
25
|
+
|
|
26
|
+
# Must return undefined, since we don't want to
|
|
27
|
+
# create the client entry yet to save memory and CPU,
|
|
28
|
+
# and the user should not be mislead by a returned server entry.
|
|
29
|
+
return
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
# Adds the given data objects to the server cache.
|
|
33
|
+
add_many: (entries) ->
|
|
34
|
+
@add(entry) for entry in entries
|
|
35
|
+
return # Should not return anything.
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
# Removes the entry corresponding to the given query
|
|
39
|
+
# from this DataStore.
|
|
40
|
+
delete: (entry) ->
|
|
41
|
+
@client_data.remove entry
|
|
42
|
+
@server_data.remove entry
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
# Removes the entries corresponding to the given multi-query
|
|
46
|
+
# from this DataStore.
|
|
47
|
+
delete_many: (entries) ->
|
|
48
|
+
@client_data.remove_many entries
|
|
49
|
+
@server_data.remove_many entries
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
# Returns an object that contains only the changed attributes
|
|
53
|
+
# of the entry destribed by the given query.
|
|
54
|
+
# Returns false if the entry is not changed.
|
|
55
|
+
entry_changes: (entry) ->
|
|
56
|
+
server_version = @server_data.get entry: entry
|
|
57
|
+
changes = slender_data.object_diff server_version, entry
|
|
58
|
+
if slender_data.object_length(changes) > 0
|
|
59
|
+
changes[@id_name] = entry[@id_name]
|
|
60
|
+
changes
|
|
61
|
+
else
|
|
62
|
+
false
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
# Returns an array containing only the changed objects.
|
|
66
|
+
# Each object contains only the changed columns + key column.
|
|
67
|
+
entries_changes: (entries) ->
|
|
68
|
+
result = []
|
|
69
|
+
for entry in entries
|
|
70
|
+
if (entry_changes = @entry_changes entry)
|
|
71
|
+
result.push entry_changes
|
|
72
|
+
result
|
|
73
|
+
|
|
74
|
+
|
|
75
|
+
# Returns the entry described by the given query,
|
|
76
|
+
# or undefined if it does not exist in any of the caches.
|
|
77
|
+
get: (query) ->
|
|
78
|
+
query = @_querify_single query
|
|
79
|
+
|
|
80
|
+
# Try to use client_data cache.
|
|
81
|
+
unless (result = @client_data.get query)
|
|
82
|
+
|
|
83
|
+
# No data in client cache --> try to use server cache.
|
|
84
|
+
if (server_entry = @server_data.get query)
|
|
85
|
+
result = @client_data.add_clone server_entry
|
|
86
|
+
|
|
87
|
+
result
|
|
88
|
+
|
|
89
|
+
|
|
90
|
+
# Returns the entries described by the given multi-query,
|
|
91
|
+
# as well as a list of entries not found.
|
|
92
|
+
get_many: (multi_query) ->
|
|
93
|
+
found = []
|
|
94
|
+
|
|
95
|
+
# Load client-side data.
|
|
96
|
+
client_results = @client_data.get_many @_querify_multi(multi_query)
|
|
97
|
+
$.merge found, client_results.found
|
|
98
|
+
missing_query = client_results.missing
|
|
99
|
+
|
|
100
|
+
if not missing_query.empty()
|
|
101
|
+
# Some entries not in client cache --> look in server cache.
|
|
102
|
+
server_results = @server_data.get_many missing_query
|
|
103
|
+
$.merge found, @client_data.add_clones(server_results.found)
|
|
104
|
+
missing_query = server_results.missing
|
|
105
|
+
|
|
106
|
+
found: found, missing: missing_query
|
|
107
|
+
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
# Fires events indicating whether a loading operation is currently happening or not.
|
|
2
|
+
class slender_data.LoadingIndicator
|
|
3
|
+
|
|
4
|
+
constructor: ->
|
|
5
|
+
|
|
6
|
+
# The number of currently running loading operations.
|
|
7
|
+
@loader_count = 0
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
# The different events that this class can fire.
|
|
11
|
+
@events =
|
|
12
|
+
AJAX_LOADING: 'AJAX_LOADING'
|
|
13
|
+
AJAX_LOADED: 'AJAX_LOADED'
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
# Lets this LoadingIndicator know that another loading operation has started.
|
|
17
|
+
loading_started: ->
|
|
18
|
+
@loader_count++
|
|
19
|
+
if @loader_count == 1
|
|
20
|
+
$('body').trigger slender_data.AjaxLoader.events.AJAX_LOADING
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
# Lets this LoadingIndicator know that a loading operation has finished.
|
|
24
|
+
loading_finished: ->
|
|
25
|
+
@loader_count--
|
|
26
|
+
if @loader_count == 0
|
|
27
|
+
$('body').trigger slender_data.AjaxLoader.events.AJAX_LOADED
|
|
28
|
+
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
#= require ../query/single_query
|
|
2
|
+
#= require ../query/multi_query
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
# Tracks which snippets are currently getting loaded,
|
|
6
|
+
# and manages requests for snippet data.
|
|
7
|
+
class sn.LoadingTracker
|
|
8
|
+
|
|
9
|
+
constructor: ->
|
|
10
|
+
|
|
11
|
+
# Maps currently loading snippets to callbacks waiting for their data.
|
|
12
|
+
# Key = snippet id, value = array of callbacks
|
|
13
|
+
@loading_snippets = {}
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
# Returns whether the snippet with the given id is currently loading.
|
|
17
|
+
is_loading: (query) ->
|
|
18
|
+
query = sn.SingleQuery.instancify query
|
|
19
|
+
console.log "LoadingTracker.is_loading: snippet #{query.id()} loading status: #{@loading_snippets[query.id()]?}"
|
|
20
|
+
@loading_snippets[query.id()]?
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
# Returns all ids within the requested ids that are currently loading.
|
|
24
|
+
matching_loading_ids: (requested_ids) ->
|
|
25
|
+
_.filter requested_ids, (requested_id) =>
|
|
26
|
+
@is_loading id: requested_id
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
# Notifies this LoadingTracker that the given snippet has arrived.
|
|
30
|
+
snippet_arrived: (snippet) ->
|
|
31
|
+
console.log "LoadingTracker: received snippet #{snippet.id}"
|
|
32
|
+
|
|
33
|
+
# Call the callbacks registered for the loaded snippet.
|
|
34
|
+
if (callbacks = @loading_snippets[snippet.id])
|
|
35
|
+
callback() for callback in callbacks
|
|
36
|
+
|
|
37
|
+
# Remove the id of the loaded snippet from the loading list.
|
|
38
|
+
delete @loading_snippets[snippet.id]
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
# Notifies this LoadingTracker that the given snippets have arrived.
|
|
42
|
+
snippets_arrived: (snippets) ->
|
|
43
|
+
console.log "LoadingTracker: received snippets #{(s.id for s in snippets).join '+'}"
|
|
44
|
+
@snippet_arrived(snippet) for snippet in snippets
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
# Registers the given snippet as currently loading from the server.
|
|
48
|
+
start_loading: (query) ->
|
|
49
|
+
query = sn.SingleQuery.instancify query
|
|
50
|
+
console.log "LoadingTracker: starting to load #{query.id()}"
|
|
51
|
+
@loading_snippets[query.id()] or= []
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
# Registers the given snippets as currently loading from the server.
|
|
55
|
+
start_loadings: (multi_query) ->
|
|
56
|
+
multi_query = sn.MultiQuery.instancify multi_query
|
|
57
|
+
console.log "LoadingTracker: starting to load multiple #{multi_query.ids()}"
|
|
58
|
+
@start_loading(query) for query in multi_query.transpose()
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
# Calls the given callback when the snippet with the given id is loaded.
|
|
62
|
+
wait_for_loading_finished: (query, callback) ->
|
|
63
|
+
query = sn.SingleQuery.instancify query
|
|
64
|
+
|
|
65
|
+
if @is_loading(query)
|
|
66
|
+
# Snippet is loading --> queue the callback until later.
|
|
67
|
+
console.log "LoadingTracker.wait_for_loading_finished: snippet #{query.id()} is loading, waiting for it"
|
|
68
|
+
@loading_snippets[query.id()].push callback
|
|
69
|
+
else
|
|
70
|
+
# Snippet is not loading --> return immediately.
|
|
71
|
+
console.log "LoadingTracker.wait_for_loading_finished: snippet #{query.id()} is not loading"
|
|
72
|
+
return callback()
|
|
73
|
+
|
|
74
|
+
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
# Base class for all classes that are configured by a SlenderData configuration object.
|
|
2
|
+
class slender_data.Parameterizable
|
|
3
|
+
|
|
4
|
+
constructor: (params) ->
|
|
5
|
+
|
|
6
|
+
# The name of a data entry,
|
|
7
|
+
# i.e. "user".
|
|
8
|
+
@entry_name = params.entry_name ? throw new Error('You must provide an entry name')
|
|
9
|
+
|
|
10
|
+
# Name of multiple data entries,
|
|
11
|
+
# i.e. "users".
|
|
12
|
+
@entries_name = params.entries_name ? "#{@entry_name}s"
|
|
13
|
+
|
|
14
|
+
# Name of the id field in entries.
|
|
15
|
+
@id_name = params.id_name ? 'id'
|
|
16
|
+
|
|
17
|
+
# Name of the ids field in entries.
|
|
18
|
+
@ids_name = params.ids_name ? "#{@id_name}s"
|
|
19
|
+
|
|
20
|
+
# The method to use to check whether a given entry is full or partial.
|
|
21
|
+
@is_full_entry = params.full_entry_checker
|
|
22
|
+
|
|
23
|
+
# The class that is used to represent multi-queries.
|
|
24
|
+
@multi_query_class = params.multi_query_class ? slender_data.MultiQuery
|
|
25
|
+
|
|
26
|
+
# The given parameters.
|
|
27
|
+
@params = params
|
|
28
|
+
|
|
29
|
+
# Whether partial entry supported is enabled.
|
|
30
|
+
@partial_entries = params.partial_entries ? no
|
|
31
|
+
|
|
32
|
+
# The class that is used to represent single queries.
|
|
33
|
+
@single_query_class = params.single_query_class ? slender_data.SingleQuery
|
|
34
|
+
|
|
35
|
+
# Name of the version attribute,
|
|
36
|
+
# i.e. "timestamp".
|
|
37
|
+
@version_name = params.version_name ? 'version'
|
|
38
|
+
|
|
39
|
+
# Whether versioning should be supported or not.
|
|
40
|
+
@versioning = params.versioning ? no
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
# Makes sure the given query is indeed a SingleQuery.
|
|
44
|
+
_querify_single: (query) ->
|
|
45
|
+
slender_data.querify query, @single_query_class, @params
|
|
46
|
+
|
|
47
|
+
# Makes sure the given query is indeed a MultiQuery.
|
|
48
|
+
_querify_multi: (multi_query) ->
|
|
49
|
+
slender_data.querify multi_query, @multi_query_class, @params
|
|
50
|
+
|