corkboard 0.1.0 → 0.1.1

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