corkboard 0.1.0 → 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (92) hide show
  1. data/.env.template +1 -0
  2. data/.gitignore +15 -0
  3. data/.rspec.template +2 -0
  4. data/.rvmrc.template +4 -0
  5. data/.wiprc +0 -0
  6. data/.yardopts +1 -0
  7. data/Gemfile +15 -0
  8. data/Gemfile.lock +223 -0
  9. data/app/assets/images/corkboard/.gitkeep +0 -0
  10. data/corkboard.gemspec +41 -0
  11. data/lib/corkboard/version.rb +1 -1
  12. data/script/rails +8 -0
  13. data/spec/controllers/corkboard/application_controller_spec.rb +7 -0
  14. data/spec/controllers/corkboard/authorizations_controller_spec.rb +26 -0
  15. data/spec/controllers/corkboard/board_controller_spec.rb +29 -0
  16. data/spec/controllers/corkboard/posts_controller_spec.rb +7 -0
  17. data/spec/corkboard/client_spec.rb +52 -0
  18. data/spec/corkboard/clients/instagram_spec.rb +30 -0
  19. data/spec/corkboard/engine_spec.rb +11 -0
  20. data/spec/corkboard/provider_spec.rb +28 -0
  21. data/spec/corkboard/providers/instagram_spec.rb +44 -0
  22. data/spec/corkboard/publishers/mock_spec.rb +12 -0
  23. data/spec/corkboard/publishers/pusher_spec.rb +12 -0
  24. data/spec/corkboard/service/config_spec.rb +12 -0
  25. data/spec/corkboard_spec.rb +136 -0
  26. data/spec/dummy/README.rdoc +261 -0
  27. data/spec/dummy/Rakefile +7 -0
  28. data/spec/dummy/app/assets/javascripts/application.js +15 -0
  29. data/spec/dummy/app/assets/stylesheets/application.css +13 -0
  30. data/spec/dummy/app/controllers/application_controller.rb +3 -0
  31. data/spec/dummy/app/helpers/application_helper.rb +2 -0
  32. data/spec/dummy/app/mailers/.gitkeep +0 -0
  33. data/spec/dummy/app/models/.gitkeep +0 -0
  34. data/spec/dummy/app/views/layouts/application.html.erb +14 -0
  35. data/spec/dummy/config.ru +4 -0
  36. data/spec/dummy/config/application.rb +65 -0
  37. data/spec/dummy/config/boot.rb +10 -0
  38. data/spec/dummy/config/database.yml +25 -0
  39. data/spec/dummy/config/environment.rb +5 -0
  40. data/spec/dummy/config/environments/development.rb +37 -0
  41. data/spec/dummy/config/environments/production.rb +67 -0
  42. data/spec/dummy/config/environments/test.rb +37 -0
  43. data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
  44. data/spec/dummy/config/initializers/corkboard.rb +45 -0
  45. data/spec/dummy/config/initializers/inflections.rb +15 -0
  46. data/spec/dummy/config/initializers/jasmine.rb +5 -0
  47. data/spec/dummy/config/initializers/mime_types.rb +5 -0
  48. data/spec/dummy/config/initializers/secret_token.rb +7 -0
  49. data/spec/dummy/config/initializers/session_store.rb +8 -0
  50. data/spec/dummy/config/initializers/wrap_parameters.rb +14 -0
  51. data/spec/dummy/config/locales/en.yml +5 -0
  52. data/spec/dummy/config/routes.rb +3 -0
  53. data/spec/dummy/db/.gitkeep +0 -0
  54. data/spec/dummy/db/migrate/20121212222912_create_corkboard_authorizations.corkboard.rb +18 -0
  55. data/spec/dummy/db/schema.rb +31 -0
  56. data/spec/dummy/lib/assets/.gitkeep +0 -0
  57. data/spec/dummy/log/.gitkeep +0 -0
  58. data/spec/dummy/public/404.html +26 -0
  59. data/spec/dummy/public/422.html +26 -0
  60. data/spec/dummy/public/500.html +25 -0
  61. data/spec/dummy/public/favicon.ico +0 -0
  62. data/spec/dummy/script/rails +6 -0
  63. data/spec/helpers/corkboard/application_helper_spec.rb +7 -0
  64. data/spec/javascripts/fixtures/board.html +3 -0
  65. data/spec/javascripts/helpers/jasmine-jquery.js +340 -0
  66. data/spec/javascripts/spec.css +3 -0
  67. data/spec/javascripts/spec.js +5 -0
  68. data/spec/javascripts/spec_helper.js +41 -0
  69. data/spec/javascripts/specs/corkboard/app/board_spec.js +68 -0
  70. data/spec/javascripts/specs/corkboard/base_spec.js +17 -0
  71. data/spec/javascripts/specs/corkboard/lib/publisher_spec.js +101 -0
  72. data/spec/javascripts/specs/corkboard/lib/weighted_randomizer_spec.js +23 -0
  73. data/spec/javascripts/specs/corkboard_spec.js +45 -0
  74. data/spec/javascripts/support/jasmine.yml +75 -0
  75. data/spec/javascripts/support/jasmine_config.rb +1 -0
  76. data/spec/models/corkboard/authorization_spec.rb +7 -0
  77. data/spec/models/corkboard/post_spec.rb +7 -0
  78. data/spec/models/corkboard/subscription_spec.rb +7 -0
  79. data/spec/requests/authorizations_spec.rb +39 -0
  80. data/spec/requests/board_spec.rb +70 -0
  81. data/spec/routing/authorizations_routing_spec.rb +25 -0
  82. data/spec/routing/board_routing_spec.rb +7 -0
  83. data/spec/routing/posts_routing_spec.rb +15 -0
  84. data/spec/spec_helper.rb +51 -0
  85. data/spec/support/helpers/config_helpers.rb +26 -0
  86. data/spec/support/helpers/controller_helpers.rb +12 -0
  87. data/spec/support/helpers/post_helpers.rb +119 -0
  88. data/vendor/assets/javascripts/jquery.masonry-extensions.js +203 -0
  89. data/vendor/assets/javascripts/jquery.masonry.js +499 -0
  90. data/vendor/assets/javascripts/modernizr.js +821 -0
  91. data/vendor/assets/javascripts/pusher.js +48 -0
  92. metadata +176 -11
