opinions 0.0.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.
@@ -0,0 +1,70 @@
1
+ require 'test_helper'
2
+
3
+ module Opinions
4
+
5
+ class IntegrationTestOpinionsOpinionated < MiniTest::Integration::TestCase
6
+
7
+ def test_voting_on_any_confirming_object
8
+
9
+ example_target = ExampleTarget.new
10
+ example_target.id = 456
11
+
12
+ ExampleObject.send(:include, Opinionated)
13
+ ExampleObject.send(:opinions, :example)
14
+
15
+ example_object = ExampleObject.new
16
+ example_object.id = 123
17
+
18
+ example_object.example(example_target)
19
+
20
+ assert Opinion.new(target: example_target, object: example_object, opinion: :example).exists?
21
+
22
+ end
23
+
24
+ def test_cancelling_a_vote_on_any_conforming_object
25
+
26
+ example_target = ExampleTarget.new
27
+ example_target.id = 456
28
+
29
+ ExampleObject.send(:include, Opinionated)
30
+ ExampleObject.send(:opinions, :example)
31
+
32
+ example_object = ExampleObject.new
33
+ example_object.id = 123
34
+
35
+ expected_opinion = Opinion.new(target: example_target, object: example_object, opinion: :example)
36
+ expected_opinion.persist
37
+
38
+ example_object.cancel_example(example_target)
39
+
40
+ refute Opinion.new(target: example_target, object: example_object, opinion: :example).exists?
41
+
42
+ end
43
+
44
+ def test_retrieving_votes_from_the_backend
45
+
46
+ example_target_one = ExampleTarget.new
47
+ example_target_one.id = 456
48
+
49
+ example_target_two = ExampleTarget.new
50
+ example_target_two.id = 789
51
+
52
+ ExampleObject.send(:include, Opinionated)
53
+ ExampleObject.send(:opinions, :example)
54
+
55
+ example_object = ExampleObject.new
56
+ example_object.id = 123
57
+
58
+ expected_opinion_one = Opinion.new(target: example_target_one, object: example_object, opinion: :example)
59
+ expected_opinion_one.persist
60
+
61
+ expected_opinion_two = Opinion.new(target: example_target_two, object: example_object, opinion: :example)
62
+ expected_opinion_two.persist
63
+
64
+ assert_equal 2, example_object.example_opinions.count
65
+
66
+ end
67
+
68
+ end
69
+
70
+ end
@@ -0,0 +1,71 @@
1
+ require 'test_helper'
2
+
3
+ module Opinions
4
+
5
+ class IntegrationTestOpinionsPollable < MiniTest::Integration::TestCase
6
+
7
+ def test_being_voted_by_any_conforming_object
8
+
9
+ example_object = ExampleObject.new
10
+ example_object.id = 123
11
+
12
+ ExampleTarget.send(:include, Pollable)
13
+ ExampleTarget.send(:opinions, :example)
14
+
15
+ example_target = ExampleTarget.new
16
+ example_target.id = 456
17
+
18
+ example_target.example_by(example_object)
19
+
20
+ assert Opinion.new(target: example_target, object: example_object, opinion: :example).exists?
21
+
22
+ end
23
+
24
+ def test_cancelling_a_vote_by_any_conforming_object
25
+
26
+ example_object = ExampleObject.new
27
+ example_object.id = 123
28
+
29
+ ExampleTarget.send(:include, Pollable)
30
+ ExampleTarget.send(:opinions, :example)
31
+
32
+ example_target = ExampleTarget.new
33
+ example_target.id = 456
34
+
35
+ expected_opinion = Opinion.new(target: example_target, object: example_object, opinion: :example)
36
+ expected_opinion.persist
37
+
38
+ example_target.cancel_example_by(example_object)
39
+
40
+ refute Opinion.new(target: example_target, object: example_object, opinion: :example).exists?
41
+
42
+ end
43
+
44
+ def test_counting_the_number_of_votes
45
+
46
+ example_object_one = ExampleObject.new
47
+ example_object_one.id = 123
48
+
49
+ example_object_two = ExampleObject.new
50
+ example_object_two.id = 456
51
+
52
+ ExampleTarget.send(:include, Pollable)
53
+ ExampleTarget.send(:opinions, :example)
54
+
55
+ example_target = ExampleTarget.new
56
+ example_target.id = 456
57
+
58
+ expected_opinion_one = Opinion.new(target: example_target, object: example_object_one, opinion: :example)
59
+ expected_opinion_one.persist
60
+
61
+ expected_opinion_two = Opinion.new(target: example_target, object: example_object_two, opinion: :example)
62
+ expected_opinion_two.persist
63
+
64
+ assert_equal 2, example_target.example_votes.count
65
+
66
+ end
67
+
68
+
69
+ end
70
+
71
+ end
@@ -0,0 +1,6 @@
1
+ daemonize yes
2
+ bind 127.0.0.1
3
+ port 9738
4
+ pidfile /tmp/opinions_integration_test_redis.pid
5
+ logfile /tmp/opinions_integration_test_redis.log
6
+ dir /tmp
@@ -0,0 +1,112 @@
1
+ require 'rubygems'
2
+ require 'bundler'
3
+
4
+ require 'singleton'
5
+ require 'tempfile'
6
+
7
+ Bundler.setup
8
+
9
+ require 'daemon_controller'
10
+
11
+ require 'minitest/unit'
12
+ require 'minitest/spec'
13
+ require 'minitest/autorun'
14
+
15
+ require 'turn'
16
+
17
+ require_relative '../lib/opinions'
18
+
19
+ Turn.config do |tc|
20
+ tc.ansi = true
21
+ tc.format = :dot
22
+ end
23
+
24
+ IntegrationTestRedis = DaemonController.new(
25
+ identifier: "Opinions Ingration Test Redis Server",
26
+ start_command: "redis-server #{File.expand_path('./opinions_integration_test_redis.conf', 'test')}",
27
+ ping_command: [:tcp, '127.0.0.1', 9738],
28
+ pid_file: "/tmp/opinions_integration_test_redis.pid",
29
+ log_file: "/tmp/opinions_integration_test_redis.log",
30
+ start_timeout: 2
31
+ )
32
+
33
+ module Opinions
34
+
35
+ module MiniTest
36
+
37
+ class Unit
38
+ TestCase = Class.new(::MiniTest::Unit::TestCase)
39
+ end
40
+
41
+ class Acceptance
42
+ TestCase = Class.new(Unit::TestCase)
43
+ end
44
+
45
+ class Integration
46
+ TestCase = Class.new(Acceptance::TestCase)
47
+ end
48
+
49
+ end
50
+
51
+ end
52
+
53
+ Opinions::MiniTest::Unit::TestCase.class_eval do
54
+
55
+ def setup_with_clean_objects
56
+ setup_without_clean_objects
57
+ instance_methods = Module.new do
58
+ def ==(other)
59
+ id == other.id
60
+ end
61
+ def initialize(id = nil)
62
+ @id = id
63
+ end
64
+ end
65
+ class_methods = Module.new do
66
+ def find(id)
67
+ new(id)
68
+ end
69
+ end
70
+ ::Object.const_set(:ExampleObject, Class.new)
71
+ ::Object.const_set(:ExampleTarget, Class.new)
72
+ ::ExampleObject.class_eval { attr_accessor :id }
73
+ ::ExampleTarget.class_eval { attr_accessor :id }
74
+ ::ExampleObject.send(:include, instance_methods)
75
+ ::ExampleTarget.send(:include, instance_methods)
76
+ ::ExampleObject.send(:extend, class_methods)
77
+ ::ExampleTarget.send(:extend, class_methods)
78
+ end
79
+ alias :setup_without_clean_objects :setup
80
+ alias :setup :setup_with_clean_objects
81
+
82
+ def teardown_with_clean_objects
83
+ teardown_without_clean_objects
84
+ Object.send(:remove_const, :ExampleObject)
85
+ Object.send(:remove_const, :ExampleTarget)
86
+ end
87
+ alias :teardown_without_clean_objects :teardown
88
+ alias :teardown :teardown_with_clean_objects
89
+
90
+ end
91
+
92
+ Opinions::MiniTest::Integration::TestCase.class_eval do
93
+
94
+ def setup_with_live_redis
95
+ setup_without_live_redis
96
+ ::IntegrationTestRedis.start
97
+ rb = Opinions::RedisBackend.new
98
+ rb.redis = ::Redis.new(port: 9738)
99
+ rb.redis.flushdb
100
+ Opinions.backend = rb
101
+ end
102
+ alias :setup_without_live_redis :setup
103
+ alias :setup :setup_with_live_redis
104
+
105
+ def teardown_with_live_redis
106
+ teardown_without_live_redis
107
+ ::IntegrationTestRedis.stop
108
+ end
109
+ alias :teardown_without_live_redis :teardown
110
+ alias :teardown :teardown_with_live_redis
111
+
112
+ end
@@ -0,0 +1,56 @@
1
+ require 'test_helper'
2
+
3
+ module Opinions
4
+
5
+ class UnitTestKeyBuilder < MiniTest::Unit::TestCase
6
+
7
+ def test_an_argument_error_is_raised_when_instantiated_with_an_empty_hash
8
+ assert_raises KeyError do
9
+ KeyBuilder.new({})
10
+ end
11
+ end
12
+
13
+ def test_generating_a_simple_key
14
+ example_object = ::ExampleObject.new
15
+ example_object.id = 123
16
+ assert_equal 'ExampleObject:test:123', KeyBuilder.new(object: example_object, opinion: :test).key
17
+ end
18
+
19
+ def test_generating_a_key_with_a_non_numerical_id
20
+ example_instance = ::ExampleObject.new
21
+ example_instance.id = "digest"
22
+ assert_equal 'ExampleObject:test:digest', KeyBuilder.new(object: example_instance, opinion: :test).key
23
+ end
24
+
25
+ def test_generating_a_key_for_an_object_class_count
26
+ # Note: This slightly abuses the KeyBuilder (target vs. object)
27
+ example_target = ::ExampleTarget.new
28
+ example_target.id = 456
29
+ assert_equal 'ExampleTarget:like:456', KeyBuilder.new(object: example_target, opinion: :like).key
30
+ end
31
+
32
+ def test_generating_a_key_for_an_object_class
33
+ example_object = ::ExampleObject.new
34
+ example_object.id = 123
35
+ assert_equal 'ExampleObject:like:123:ExampleTarget', KeyBuilder.new(object: example_object, opinion: :like, target: ::ExampleTarget).key
36
+ end
37
+
38
+ def test_generating_a_key_for_a_simple_opinion
39
+ example_object = ::ExampleObject.new
40
+ example_object.id = 123
41
+ example_target = ::ExampleTarget.new
42
+ example_target.id = 456
43
+ assert_equal 'ExampleObject:like:123:ExampleTarget', KeyBuilder.new(object: example_object, opinion: :like, target: example_target).key
44
+ end
45
+
46
+ def test_generating_a_key_for_a_less_simple_opinion
47
+ example_object = ::ExampleObject.new
48
+ example_object.id = 123
49
+ example_target = ::ExampleTarget.new
50
+ example_target.id = 456
51
+ assert_equal 'ExampleObject:absolute_hate:123:ExampleTarget', KeyBuilder.new(object: example_object, opinion: :absolute_hate, target: example_target).key
52
+ end
53
+
54
+ end
55
+
56
+ end
@@ -0,0 +1,72 @@
1
+ require 'test_helper'
2
+
3
+ module Opinions
4
+
5
+ class UnitTestOpinion < MiniTest::Unit::TestCase
6
+
7
+ def test_an_argument_error_is_raised_when_instantiated_without_a_target
8
+ assert_raises KeyError do
9
+ Opinion.new(object: true, opinion: true)
10
+ end
11
+ end
12
+
13
+ def test_an_argument_error_is_raised_when_instantiated_without_an_object
14
+ assert_raises KeyError do
15
+ Opinion.new(target: true, opinion: true)
16
+ end
17
+ end
18
+
19
+ def test_an_argument_error_is_raised_when_instantiated_without_an_opinion
20
+ assert_raises KeyError do
21
+ Opinion.new(object: true, target: true)
22
+ end
23
+ end
24
+
25
+ def test_opinions_with_the_same_properties_compare_equal
26
+ o, t = Class.new, Class.new
27
+ opinion_one = Opinion.new(opinion: :test, target: t, object: o)
28
+ opinion_two = Opinion.new(opinion: :test, target: t, object: o)
29
+ assert_equal opinion_one, opinion_two
30
+ end
31
+
32
+ def test_opinions_with_different_properties_do_not_compare_equal
33
+ opinion_one = Opinion.new(opinion: :test, target: Class.new, object: Class.new)
34
+ opinion_two = Opinion.new(opinion: :test, target: Class.new, object: Class.new)
35
+ refute_equal opinion_one, opinion_two
36
+ end
37
+
38
+ def test_the_creation_time_is_readable_via_an_accessor_default_nil
39
+ assert_nil Opinion.new(object: true, target: :example, opinion: true).created_at
40
+ end
41
+
42
+ def test_the_target_is_readable_via_an_accessor
43
+ assert_equal :example, Opinion.new(object: true, target: :example, opinion: true).target
44
+ end
45
+
46
+ def test_the_object_is_readable_via_an_accessor
47
+ assert_equal :example, Opinion.new(object: :example, target: true, opinion: true).object
48
+ end
49
+
50
+ def test_the_opinion_is_readable_via_an_accessor
51
+ assert_equal :example, Opinion.new(object: true, target: true, opinion: :example).opinion
52
+ end
53
+
54
+ def test_the_target_key_is_made_available_via_an_accessor
55
+ example_object = ::ExampleObject.new
56
+ example_target = ::ExampleTarget.new
57
+ example_target.id = 456
58
+ opinion = Opinion.new(object: example_object, target: example_target, opinion: :example)
59
+ assert_equal 'ExampleTarget:example:456:ExampleObject', opinion.target_key
60
+ end
61
+
62
+ def test_the_object_key_is_made_available_via_an_accessor
63
+ example_object = ::ExampleObject.new
64
+ example_object.id = 123
65
+ example_target = ::ExampleTarget.new
66
+ opinion = Opinion.new(object: example_object, target: example_target, opinion: :example)
67
+ assert_equal 'ExampleObject:example:123:ExampleTarget', opinion.object_key
68
+ end
69
+
70
+ end
71
+
72
+ end
metadata ADDED
@@ -0,0 +1,137 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: opinions
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Lee Hambley
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2012-03-10 00:00:00.000000000Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: redis
16
+ requirement: &70143554472800 !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: *70143554472800
25
+ - !ruby/object:Gem::Dependency
26
+ name: minitest
27
+ requirement: &70143554471840 !ruby/object:Gem::Requirement
28
+ none: false
29
+ requirements:
30
+ - - ! '>='
31
+ - !ruby/object:Gem::Version
32
+ version: 2.11.3
33
+ - - <
34
+ - !ruby/object:Gem::Version
35
+ version: 2.12.0
36
+ type: :development
37
+ prerelease: false
38
+ version_requirements: *70143554471840
39
+ - !ruby/object:Gem::Dependency
40
+ name: autotest
41
+ requirement: &70143554470080 !ruby/object:Gem::Requirement
42
+ none: false
43
+ requirements:
44
+ - - ! '>='
45
+ - !ruby/object:Gem::Version
46
+ version: '0'
47
+ type: :development
48
+ prerelease: false
49
+ version_requirements: *70143554470080
50
+ - !ruby/object:Gem::Dependency
51
+ name: turn
52
+ requirement: &70143554468980 !ruby/object:Gem::Requirement
53
+ none: false
54
+ requirements:
55
+ - - ! '>='
56
+ - !ruby/object:Gem::Version
57
+ version: '0'
58
+ type: :development
59
+ prerelease: false
60
+ version_requirements: *70143554468980
61
+ - !ruby/object:Gem::Dependency
62
+ name: daemon_controller
63
+ requirement: &70143554468440 !ruby/object:Gem::Requirement
64
+ none: false
65
+ requirements:
66
+ - - ! '>='
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ type: :development
70
+ prerelease: false
71
+ version_requirements: *70143554468440
72
+ description: A toolkit for storing user votes/opinions in Redis
73
+ email:
74
+ - lee.hambley@gmail.com
75
+ executables: []
76
+ extensions: []
77
+ extra_rdoc_files: []
78
+ files:
79
+ - .autotest
80
+ - .gitignore
81
+ - Gemfile
82
+ - LICENSE
83
+ - README.md
84
+ - Rakefile
85
+ - lib/opinions.rb
86
+ - lib/opinions/version.rb
87
+ - opinions.gemspec
88
+ - test/acceptance_test_key_loader.rb
89
+ - test/acceptance_test_opinions_opinion.rb
90
+ - test/acceptance_test_opinions_opinionated_mixin.rb
91
+ - test/acceptance_test_opinions_pollable_mixin.rb
92
+ - test/integration_test_opinions_opinion.rb
93
+ - test/integration_test_opinions_opinionated_mixin.rb
94
+ - test/integration_test_opinions_pollable_mixin.rb
95
+ - test/opinions_integration_test_redis.conf
96
+ - test/test_helper.rb
97
+ - test/unit_test_opinions_key_builder.rb
98
+ - test/unit_test_opinions_opinion.rb
99
+ homepage: ''
100
+ licenses: []
101
+ post_install_message:
102
+ rdoc_options: []
103
+ require_paths:
104
+ - lib
105
+ required_ruby_version: !ruby/object:Gem::Requirement
106
+ none: false
107
+ requirements:
108
+ - - ! '>='
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
111
+ required_rubygems_version: !ruby/object:Gem::Requirement
112
+ none: false
113
+ requirements:
114
+ - - ! '>='
115
+ - !ruby/object:Gem::Version
116
+ version: '0'
117
+ requirements: []
118
+ rubyforge_project:
119
+ rubygems_version: 1.8.10
120
+ signing_key:
121
+ specification_version: 3
122
+ summary: Opinions allows the storage of opinions in Redis, a fast and atomic structured
123
+ data store. If one's users hate, love, appreciate, despise or just-don-t-care, one
124
+ can store that easily via a simple API.
125
+ test_files:
126
+ - test/acceptance_test_key_loader.rb
127
+ - test/acceptance_test_opinions_opinion.rb
128
+ - test/acceptance_test_opinions_opinionated_mixin.rb
129
+ - test/acceptance_test_opinions_pollable_mixin.rb
130
+ - test/integration_test_opinions_opinion.rb
131
+ - test/integration_test_opinions_opinionated_mixin.rb
132
+ - test/integration_test_opinions_pollable_mixin.rb
133
+ - test/opinions_integration_test_redis.conf
134
+ - test/test_helper.rb
135
+ - test/unit_test_opinions_key_builder.rb
136
+ - test/unit_test_opinions_opinion.rb
137
+ has_rdoc: