fogli 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (49) hide show
  1. data/.gitignore +5 -0
  2. data/Gemfile +14 -0
  3. data/LICENSE +21 -0
  4. data/README.md +168 -0
  5. data/Rakefile +37 -0
  6. data/VERSION +1 -0
  7. data/examples/README.md +6 -0
  8. data/examples/me/README.md +18 -0
  9. data/examples/me/me.rb +30 -0
  10. data/lib/fogli.rb +46 -0
  11. data/lib/fogli/album.rb +8 -0
  12. data/lib/fogli/categorized_object.rb +9 -0
  13. data/lib/fogli/comment.rb +5 -0
  14. data/lib/fogli/event.rb +9 -0
  15. data/lib/fogli/exception.rb +15 -0
  16. data/lib/fogli/facebook_graph.rb +125 -0
  17. data/lib/fogli/facebook_object.rb +225 -0
  18. data/lib/fogli/facebook_object/connection_proxy.rb +80 -0
  19. data/lib/fogli/facebook_object/connection_scope.rb +123 -0
  20. data/lib/fogli/facebook_object/connections.rb +56 -0
  21. data/lib/fogli/facebook_object/properties.rb +81 -0
  22. data/lib/fogli/facebook_object/scope_methods.rb +49 -0
  23. data/lib/fogli/group.rb +8 -0
  24. data/lib/fogli/link.rb +8 -0
  25. data/lib/fogli/named_object.rb +8 -0
  26. data/lib/fogli/note.rb +7 -0
  27. data/lib/fogli/oauth.rb +167 -0
  28. data/lib/fogli/page.rb +15 -0
  29. data/lib/fogli/photo.rb +8 -0
  30. data/lib/fogli/post.rb +18 -0
  31. data/lib/fogli/status.rb +7 -0
  32. data/lib/fogli/user.rb +36 -0
  33. data/lib/fogli/util/module_attributes.rb +61 -0
  34. data/lib/fogli/util/options.rb +32 -0
  35. data/lib/fogli/video.rb +7 -0
  36. data/test/fogli/facebook_graph_test.rb +124 -0
  37. data/test/fogli/facebook_object/connection_proxy_test.rb +42 -0
  38. data/test/fogli/facebook_object/connection_scope_test.rb +91 -0
  39. data/test/fogli/facebook_object/connections_test.rb +50 -0
  40. data/test/fogli/facebook_object/properties_test.rb +79 -0
  41. data/test/fogli/facebook_object/scope_methods_test.rb +69 -0
  42. data/test/fogli/facebook_object_test.rb +178 -0
  43. data/test/fogli/oauth_test.rb +56 -0
  44. data/test/fogli/post_test.rb +18 -0
  45. data/test/fogli/user_test.rb +25 -0
  46. data/test/fogli/util/options_test.rb +38 -0
  47. data/test/fogli_test.rb +16 -0
  48. data/test/test_helper.rb +14 -0
  49. metadata +150 -0