@@ -0,0 +1,3 @@
1
+ /**
2
+ *= require application
3
+ */
@@ -0,0 +1,5 @@
1
+ //= require jquery
2
+ //= require jquery_ujs
3
+ //= require jasminerice_reporter
4
+ //= require corkboard
5
+ //= require_tree .
@@ -0,0 +1,41 @@
1
+ (function($, g) {
2
+ $.extend(g, {
3
+ context : function(description, definitions) {
4
+ return jasmine.getEnv().describe(description, definitions);
5
+ },
6
+
7
+ fixture : function(path, load) {
8
+ function readonly() {
9
+ return readFixtures(path);
10
+ }
11
+
12
+ function rendered() {
13
+ loadFixtures(path);
14
+ return $('#jasmine-fixtures').children();
15
+ }
16
+
17
+ return (load ? rendered() : readonly());
18
+ },
19
+
20
+ before : function(callback) {
21
+ return jasmine.getEnv().beforeEach(callback);
22
+ },
23
+
24
+ after : function(callback) {
25
+ return jasmine.getEnv().afterEach(callback);
26
+ },
27
+
28
+ undefine : function(object, property) {
29
+ var original = object[property];
30
+ object[property] = undefined;
31
+
32
+ jasmine.getEnv().currentSpec.after(function() {
33
+ object[property] = original;
34
+ });
35
+ }
36
+ });
37
+
38
+ function parseKey(content) {
39
+ return /define\(["']([a-z:_-]+)["']/.exec(content)[1];
40
+ }
41
+ })(jQuery, this);
@@ -0,0 +1,68 @@
1
+ describe("corkboard/app/corkboard.js", function() {
2
+ it("defines $.corkboard.Board", function() {
3
+ expect($.corkboard.Board).toBeDefined();
4
+ });
5
+
6
+ describe("Board", function() {
7
+ describe("constructor", function() {
8
+ var constructor = $.corkboard.Board;
9
+
10
+ context("given a valid jQuery object for the 'board' content", function() {
11
+ before(function() {
12
+ fixture('board.html', true);
13
+ spyOn($.corkboard, 'Publisher');
14
+ });
15
+
16
+ it("creates a Publisher instance for the board", function() {
17
+ var publisher = $.corkboard.Publisher;
18
+ var instance = new constructor($('#corkboard'));
19
+
20
+ expect(publisher).toHaveBeenCalled();
21
+ expect(publisher.mostRecentCall.args[0]).toBe('article#corkboard');
22
+ expect(publisher.mostRecentCall.args[1]).toEqual(instance.updated);
23
+ });
24
+ });
25
+
26
+ context("given an invalid (zero-length) jQuery object for the 'board' content", function() {
27
+ before(function() {
28
+ spyOn($.corkboard, 'Publisher');
29
+ });
30
+
31
+ it("does nothing", function() {
32
+ var instance = new constructor($('#corkboard'));
33
+ expect($.corkboard.Publisher).not.toHaveBeenCalled();
34
+ });
35
+ });
36
+ });
37
+
38
+ describe("#updated", function() {
39
+ context("called with the updated posts container and a list of new entries", function() {
40
+ var instance, posts, entry;
41
+ var constructor = $.corkboard.Board;
42
+
43
+ before(function() {
44
+ fixture('board.html', true);
45
+ spyOn($.corkboard, 'Publisher');
46
+
47
+ instance = new constructor($('#corkboard'));
48
+ posts = $('ul.corkboard.posts');
49
+ entry = $('<li class="entry">').appendTo(posts);
50
+ });
51
+
52
+ it("updates the layout", function() {
53
+ spyOn(posts, 'masonry');
54
+
55
+ instance.updated(posts, entry);
56
+ expect(posts.masonry).toHaveBeenCalled();
57
+ });
58
+
59
+ it("reveals the entries", function() {
60
+ spyOn(entry, 'fadeIn');
61
+
62
+ instance.updated(posts, entry);
63
+ expect(entry.fadeIn).toHaveBeenCalledWith('slow');
64
+ });
65
+ });
66
+ });
67
+ });
68
+ });
@@ -0,0 +1,17 @@
1
+ describe("corkboard/base.js", function() {
2
+ it("defines $.corkboard", function() {
3
+ expect($.corkboard).toBeDefined();
4
+ });
5
+
6
+ describe("$.corkboard.defaults", function() {
7
+ var defaults = $.corkboard.defaults;
8
+
9
+ it("is defined", function() {
10
+ expect(defaults).toBeDefined();
11
+ });
12
+
13
+ it("specifies a value for 'fade', used by visibility transitions", function() {
14
+ expect(defaults.fade).toEqual('slow');
15
+ });
16
+ });
17
+ });
@@ -0,0 +1,101 @@
1
+ describe("corkboard/lib/publisher.js", function() {
2
+ it("defines $.corkboard.Publisher", function() {
3
+ expect($.corkboard.Publisher).toBeDefined();
4
+ });
5
+
6
+ describe("Publisher", function() {
7
+ var mocks;
8
+ var constructor = $.corkboard.Publisher;
9
+
10
+ before(function() {
11
+ mocks = {
12
+ channel : {
13
+ bind : function() {}
14
+ },
15
+ pusher : {
16
+ bind : function() {},
17
+ subscribe : function() { return mocks.channel }
18
+ }
19
+ };
20
+ });
21
+
22
+ describe("constructor", function() {
23
+ context("given a valid container for the 'board' content", function() {
24
+ before(function() {
25
+ fixture('board.html', true);
26
+ spyOn(window, 'Pusher').andReturn(mocks.pusher);
27
+ });
28
+
29
+ it("opens a Pusher channel for the content updates", function() {
30
+ var instance = new constructor($('#corkboard'));
31
+ expect(window.Pusher).toHaveBeenCalledWith($.corkboard.config.pusher);
32
+ });
33
+
34
+ it("retains a reference to the 'board'", function() {
35
+ var instance = new constructor($('#corkboard'));
36
+ expect(instance.board).toBe('#corkboard');
37
+ });
38
+
39
+ context("and given a callback", function() {
40
+ it("retains a reference to the callback", function() {
41
+ var callback = function callback() {};
42
+ var instance = new constructor($('#corkboard'), callback);
43
+ expect(instance.callback).toEqual(callback);
44
+ });
45
+ });
46
+ });
47
+
48
+ context("given an invalid selector for the 'board' content", function() {
49
+ before(function() {
50
+ spyOn(window, 'Pusher');
51
+ });
52
+
53
+ it("does nothing", function() {
54
+ var instance = new constructor($('#corkboard'));
55
+ expect(window.Pusher).not.toHaveBeenCalled();
56
+ expect(instance.board).not.toBeDefined();
57
+ });
58
+ });
59
+ });
60
+
61
+ describe("#publish", function() {
62
+ before(function() {
63
+ fixture('board.html', true);
64
+ spyOn(window, 'Pusher').andReturn(mocks.pusher);
65
+ });
66
+
67
+ context("given JSON for a new post", function() {
68
+ var json;
69
+
70
+ before(function() {
71
+ json = {
72
+ eid : 'EXAMPLE',
73
+ tags : 'EXAMPLE',
74
+ caption : 'EXAMPLE',
75
+ image : '/assets/corkboard/image.png'
76
+ };
77
+ });
78
+
79
+ it("renders a tile for the post", function() {
80
+ var instance = new constructor($('#corkboard'));
81
+ expect($('#corkboard li')).not.toExist();
82
+
83
+ instance.publish(json);
84
+ expect($('#corkboard li')).toExist();
85
+ });
86
+
87
+ context("and given a registered callback", function() {
88
+ it("executes the callback, passing the list of posts as an argument", function() {
89
+ var callback = jasmine.createSpy('callback');
90
+ var instance = new constructor($('#corkboard'), callback);
91
+
92
+ instance.publish(json);
93
+ expect(callback).toHaveBeenCalled();
94
+ expect(callback.mostRecentCall.args[0]).toBe('ul.corkboard.posts');
95
+ expect(callback.mostRecentCall.args[1]).toBe('li.entry');
96
+ });
97
+ });
98
+ });
99
+ });
100
+ });
101
+ });
@@ -0,0 +1,23 @@
1
+ describe("corkboard/lib/weighted_randomizer.js", function() {
2
+ it("defines $.corkboard.WeightedRandomizer", function() {
3
+ expect($.corkboard.WeightedRandomizer).toBeDefined();
4
+ });
5
+
6
+ describe("WeightedRandomizer", function() {
7
+ var constructor = $.corkboard.WeightedRandomizer;
8
+
9
+ describe("constructor", function() {
10
+ it("normalizes the setup data", function() {
11
+ var instance = new constructor({ one : 2, two : 8 });
12
+ expect(instance.normalized).toEqual({ one : 0.2, two : 0.8 });
13
+ });
14
+ });
15
+
16
+ describe("#sample", function() {
17
+ it("returns a selection from the setup, weighted by value", function() {
18
+ var instance = new constructor({ one : 0, two : 1000000 });
19
+ expect(instance.sample()).toEqual('two');
20
+ });
21
+ });
22
+ });
23
+ });
@@ -0,0 +1,45 @@
1
+ describe("corkboard.js", function() {
2
+ describe("$.corkboard.version", function() {
3
+ it("is defined", function() {
4
+ expect($.corkboard.version).toEqual('0.1.0');
5
+ });
6
+ });
7
+
8
+ describe("$.corkboard.config", function() {
9
+ var config = $.corkboard.config;
10
+
11
+ it("specifies a key for the Pusher service", function() {
12
+ expect(config.pusher).toBeDefined();
13
+ });
14
+
15
+ it("specifies the display 'weights' for tiles", function() {
16
+ expect(config.weights).toEqual({
17
+ s : 10,
18
+ m : 3,
19
+ l : 1
20
+ });
21
+ });
22
+ });
23
+
24
+ describe("$.fn.corkboard", function() {
25
+ before(function() {
26
+ spyOn($.corkboard, 'Board');
27
+ });
28
+
29
+ it("is defined", function() {
30
+ expect($.fn.corkboard).toBeDefined();
31
+ });
32
+
33
+ it("creates a new Board", function() {
34
+ var object = $('<div>');
35
+ var result = object.corkboard();
36
+ expect($.corkboard.Board).toHaveBeenCalled();
37
+ });
38
+
39
+ it("returns the given jQuery object", function() {
40
+ var object = $('<div>');
41
+ var result = object.corkboard();
42
+ expect(result).toEqual(object);
43
+ });
44
+ });
45
+ });
@@ -0,0 +1,75 @@
1
+ # src_files
2
+ #
3
+ # Return an array of filepaths relative to src_dir to include before jasmine specs.
4
+ # Default: []
5
+ #
6
+ # EXAMPLE:
7
+ #
8
+ # src_files:
9
+ # - lib/source1.js
10
+ # - lib/source2.js
11
+ # - dist/**/*.js
12
+ #
13
+ src_files:
14
+ - vendor/**/*.js
15
+
16
+ # stylesheets
17
+ #
18
+ # Return an array of stylesheet filepaths relative to src_dir to include before jasmine specs.
19
+ # Default: []
20
+ #
21
+ # EXAMPLE:
22
+ #
23
+ # stylesheets:
24
+ # - css/style.css
25
+ # - stylesheets/*.css
26
+ #
27
+ stylesheets:
28
+ - spec/helpers/**/*.css
29
+
30
+ # helpers
31
+ #
32
+ # Return an array of filepaths relative to spec_dir to include before jasmine specs.
33
+ # Default: ["helpers/**/*.js"]
34
+ #
35
+ # EXAMPLE:
36
+ #
37
+ # helpers:
38
+ # - helpers/**/*.js
39
+ #
40
+ helpers:
41
+ - helpers/**/*.js
42
+
43
+ # spec_files
44
+ #
45
+ # Return an array of filepaths relative to spec_dir to include.
46
+ # Default: ["**/*[sS]pec.js"]
47
+ #
48
+ # EXAMPLE:
49
+ #
50
+ # spec_files:
51
+ # - **/*[sS]pec.js
52
+ #
53
+ spec_files:
54
+
55
+ # src_dir
56
+ #
57
+ # Source directory path. Your src_files must be returned relative to this path. Will use root if left blank.
58
+ # Default: project root
59
+ #
60
+ # EXAMPLE:
61
+ #
62
+ # src_dir: public
63
+ #
64
+ src_dir:
65
+
66
+ # spec_dir
67
+ #
68
+ # Spec directory path. Your spec_files must be returned relative to this path.
69
+ # Default: spec/javascripts
70
+ #
71
+ # EXAMPLE:
72
+ #
73
+ # spec_dir: spec/javascripts
74
+ #
75
+ spec_dir: spec
@@ -0,0 +1,7 @@
1
+ require "spec_helper"
2
+
3
+ describe Corkboard::Authorization do
4
+ it "is pending" do
5
+ pending
6
+ end
7
+ end
@@ -0,0 +1,7 @@
1
+ require "spec_helper"
2
+
3
+ describe Corkboard::Post do
4
+ it "is pending" do
5
+ pending
6
+ end
7
+ end
@@ -0,0 +1,7 @@
1
+ require "spec_helper"
2
+
3
+ describe Corkboard::Subscription do
4
+ it "is pending" do
5
+ pending
6
+ end
7
+ end
@@ -0,0 +1,39 @@
1
+ require "spec_helper"
2
+
3
+ describe "Board", :js => false do
4
+ describe "GET corkboard/authorizations#index" do
5
+ context "when the authentication requirement for 'admin' is :disallow!" do
6
+ it "raises an exception" do
7
+ with_config(:authentication, { :admin => :disallow! }) do
8
+ expect { visit corkboard.authorizations_path }
9
+ .to raise_error(Corkboard::ActionForbidden)
10
+ end
11
+ end
12
+ end
13
+
14
+ context "when the authentication requirement for 'admin' is nil" do
15
+ it "is successful" do
16
+ with_config(:authentication, { :admin => nil }) do
17
+ visit corkboard.authorizations_path
18
+ expect(page).to have_content('Activated Services')
19
+ expect(page).to have_content('Available Services')
20
+ end
21
+ end
22
+ end
23
+
24
+ context "given an authenticated Admin" do
25
+ before do
26
+ Corkboard::ApplicationController.any_instance
27
+ .stub(:authenticate!).and_return(true)
28
+ end
29
+
30
+ it "is successful" do
31
+ with_config(:authentication, { :admin => :authenticate! }) do
32
+ visit corkboard.authorizations_path
33
+ expect(page).to have_content('Activated Services')
34
+ expect(page).to have_content('Available Services')
35
+ end
36
+ end
37
+ end
38
+ end
39
+ end