octopussy 0.2.3 → 0.2.4
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/octopussy.rb +5 -0
- data/lib/octopussy/client.rb +26 -3
- data/test/octopussy_test.rb +41 -2
- metadata +43 -83
- data/.document +0 -4
- data/.gitignore +0 -21
- data/LICENSE +0 -20
- data/README.markdown +0 -68
- data/Rakefile +0 -59
- data/VERSION +0 -1
- data/changelog.markdown +0 -30
- data/octopussy.gemspec +0 -105
- data/test/fixtures/blob.json +0 -10
- data/test/fixtures/branches.json +0 -6
- data/test/fixtures/close_issue.json +0 -1
- data/test/fixtures/collaborators.json +0 -1
- data/test/fixtures/comment.json +0 -1
- data/test/fixtures/contributors.json +0 -6
- data/test/fixtures/emails.json +0 -1
- data/test/fixtures/followers.json +0 -3
- data/test/fixtures/full_user.json +0 -27
- data/test/fixtures/issue.json +0 -14
- data/test/fixtures/issues.json +0 -50
- data/test/fixtures/keys.json +0 -1
- data/test/fixtures/labels.json +0 -1
- data/test/fixtures/languages.json +0 -1
- data/test/fixtures/list_branch_commits.json +0 -48
- data/test/fixtures/list_commits.json +0 -824
- data/test/fixtures/network.json +0 -26
- data/test/fixtures/network_data.json +0 -1
- data/test/fixtures/network_meta.json +0 -109
- data/test/fixtures/open_issue.json +0 -1
- data/test/fixtures/raw_git_data.json +0 -7
- data/test/fixtures/reopen_issue.json +0 -1
- data/test/fixtures/repo.json +0 -14
- data/test/fixtures/repo_search.json +0 -452
- data/test/fixtures/repos.json +0 -830
- data/test/fixtures/search.json +0 -44
- data/test/fixtures/show_commit.json +0 -37
- data/test/fixtures/tags.json +0 -8
- data/test/fixtures/trees.json +0 -140
- data/test/fixtures/user.json +0 -16
data/lib/octopussy.rb
CHANGED
@@ -13,6 +13,8 @@ require 'octopussy/client'
|
|
13
13
|
|
14
14
|
module Octopussy
|
15
15
|
extend SingleForwardable
|
16
|
+
|
17
|
+
VERSION = "0.2.4".freeze
|
16
18
|
|
17
19
|
class OctopussyError < StandardError
|
18
20
|
attr_reader :data
|
@@ -54,4 +56,7 @@ module Octopussy
|
|
54
56
|
|
55
57
|
# Commits
|
56
58
|
def_delegators :client, :list_commits, :commit
|
59
|
+
|
60
|
+
# Timeline
|
61
|
+
def_delegators :client, :public_timeline
|
57
62
|
end
|
data/lib/octopussy/client.rb
CHANGED
@@ -9,8 +9,15 @@ module Octopussy
|
|
9
9
|
|
10
10
|
# :login => 'pengwynn', :token => 'your_github_api_key'
|
11
11
|
def initialize(auth={})
|
12
|
-
|
13
|
-
|
12
|
+
if auth[:password].nil?
|
13
|
+
@login = auth[:login]
|
14
|
+
@token = auth[:token]
|
15
|
+
self.class.basic_auth(nil, nil)
|
16
|
+
else
|
17
|
+
@login = auth[:login]
|
18
|
+
self.class.basic_auth(@login, auth[:password])
|
19
|
+
end
|
20
|
+
|
14
21
|
end
|
15
22
|
|
16
23
|
def search_users(q)
|
@@ -345,10 +352,26 @@ module Octopussy
|
|
345
352
|
Hashie::Mash.new(response).commit
|
346
353
|
end
|
347
354
|
|
355
|
+
def public_timeline(username = nil)
|
356
|
+
username ||= @login
|
357
|
+
if username.nil?
|
358
|
+
path = "http://github.com/timeline.json"
|
359
|
+
else
|
360
|
+
path = "http://github.com/#{username}.json"
|
361
|
+
end
|
362
|
+
response = self.class.get(path)
|
363
|
+
response.map{|item| Hashie::Mash.new(item)}
|
364
|
+
end
|
365
|
+
|
366
|
+
def timeline
|
367
|
+
response = self.class.get("http://github.com/#{@login}.private.json", :query => auth_params)
|
368
|
+
response.map{|item| Hashie::Mash.new(item)}
|
369
|
+
end
|
370
|
+
|
348
371
|
private
|
349
372
|
|
350
373
|
def auth_params
|
351
|
-
@
|
374
|
+
@token.nil? ? {} : {:login => @login, :token => @token}
|
352
375
|
end
|
353
376
|
|
354
377
|
def self.get(*args); handle_response super end
|
data/test/octopussy_test.rb
CHANGED
@@ -6,6 +6,14 @@ class OctopussyTest < Test::Unit::TestCase
|
|
6
6
|
setup do
|
7
7
|
@client = Octopussy::Client.new(:login => 'pengwynn', :token => 'OU812')
|
8
8
|
end
|
9
|
+
|
10
|
+
should "authenticate via basic auth" do
|
11
|
+
stub_get("http://pengwynn:OU812@github.com/api/v2/json/user/show/pengwynn", "full_user.json")
|
12
|
+
client = Octopussy::Client.new(:login => 'pengwynn', :password => 'OU812')
|
13
|
+
user = client.user
|
14
|
+
user.plan.name.should == 'free'
|
15
|
+
user.plan.space.should == 307200
|
16
|
+
end
|
9
17
|
|
10
18
|
should "should search users" do
|
11
19
|
stub_get("/user/search/wynn", "search.json")
|
@@ -237,7 +245,19 @@ class OctopussyTest < Test::Unit::TestCase
|
|
237
245
|
collaborators.last.should == 'adamstac'
|
238
246
|
end
|
239
247
|
|
240
|
-
|
248
|
+
should "fetch a user's public timeline" do
|
249
|
+
stub_get("http://github.com/pengwynn.json", "timeline.json")
|
250
|
+
events = @client.public_timeline('pengwynn')
|
251
|
+
events.first['type'].should == 'FollowEvent'
|
252
|
+
events[1].repository.name.should == 'octopussy'
|
253
|
+
end
|
254
|
+
|
255
|
+
should "fetch a user's private timeline" do
|
256
|
+
stub_get("http://github.com/pengwynn.private.json?login=pengwynn&token=OU812", "timeline.json")
|
257
|
+
events = @client.timeline
|
258
|
+
events.first['type'].should == 'FollowEvent'
|
259
|
+
events[1].repository.name.should == 'octopussy'
|
260
|
+
end
|
241
261
|
end
|
242
262
|
|
243
263
|
|
@@ -393,7 +413,7 @@ class OctopussyTest < Test::Unit::TestCase
|
|
393
413
|
end
|
394
414
|
|
395
415
|
should "return the contents of a blob with the blob's SHA" do
|
396
|
-
stub_get("http://github.com/api/v2/yaml/blob/show/defunkt/facebox/4bf7a39e8c4ec54f8b4cd594a3616d69004aba69", "raw_git_data.
|
416
|
+
stub_get("http://github.com/api/v2/yaml/blob/show/defunkt/facebox/4bf7a39e8c4ec54f8b4cd594a3616d69004aba69", "raw_git_data.yaml")
|
397
417
|
raw_text = Octopussy.raw({:username => "defunkt", :repo => "facebox"}, "4bf7a39e8c4ec54f8b4cd594a3616d69004aba69")
|
398
418
|
assert raw_text.include?("cd13d9a61288dceb0a7aa73b55ed2fd019f4f1f7")
|
399
419
|
end
|
@@ -417,6 +437,22 @@ class OctopussyTest < Test::Unit::TestCase
|
|
417
437
|
show_commit = Octopussy.commit({:username => "defunkt", :repo => "facebox"}, sha)
|
418
438
|
assert show_commit.message == "Fixed CSS expression, throwing errors in IE6."
|
419
439
|
end
|
440
|
+
|
441
|
+
#timeline
|
442
|
+
|
443
|
+
should "fetch the public timeline" do
|
444
|
+
stub_get("http://github.com/timeline.json", "timeline.json")
|
445
|
+
events = Octopussy.public_timeline
|
446
|
+
events.first['type'].should == 'FollowEvent'
|
447
|
+
events[1].repository.name.should == 'octopussy'
|
448
|
+
end
|
449
|
+
|
450
|
+
should "fetch a user's public timeline" do
|
451
|
+
stub_get("http://github.com/pengwynn.json", "timeline.json")
|
452
|
+
events = Octopussy.public_timeline('pengwynn')
|
453
|
+
events.first['type'].should == 'FollowEvent'
|
454
|
+
events[1].repository.name.should == 'octopussy'
|
455
|
+
end
|
420
456
|
|
421
457
|
end
|
422
458
|
|
@@ -724,7 +760,10 @@ class OctopussyTest < Test::Unit::TestCase
|
|
724
760
|
event.event_type.should == 'download'
|
725
761
|
event.repo.name.should == 'prototype'
|
726
762
|
end
|
763
|
+
|
764
|
+
|
727
765
|
end
|
766
|
+
|
728
767
|
|
729
768
|
|
730
769
|
end
|
metadata
CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
|
|
5
5
|
segments:
|
6
6
|
- 0
|
7
7
|
- 2
|
8
|
-
-
|
9
|
-
version: 0.2.
|
8
|
+
- 4
|
9
|
+
version: 0.2.4
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- Wynn Netherland
|
@@ -15,13 +15,11 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2010-
|
18
|
+
date: 2010-08-07 00:00:00 -05:00
|
19
19
|
default_executable:
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|
22
|
-
|
23
|
-
prerelease: false
|
24
|
-
requirement: &id001 !ruby/object:Gem::Requirement
|
22
|
+
version_requirements: &id001 !ruby/object:Gem::Requirement
|
25
23
|
requirements:
|
26
24
|
- - ~>
|
27
25
|
- !ruby/object:Gem::Version
|
@@ -30,40 +28,40 @@ dependencies:
|
|
30
28
|
- 2
|
31
29
|
- 0
|
32
30
|
version: 0.2.0
|
31
|
+
name: hashie
|
32
|
+
prerelease: false
|
33
|
+
requirement: *id001
|
33
34
|
type: :runtime
|
34
|
-
version_requirements: *id001
|
35
35
|
- !ruby/object:Gem::Dependency
|
36
|
-
|
37
|
-
prerelease: false
|
38
|
-
requirement: &id002 !ruby/object:Gem::Requirement
|
36
|
+
version_requirements: &id002 !ruby/object:Gem::Requirement
|
39
37
|
requirements:
|
40
38
|
- - ~>
|
41
39
|
- !ruby/object:Gem::Version
|
42
40
|
segments:
|
43
41
|
- 0
|
44
|
-
- 4
|
45
42
|
- 5
|
46
|
-
|
43
|
+
- 2
|
44
|
+
version: 0.5.2
|
45
|
+
name: httparty
|
46
|
+
prerelease: false
|
47
|
+
requirement: *id002
|
47
48
|
type: :runtime
|
48
|
-
version_requirements: *id002
|
49
49
|
- !ruby/object:Gem::Dependency
|
50
|
-
|
51
|
-
prerelease: false
|
52
|
-
requirement: &id003 !ruby/object:Gem::Requirement
|
50
|
+
version_requirements: &id003 !ruby/object:Gem::Requirement
|
53
51
|
requirements:
|
54
|
-
- -
|
52
|
+
- - ~>
|
55
53
|
- !ruby/object:Gem::Version
|
56
54
|
segments:
|
57
55
|
- 2
|
58
56
|
- 10
|
59
|
-
-
|
60
|
-
version: 2.10.
|
57
|
+
- 0
|
58
|
+
version: 2.10.0
|
59
|
+
name: shoulda
|
60
|
+
prerelease: false
|
61
|
+
requirement: *id003
|
61
62
|
type: :development
|
62
|
-
version_requirements: *id003
|
63
63
|
- !ruby/object:Gem::Dependency
|
64
|
-
|
65
|
-
prerelease: false
|
66
|
-
requirement: &id004 !ruby/object:Gem::Requirement
|
64
|
+
version_requirements: &id004 !ruby/object:Gem::Requirement
|
67
65
|
requirements:
|
68
66
|
- - "="
|
69
67
|
- !ruby/object:Gem::Version
|
@@ -72,12 +70,12 @@ dependencies:
|
|
72
70
|
- 4
|
73
71
|
- 0
|
74
72
|
version: 0.4.0
|
73
|
+
name: jnunemaker-matchy
|
74
|
+
prerelease: false
|
75
|
+
requirement: *id004
|
75
76
|
type: :development
|
76
|
-
version_requirements: *id004
|
77
77
|
- !ruby/object:Gem::Dependency
|
78
|
-
|
79
|
-
prerelease: false
|
80
|
-
requirement: &id005 !ruby/object:Gem::Requirement
|
78
|
+
version_requirements: &id005 !ruby/object:Gem::Requirement
|
81
79
|
requirements:
|
82
80
|
- - ">="
|
83
81
|
- !ruby/object:Gem::Version
|
@@ -86,12 +84,12 @@ dependencies:
|
|
86
84
|
- 9
|
87
85
|
- 4
|
88
86
|
version: 0.9.4
|
87
|
+
name: mocha
|
88
|
+
prerelease: false
|
89
|
+
requirement: *id005
|
89
90
|
type: :development
|
90
|
-
version_requirements: *id005
|
91
91
|
- !ruby/object:Gem::Dependency
|
92
|
-
|
93
|
-
prerelease: false
|
94
|
-
requirement: &id006 !ruby/object:Gem::Requirement
|
92
|
+
version_requirements: &id006 !ruby/object:Gem::Requirement
|
95
93
|
requirements:
|
96
94
|
- - ">="
|
97
95
|
- !ruby/object:Gem::Version
|
@@ -100,70 +98,30 @@ dependencies:
|
|
100
98
|
- 2
|
101
99
|
- 5
|
102
100
|
version: 1.2.5
|
101
|
+
name: fakeweb
|
102
|
+
prerelease: false
|
103
|
+
requirement: *id006
|
103
104
|
type: :development
|
104
|
-
version_requirements: *id006
|
105
105
|
description: Simple wrapper for the GitHub API v2
|
106
106
|
email: wynn.netherland@gmail.com
|
107
107
|
executables: []
|
108
108
|
|
109
109
|
extensions: []
|
110
110
|
|
111
|
-
extra_rdoc_files:
|
112
|
-
|
113
|
-
- README.markdown
|
111
|
+
extra_rdoc_files: []
|
112
|
+
|
114
113
|
files:
|
115
|
-
- .document
|
116
|
-
- .gitignore
|
117
|
-
- LICENSE
|
118
|
-
- README.markdown
|
119
|
-
- Rakefile
|
120
|
-
- VERSION
|
121
|
-
- changelog.markdown
|
122
|
-
- lib/octopussy.rb
|
123
114
|
- lib/octopussy/client.rb
|
124
115
|
- lib/octopussy/event.rb
|
125
116
|
- lib/octopussy/repo.rb
|
126
|
-
- octopussy.
|
127
|
-
- test/fixtures/blob.json
|
128
|
-
- test/fixtures/branches.json
|
129
|
-
- test/fixtures/close_issue.json
|
130
|
-
- test/fixtures/collaborators.json
|
131
|
-
- test/fixtures/comment.json
|
132
|
-
- test/fixtures/contributors.json
|
133
|
-
- test/fixtures/emails.json
|
134
|
-
- test/fixtures/followers.json
|
135
|
-
- test/fixtures/full_user.json
|
136
|
-
- test/fixtures/issue.json
|
137
|
-
- test/fixtures/issues.json
|
138
|
-
- test/fixtures/keys.json
|
139
|
-
- test/fixtures/labels.json
|
140
|
-
- test/fixtures/languages.json
|
141
|
-
- test/fixtures/list_branch_commits.json
|
142
|
-
- test/fixtures/list_commits.json
|
143
|
-
- test/fixtures/network.json
|
144
|
-
- test/fixtures/network_data.json
|
145
|
-
- test/fixtures/network_meta.json
|
146
|
-
- test/fixtures/open_issue.json
|
147
|
-
- test/fixtures/raw_git_data.json
|
148
|
-
- test/fixtures/reopen_issue.json
|
149
|
-
- test/fixtures/repo.json
|
150
|
-
- test/fixtures/repo_search.json
|
151
|
-
- test/fixtures/repos.json
|
152
|
-
- test/fixtures/search.json
|
153
|
-
- test/fixtures/show_commit.json
|
154
|
-
- test/fixtures/tags.json
|
155
|
-
- test/fixtures/trees.json
|
156
|
-
- test/fixtures/user.json
|
157
|
-
- test/helper.rb
|
158
|
-
- test/octopussy_test.rb
|
159
|
-
- test/repo_test.rb
|
117
|
+
- lib/octopussy.rb
|
160
118
|
has_rdoc: true
|
161
|
-
homepage: http://wynnnetherland.com/projects/octopussy
|
119
|
+
homepage: http://wynnnetherland.com/projects/octopussy/
|
162
120
|
licenses: []
|
163
121
|
|
164
122
|
post_install_message:
|
165
|
-
rdoc_options:
|
166
|
-
|
123
|
+
rdoc_options: []
|
124
|
+
|
167
125
|
require_paths:
|
168
126
|
- lib
|
169
127
|
required_ruby_version: !ruby/object:Gem::Requirement
|
@@ -178,15 +136,17 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
178
136
|
- - ">="
|
179
137
|
- !ruby/object:Gem::Version
|
180
138
|
segments:
|
181
|
-
-
|
182
|
-
|
139
|
+
- 1
|
140
|
+
- 3
|
141
|
+
- 6
|
142
|
+
version: 1.3.6
|
183
143
|
requirements: []
|
184
144
|
|
185
145
|
rubyforge_project:
|
186
146
|
rubygems_version: 1.3.6
|
187
147
|
signing_key:
|
188
148
|
specification_version: 3
|
189
|
-
summary:
|
149
|
+
summary: Wrapper for the Octopussy API
|
190
150
|
test_files:
|
191
151
|
- test/helper.rb
|
192
152
|
- test/octopussy_test.rb
|
data/.document
DELETED
data/.gitignore
DELETED
data/LICENSE
DELETED
@@ -1,20 +0,0 @@
|
|
1
|
-
Copyright (c) 2009 Wynn Netherland
|
2
|
-
|
3
|
-
Permission is hereby granted, free of charge, to any person obtaining
|
4
|
-
a copy of this software and associated documentation files (the
|
5
|
-
"Software"), to deal in the Software without restriction, including
|
6
|
-
without limitation the rights to use, copy, modify, merge, publish,
|
7
|
-
distribute, sublicense, and/or sell copies of the Software, and to
|
8
|
-
permit persons to whom the Software is furnished to do so, subject to
|
9
|
-
the following conditions:
|
10
|
-
|
11
|
-
The above copyright notice and this permission notice shall be
|
12
|
-
included in all copies or substantial portions of the Software.
|
13
|
-
|
14
|
-
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
-
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
-
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
-
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
-
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
|
-
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
-
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.markdown
DELETED
@@ -1,68 +0,0 @@
|
|
1
|
-
# octopussy
|
2
|
-
|
3
|
-
<img src='http://upload.wikimedia.org/wikipedia/en/b/bb/007Octopussyposter.jpg' style='float: right; margin: 0 0 10px 10px'/>
|
4
|
-
|
5
|
-
Simple Ruby wrapper for the GitHub v2 API.
|
6
|
-
|
7
|
-
## Installation
|
8
|
-
|
9
|
-
sudo gem install octopussy
|
10
|
-
|
11
|
-
## Some examples
|
12
|
-
|
13
|
-
### Show a user
|
14
|
-
|
15
|
-
Octopussy.user('pengwynn')
|
16
|
-
=> <#Hashie::Mash blog="http://wynnnetherland.com" company="Orrka" created_at="2008/02/25 10:24:19 -0800" email="wynn.netherland@gmail.com" followers_count=21 following_count=55 id=865 location="Dallas, TX" login="pengwynn" name="Wynn Netherland" public_gist_count=4 public_repo_count=16>
|
17
|
-
|
18
|
-
### Show who a user follows
|
19
|
-
|
20
|
-
Octopussy.following('pengwynn')
|
21
|
-
=> ["cglee", "bryansray", "rails", "zachinglis", "wycats", "obie", "mully", "squeejee", "jderrett", "Shopify", "ReinH", "technoweenie", "errfree", "defunkt", "joshsusser", "hashrocket", "newbamboo", "bigtiger", "github", "jamis", "jeresig", "thoughtbot", "therealadam", "jnunemaker", "seaofclouds", "choan", "llimllib", "kwhinnery", "marshall", "handcrafted", "adamstac", "jashkenas", "dan", "remy", "hayesdavis", "documentcloud", "imathis", "mdeiters", "njonsson", "asenchi", "mattsa", "marclove", "webiest", "brogers", "polomasta", "stephp", "mchelen", "piyush", "davidnorth", "rmetzler", "jferris", "madrobby", "zh", "erikvold", "desandro"]
|
22
|
-
|
23
|
-
## Working with repositories
|
24
|
-
|
25
|
-
For convenience, methods that require a repo argument may be passed in any of the following forms
|
26
|
-
|
27
|
-
* "pengwynn/linked"
|
28
|
-
* {:username => 'pengwynn', :name => 'linkedin'}
|
29
|
-
* {:username => 'pengwynn', :repo => 'linkedin'}
|
30
|
-
* instance of Repo
|
31
|
-
|
32
|
-
### Show a repo
|
33
|
-
|
34
|
-
Octopussy.repo("pengwynn/linkedin")
|
35
|
-
=> <#Hashie::Mash description="Ruby wrapper for the LinkedIn API" fork=false forks=1 homepage="http://bit.ly/ruby-linkedin" name="linkedin" open_issues=2 owner="pengwynn" private=false url="http://github.com/pengwynn/linkedin" watchers=36>
|
36
|
-
|
37
|
-
## Authenticated requests
|
38
|
-
|
39
|
-
Some methods require authentication so you'll need to pass a login and an api_token. You can find your GitHub API token on your [account page](https://github.com/account)
|
40
|
-
|
41
|
-
client = Octopussy::Client.new(:login => 'pengwynn', :token => 'OU812')
|
42
|
-
client.follow!('adamstac')
|
43
|
-
|
44
|
-
Read the full [docs](http://rdoc.info/projects/pengwynn/octopussy) or check out the [examples](http://github.com/pengwynn/octopussy/tree/master/examples)
|
45
|
-
|
46
|
-
## TODO
|
47
|
-
|
48
|
-
* Feed parsing
|
49
|
-
* More examples
|
50
|
-
|
51
|
-
## Note on Patches/Pull Requests
|
52
|
-
|
53
|
-
* Fork the project.
|
54
|
-
* Make your feature addition or bug fix.
|
55
|
-
* Add tests for it. This is important so I don't break it in a
|
56
|
-
future version unintentionally.
|
57
|
-
* Commit, do not mess with rakefile, version, or history.
|
58
|
-
(if you want to have your own version, that is fine but
|
59
|
-
bump version in a commit by itself I can ignore when I pull)
|
60
|
-
* Send me a pull request. Bonus points for topic branches.
|
61
|
-
|
62
|
-
## Credits
|
63
|
-
|
64
|
-
Octopussy is inspired by [Octopi](http://github.com/fcoury/octopi) and aims to be a lightweight, less active-resourcey alternative.
|
65
|
-
|
66
|
-
## Copyright
|
67
|
-
|
68
|
-
Copyright (c) 2009 [Wynn Netherland](http://wynnnetherland.com), [Adam Stacoviak](http://adamstacoviak.com/). See LICENSE for details.
|