@@ -0,0 +1,178 @@
1
+ require File.join(File.dirname(__FILE__), '..', 'test_helper')
2
+
3
+ class FacebookObjectTest < Test::Unit::TestCase
4
+ setup do
5
+ @klass = Fogli::FacebookObject
6
+ end
7
+
8
+ context "class methods" do
9
+ context "properties and connections" do
10
+ should "include the properties module" do
11
+ assert @klass.included_modules.include?(Fogli::FacebookObject::Properties)
12
+ end
13
+
14
+ should "have an id property" do
15
+ assert @klass.properties.keys.include?(:id)
16
+ end
17
+
18
+ should "have a updated_time property" do
19
+ assert @klass.properties.keys.include?(:updated_time)
20
+ end
21
+
22
+ should "propagate properties to subclasses" do
23
+ @subklass = Class.new(@klass)
24
+ assert @subklass.properties.keys.include?(:id)
25
+ end
26
+
27
+ should "propagate connections to subclasses" do
28
+ @klass.connection(:foo, :class => :bar)
29
+ @subklass = Class.new(@klass)
30
+ assert @subklass.connections.keys.include?(:foo)
31
+ @klass.connections.clear
32
+ end
33
+ end
34
+
35
+ context "finding" do
36
+ setup do
37
+ @klass.stubs(:get)
38
+ end
39
+
40
+ should "return an unloaded object immediately" do
41
+ result = @klass.find(:foo)
42
+ assert !result.loaded?
43
+ assert_equal :foo, result.id
44
+ end
45
+
46
+ should "be able to limit by fields" do
47
+ result = @klass.find(:foo, :fields => "name")
48
+ assert_equal [:name], result.instance_variable_get(:@_fields)
49
+ end
50
+ end
51
+
52
+ context "existence checking" do
53
+ should "only get the 'id' field" do
54
+ id = :foo
55
+ @klass.expects(:get).with("/#{id}", :fields => "id").once
56
+ assert @klass.exist?(id)
57
+ end
58
+
59
+ should "return false if an exception is raised" do
60
+ @klass.expects(:get).raises(Fogli::Exception.new("foo", "bar"))
61
+ assert !@klass.exist?(:foo)
62
+ end
63
+ end
64
+
65
+ context "initialization" do
66
+ should "be okay without any arguments" do
67
+ assert_nothing_raised {
68
+ @klass.new
69
+ }
70
+ end
71
+
72
+ should "populate properties if data is given" do
73
+ data = { "id" => "42" }
74
+ instance = @klass.new(data)
75
+ assert_equal data["id"], instance.id
76
+ end
77
+ end
78
+ end
79
+
80
+ context "with an instance" do
81
+ setup do
82
+ @instance = @klass.new
83
+ end
84
+
85
+ [:get, :post].each do |method|
86
+ should "prepend any #{method} requests with the ID" do
87
+ id = "foo"
88
+ RestClient.expects(method).with() do |url, other|
89
+ assert url =~ /\/foo\/bar$/, "Invalid URL: #{url}"
90
+ true
91
+ end
92
+
93
+ @instance.stubs(:id).returns(id)
94
+ @instance.send(method, "/bar")
95
+ end
96
+ end
97
+
98
+ context "deleting" do
99
+ should "post with the delete method" do
100
+ @instance.expects(:post).with(:method => :delete).once
101
+ @instance.delete
102
+ end
103
+ end
104
+
105
+ context "loading" do
106
+ setup do
107
+ @id = "foobar"
108
+ @data = {:id => @id}
109
+ @instance.stubs(:get).returns(@data)
110
+ end
111
+
112
+ should "store the raw data" do
113
+ @instance.load!
114
+ assert_equal @data, @instance._raw
115
+ end
116
+
117
+ should "get only the fields specified, if specified" do
118
+ instance = @klass.find(@id, :fields => [:a, :b, :c])
119
+ instance.stubs(:get).returns({})
120
+ instance.expects(:get).with(:fields => "a,b,c").once.returns({})
121
+ instance.load!
122
+ end
123
+
124
+ should "populate properties with the data" do
125
+ @instance.load!
126
+ assert_equal @id, @instance.id
127
+ end
128
+
129
+ should "mark as loaded" do
130
+ @instance.load!
131
+ assert @instance.loaded?
132
+ end
133
+
134
+ should "return the instance" do
135
+ assert_equal @instance, @instance.load!
136
+ end
137
+ end
138
+
139
+ context "existence checking" do
140
+ setup do
141
+ @instance.stubs(:load!)
142
+ end
143
+
144
+ should "return true if the load succeeded" do
145
+ assert @instance.exist?
146
+ end
147
+
148
+ should "return false if an exception is raised" do
149
+ @instance.expects(:load!).raises(Fogli::Exception.new(:foo, :bar))
150
+ assert !@instance.exist?
151
+ end
152
+ end
153
+
154
+ context "reading properties" do
155
+ setup do
156
+ @instance.stubs(:get).returns({})
157
+ end
158
+
159
+ should "not load if accessing id" do
160
+ assert !@instance.loaded?
161
+ @instance.expects(:load!).never
162
+ @instance.id
163
+ end
164
+
165
+ should "load on first property access" do
166
+ @instance.expects(:load!).once
167
+ @instance.updated_time
168
+ end
169
+
170
+ should "not load if loaded" do
171
+ @instance.load!
172
+ assert @instance.loaded?
173
+ @instance.expects(:load!).never
174
+ @instance.updated_time
175
+ end
176
+ end
177
+ end
178
+ end
@@ -0,0 +1,56 @@
1
+ require File.join(File.dirname(__FILE__), '..', 'test_helper')
2
+
3
+ class OAuthObjectTest < Test::Unit::TestCase
4
+ setup do
5
+ @klass = Fogli::OAuth
6
+ end
7
+
8
+ context "authorization URL" do
9
+ teardown do
10
+ Fogli.client_id = nil
11
+ Fogli.redirect_uri = nil
12
+ end
13
+
14
+ should "return the URL escape the URI" do
15
+ options = { :client_id => "foo", :redirect_uri => "bar baz" }
16
+ expected = @klass::AUTHORIZE_URI % ["foo", "bar+baz"]
17
+ assert_equal expected, @klass.authorize(options)
18
+ end
19
+
20
+ should "by default use the global client id and redirect uri" do
21
+ Fogli.client_id = "foo"
22
+ Fogli.redirect_uri = "bar"
23
+ expected = @klass::AUTHORIZE_URI % ["foo", "bar"]
24
+ assert_equal expected, @klass.authorize
25
+ end
26
+
27
+ should "allow scopes to be added to the authorization" do
28
+ options = {
29
+ :client_id => "foo",
30
+ :redirect_uri => "bar",
31
+ :scope => %w{a b c}
32
+ }
33
+ expected = @klass::AUTHORIZE_URI % ["foo", "bar"]
34
+ expected += "&scope=a,b,c"
35
+
36
+ assert_equal expected, @klass.authorize(options)
37
+ end
38
+ end
39
+
40
+ context "access token" do
41
+ teardown do
42
+ Fogli.client_id = nil
43
+ Fogli.client_secret = nil
44
+ end
45
+
46
+ should "by default use the global client ID and secret" do
47
+ Fogli.client_id = "foo"
48
+ Fogli.client_secret = "bar"
49
+ options = { :redirect_uri => "bar", :code => "baz" }
50
+ merged = options.merge({ :client_id => Fogli.client_id,
51
+ :client_secret => Fogli.client_secret })
52
+ @klass.expects(:get).with("/oauth/access_token", merged).returns("")
53
+ @klass.access_token(options)
54
+ end
55
+ end
56
+ end
@@ -0,0 +1,18 @@
1
+ require File.join(File.dirname(__FILE__), '..', 'test_helper')
2
+
3
+ class PostTest < Test::Unit::TestCase
4
+ setup do
5
+ @klass = Fogli::Post
6
+ @instance = @klass.new
7
+ end
8
+
9
+ should "be able to like a post" do
10
+ @instance.expects(:post).with("/likes").once
11
+ @instance.like!
12
+ end
13
+
14
+ should "be able to unlike a post" do
15
+ @instance.expects(:post).with("/likes", :method => :delete).once
16
+ @instance.unlike!
17
+ end
18
+ end
@@ -0,0 +1,25 @@
1
+ require File.join(File.dirname(__FILE__), '..', 'test_helper')
2
+
3
+ class UserTest < Test::Unit::TestCase
4
+ setup do
5
+ @klass = Fogli::User
6
+ end
7
+
8
+ context "checking authorization" do
9
+ setup do
10
+ # Don't want any HTTP calls going out
11
+ @object = Fogli::FacebookObject.new
12
+ @object.stubs(:load!)
13
+ @klass.stubs(:find).returns(@object)
14
+ end
15
+
16
+ should "return true if nothing is raised" do
17
+ assert @klass.authorized?
18
+ end
19
+
20
+ should "return false if an exception is raised" do
21
+ @object.expects(:load!).raises(Fogli::Exception.new("foo", "bar"))
22
+ assert !@klass.authorized?
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,38 @@
1
+ require File.join(File.dirname(__FILE__), '..', '..', 'test_helper')
2
+
3
+ class OptionsUtilTest < Test::Unit::TestCase
4
+ class OptionsUtilTestClass
5
+ include Fogli::Util::Options
6
+ end
7
+
8
+ setup do
9
+ @klass = OptionsUtilTestClass
10
+ @instance = @klass.new
11
+ end
12
+
13
+ should "remove unused keys" do
14
+ defaults = { :foo => :bar }
15
+ options = { :bar => :baz }
16
+ assert_equal Hash.new, @instance.verify_options(options, :valid_keys => [:foo])
17
+ end
18
+
19
+ should "merge in the defaults" do
20
+ defaults = { :foo => :bar, :bar => nil }
21
+ options = { :bar => :baz }
22
+ assert_equal defaults.merge(options), @instance.verify_options(options, :default => defaults)
23
+ end
24
+
25
+ should "error if required keys are missing" do
26
+ options = { :foo => :bar }
27
+ assert_raises(ArgumentError) {
28
+ @instance.verify_options(options, :required_keys => [:foo, :bar])
29
+ }
30
+ end
31
+
32
+ should "not error if the required keys aren't missing" do
33
+ options = { :foo => :bar }
34
+ assert_nothing_raised {
35
+ @instance.verify_options(options, :required_keys => [:foo])
36
+ }
37
+ end
38
+ end
@@ -0,0 +1,16 @@
1
+ require 'test_helper'
2
+
3
+ class FogliTest < Test::Unit::TestCase
4
+ context "config accessors" do
5
+ [:client_id, :client_secret, :access_token, :redirect_uri, :logger].each do |key|
6
+ should "be able to access and read #{key}" do
7
+ value = "foo#{key}"
8
+ Fogli.send("#{key}=", value)
9
+ assert_equal value, Fogli.send(key)
10
+
11
+ # Reset the value
12
+ Fogli.send("#{key}=", nil)
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,14 @@
1
+ begin
2
+ require File.expand_path('../.bundle/environment', __FILE__)
3
+ rescue LoadError
4
+ # Fallback on doing the resolve at runtime.
5
+ require "rubygems"
6
+ end
7
+
8
+ require File.join(File.dirname(__FILE__), '..', 'lib', 'fogli')
9
+ require 'contest'
10
+ require 'mocha'
11
+
12
+ class Test::Unit::TestCase
13
+ # For any global helpers.
14
+ end
metadata ADDED
@@ -0,0 +1,150 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: fogli
3
+ version: !ruby/object:Gem::Version
4
+ prerelease: false
5
+ segments:
6
+ - 0
7
+ - 1
8
+ - 0
9
+ version: 0.1.0
10
+ platform: ruby
11
+ authors:
12
+ - Mitchell Hashimoto
13
+ autorequire:
14
+ bindir: bin
15
+ cert_chain: []
16
+
17
+ date: 2010-06-08 00:00:00 -07:00
18
+ default_executable:
19
+ dependencies:
20
+ - !ruby/object:Gem::Dependency
21
+ name: rest-client
22
+ prerelease: false
23
+ requirement: &id001 !ruby/object:Gem::Requirement
24
+ requirements:
25
+ - - ~>
26
+ - !ruby/object:Gem::Version
27
+ segments:
28
+ - 1
29
+ - 5
30
+ - 1
31
+ version: 1.5.1
32
+ type: :runtime
33
+ version_requirements: *id001
34
+ - !ruby/object:Gem::Dependency
35
+ name: json_pure
36
+ prerelease: false
37
+ requirement: &id002 !ruby/object:Gem::Requirement
38
+ requirements:
39
+ - - ~>
40
+ - !ruby/object:Gem::Version
41
+ segments:
42
+ - 1
43
+ - 2
44
+ - 0
45
+ version: 1.2.0
46
+ type: :runtime
47
+ version_requirements: *id002
48
+ description: An efficient, simple, and intuitive Facebook Open Graph library.
49
+ email: mitchell.hashimoto@gmail.com
50
+ executables: []
51
+
52
+ extensions: []
53
+
54
+ extra_rdoc_files:
55
+ - LICENSE
56
+ - README.md
57
+ files:
58
+ - .gitignore
59
+ - Gemfile
60
+ - LICENSE
61
+ - README.md
62
+ - Rakefile
63
+ - VERSION
64
+ - examples/README.md
65
+ - examples/me/README.md
66
+ - examples/me/me.rb
67
+ - lib/fogli.rb
68
+ - lib/fogli/album.rb
69
+ - lib/fogli/categorized_object.rb
70
+ - lib/fogli/comment.rb
71
+ - lib/fogli/event.rb
72
+ - lib/fogli/exception.rb
73
+ - lib/fogli/facebook_graph.rb
74
+ - lib/fogli/facebook_object.rb
75
+ - lib/fogli/facebook_object/connection_proxy.rb
76
+ - lib/fogli/facebook_object/connection_scope.rb
77
+ - lib/fogli/facebook_object/connections.rb
78
+ - lib/fogli/facebook_object/properties.rb
79
+ - lib/fogli/facebook_object/scope_methods.rb
80
+ - lib/fogli/group.rb
81
+ - lib/fogli/link.rb
82
+ - lib/fogli/named_object.rb
83
+ - lib/fogli/note.rb
84
+ - lib/fogli/oauth.rb
85
+ - lib/fogli/page.rb
86
+ - lib/fogli/photo.rb
87
+ - lib/fogli/post.rb
88
+ - lib/fogli/status.rb
89
+ - lib/fogli/user.rb
90
+ - lib/fogli/util/module_attributes.rb
91
+ - lib/fogli/util/options.rb
92
+ - lib/fogli/video.rb
93
+ - test/fogli/facebook_graph_test.rb
94
+ - test/fogli/facebook_object/connection_proxy_test.rb
95
+ - test/fogli/facebook_object/connection_scope_test.rb
96
+ - test/fogli/facebook_object/connections_test.rb
97
+ - test/fogli/facebook_object/properties_test.rb
98
+ - test/fogli/facebook_object/scope_methods_test.rb
99
+ - test/fogli/facebook_object_test.rb
100
+ - test/fogli/oauth_test.rb
101
+ - test/fogli/post_test.rb
102
+ - test/fogli/user_test.rb
103
+ - test/fogli/util/options_test.rb
104
+ - test/fogli_test.rb
105
+ - test/test_helper.rb
106
+ has_rdoc: true
107
+ homepage: http://github.com/mitchellh/fogli
108
+ licenses: []
109
+
110
+ post_install_message:
111
+ rdoc_options:
112
+ - --charset=UTF-8
113
+ require_paths:
114
+ - lib
115
+ required_ruby_version: !ruby/object:Gem::Requirement
116
+ requirements:
117
+ - - ">="
118
+ - !ruby/object:Gem::Version
119
+ segments:
120
+ - 0
121
+ version: "0"
122
+ required_rubygems_version: !ruby/object:Gem::Requirement
123
+ requirements:
124
+ - - ">="
125
+ - !ruby/object:Gem::Version
126
+ segments:
127
+ - 0
128
+ version: "0"
129
+ requirements: []
130
+
131
+ rubyforge_project:
132
+ rubygems_version: 1.3.6
133
+ signing_key:
134
+ specification_version: 3
135
+ summary: An efficient, simple, and intuitive Facebook Open Graph library.
136
+ test_files:
137
+ - test/fogli/facebook_object/connection_proxy_test.rb
138
+ - test/fogli/facebook_object/scope_methods_test.rb
139
+ - test/fogli/facebook_object/connections_test.rb
140
+ - test/fogli/facebook_object/connection_scope_test.rb
141
+ - test/fogli/facebook_object/properties_test.rb
142
+ - test/fogli/user_test.rb
143
+ - test/fogli/oauth_test.rb
144
+ - test/fogli/post_test.rb
145
+ - test/fogli/facebook_graph_test.rb
146
+ - test/fogli/util/options_test.rb
147
+ - test/fogli/facebook_object_test.rb
148
+ - test/test_helper.rb
149
+ - test/fogli_test.rb
150
+ - examples/me/me.rb