hubba 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 9937213efe86ccdf1201342462c78ab41a5989ab
4
+ data.tar.gz: ebaa428b0f7ed4fcf42faacc3cf4246f49b82df6
5
+ SHA512:
6
+ metadata.gz: 09c25c8a5f786a22639e437905f0f44223ac5722bac018243a56ab830651f3b4c6592bef0c6738cc880e5da4f720b334eabb54c0ccf0aaa6af19cae1c2bcbd6b
7
+ data.tar.gz: cb1f795ea7fb06f1804f1cf40350635305d22a6d96e45a3242fd477054dbdf35f86a8d74b55c8ab2755721108e884ff0b6a8505d651836a8f1a95bf85b4d3967
@@ -0,0 +1,4 @@
1
+ ### 0.0.1 / 2015-11-10
2
+
3
+ * Everything is new. First release.
4
+
@@ -0,0 +1,13 @@
1
+ HISTORY.md
2
+ Manifest.txt
3
+ README.md
4
+ Rakefile
5
+ lib/hubba.rb
6
+ lib/hubba/cache.rb
7
+ lib/hubba/client.rb
8
+ lib/hubba/github.rb
9
+ lib/hubba/version.rb
10
+ test/cache/users~geraldb~orgs.json
11
+ test/cache/users~geraldb~repos.json
12
+ test/helper.rb
13
+ test/test_cache.rb
@@ -0,0 +1,20 @@
1
+ # hubba
2
+
3
+ hubba gem - (yet) another (lite) GitHub HTTP API client / library
4
+
5
+ * home :: [github.com/rubylibs/hubba](https://github.com/rubylibs/hubba)
6
+ * bugs :: [github.com/rubylibs/hubba/issues](https://github.com/rubylibs/hubba/issues)
7
+ * gem :: [rubygems.org/gems/hubba](https://rubygems.org/gems/hubba)
8
+ * rdoc :: [rubydoc.info/gems/hubba](http://rubydoc.info/gems/hubba)
9
+
10
+
11
+ ## Usage
12
+
13
+ TBD
14
+
15
+
16
+ ## License
17
+
18
+ The `hubba` scripts are dedicated to the public domain.
19
+ Use it as you please with no restrictions whatsoever.
20
+
@@ -0,0 +1,30 @@
1
+ require 'hoe'
2
+ require './lib/hubba/version.rb'
3
+
4
+ Hoe.spec 'hubba' do
5
+
6
+ self.version = Hubba::VERSION
7
+
8
+ self.summary = 'hubba - (yet) another (lite) GitHub HTTP API client / library'
9
+ self.description = summary
10
+
11
+ self.urls = ['https://github.com/rubylibs/hubba']
12
+
13
+ self.author = 'Gerald Bauer'
14
+ self.email = 'ruby-talk@ruby-lang.org'
15
+
16
+ # switch extension to .markdown for gihub formatting
17
+ self.readme_file = 'README.md'
18
+ self.history_file = 'HISTORY.md'
19
+
20
+ self.extra_deps = [
21
+ ['logutils' ],
22
+ ]
23
+
24
+ self.licenses = ['Public Domain']
25
+
26
+ self.spec_extras = {
27
+ required_ruby_version: '>= 1.9.2'
28
+ }
29
+
30
+ end
@@ -0,0 +1,23 @@
1
+ # encoding: utf-8
2
+
3
+ require 'net/http'
4
+ require "net/https"
5
+ require 'uri'
6
+
7
+ require 'pp'
8
+ require 'json'
9
+ require 'yaml'
10
+
11
+
12
+ # 3rd party gems/libs
13
+ require 'logutils'
14
+
15
+ # our own code
16
+ require 'hubba/version' # note: let version always go first
17
+ require 'hubba/cache'
18
+ require 'hubba/client'
19
+ require 'hubba/github'
20
+
21
+
22
+ # say hello
23
+ puts Hubba.banner if defined?($RUBYLIBS_DEBUG)
@@ -0,0 +1,61 @@
1
+ # encoding: utf-8
2
+
3
+ module Hubba
4
+
5
+ class Cache ## lets you work with GitHub api "offline" using just a local cache of stored json
6
+
7
+ def initialize( dir )
8
+ @dir = dir
9
+ end
10
+
11
+ ## fix/todo: cut of query string e.g. ?per_page=100 why? why not?
12
+ def get( request_uri )
13
+ ## check if request_uri exists in local cache
14
+ basename = request_uri_to_basename( request_uri )
15
+ path = "#{@dir}/#{basename}.json"
16
+ if File.exist?( path )
17
+ text = File.read( path ) ## todo/fix: use File.read_utf8
18
+ json = JSON.parse( text )
19
+ else
20
+ nil ## todo/fix: raise exception - why? why not??
21
+ end
22
+ end
23
+
24
+ def put( request_uri, obj )
25
+ basename = request_uri_to_basename( request_uri )
26
+ path = "#{@dir}/#{basename}.json"
27
+
28
+ if obj.is_a?( Resource ) ## note: for convenience support Resource obj too
29
+ data = obj.data
30
+ else
31
+ data = obj # assume Hash or Array -- todo: add support for String - why? why not??
32
+ end
33
+
34
+ File.open( path, 'w' ) do |f|
35
+ f.write JSON.pretty_generate( data )
36
+ end
37
+ end
38
+
39
+
40
+ def request_uri_to_basename( request_uri )
41
+ ## 1) cut off leading /
42
+ ## 2) convert / to ~
43
+ ## 3) remove (optional) query string (for now) - why? why not?
44
+ ##
45
+ ## e.g.
46
+ ## '/users/geraldb' => 'users~geraldb',
47
+ ## '/users/geraldb/repos' => 'users~geraldb~repos',
48
+ ## '/users/geraldb/orgs' => 'users~geraldb~orgs',
49
+ ## '/orgs/wikiscript/repos' => 'orgs~wikiscript~repos',
50
+ ## '/orgs/planetjekyll/repos' => 'orgs~planetjekyll~repos',
51
+ ## '/orgs/vienna-rb/repos' => 'orgs~vienna~rb.repos',
52
+
53
+ basename = request_uri[1..-1]
54
+ basename = basename.gsub( '/', '~')
55
+ basename = basename.sub( /\?.*\z/, '' ) ## note: must escape ? (use \z for $)
56
+ basename
57
+ end
58
+
59
+ end ## class Cache
60
+
61
+ end ## module Hubba
@@ -0,0 +1,46 @@
1
+ # encoding: utf-8
2
+
3
+ module Hubba
4
+
5
+
6
+ class Client
7
+
8
+ def initialize
9
+ uri = URI.parse( "https://api.github.com" )
10
+ @http = Net::HTTP.new(uri.host, uri.port)
11
+ @http.use_ssl = true
12
+ @http.verify_mode = OpenSSL::SSL::VERIFY_NONE
13
+ end # method initialize
14
+
15
+ def get( request_uri )
16
+ puts "GET #{request_uri}"
17
+
18
+ req = Net::HTTP::Get.new( request_uri )
19
+ ## req = Net::HTTP::Get.new( "/users/geraldb" )
20
+ ## req = Net::HTTP::Get.new( "/users/geraldb/repos" )
21
+ req["User-Agent"] = "ruby/github.rb" ## required by GitHub API
22
+ req["Accept" ] = "application/vnd.github.v3+json" ## recommend by GitHub API
23
+
24
+ res = @http.request(req)
25
+
26
+ # Get specific header
27
+ # response["content-type"]
28
+ # => "text/html; charset=UTF-8"
29
+
30
+ # Iterate all response headers.
31
+ res.each_header do |key, value|
32
+ p "#{key} => #{value}"
33
+ end
34
+ # => "location => http://www.google.com/"
35
+ # => "content-type => text/html; charset=UTF-8"
36
+ # ...
37
+
38
+ json = JSON.parse( res.body )
39
+ ## pp json
40
+ json
41
+ end # methdo get
42
+
43
+ end ## class Client
44
+
45
+
46
+ end # module Hubba
@@ -0,0 +1,83 @@
1
+ # encoding: utf-8
2
+
3
+ module Hubba
4
+
5
+ class Resource
6
+ attr_reader :data
7
+ def initialize( data )
8
+ @data = data
9
+ end
10
+ end
11
+
12
+ class Repos < Resource
13
+ def names
14
+ ## sort by name
15
+ data.map { |item| item['name'] }.sort
16
+ end
17
+ end
18
+
19
+ class Orgs < Resource
20
+ def logins
21
+ ## sort by name
22
+ data.map { |item| item['login'] }.sort
23
+ end
24
+ end
25
+
26
+
27
+
28
+ class Github
29
+
30
+ def initialize( cache_dir: './cache' )
31
+ @cache = Cache.new( cache_dir )
32
+ @client = Client.new
33
+
34
+ @offline = false
35
+ end
36
+
37
+ def offline!() @offline = true; end ## switch to offline - todo: find a "better" way - why? why not?
38
+ def offline?() @offline; end
39
+
40
+
41
+ def user( name )
42
+ Resource.new( get "/users/#{name}" )
43
+ end
44
+
45
+
46
+ def user_repos( name )
47
+ Repos.new( get "/users/#{name}/repos" ) ## add ?per_page=100 - why? why not?
48
+ end
49
+
50
+
51
+ ##
52
+ # note: pagination
53
+ # requests that return multiple items will be paginated to 30 items by default.
54
+ # You can specify further pages with the ?page parameter.
55
+ # For some resources, you can also set a custom page size up to 100
56
+ # with the ?per_page=100 parameter
57
+
58
+ def user_orgs( name )
59
+ Orgs.new( get "/users/#{name}/orgs?per_page=100" )
60
+ end
61
+
62
+
63
+ def org( name )
64
+ Resource.new( get "/orgs/#{name}" )
65
+ end
66
+
67
+ def org_repos( name )
68
+ Repos.new( get "/orgs/#{name}/repos?per_page=100" )
69
+ end
70
+
71
+
72
+ private
73
+ def get( request_uri )
74
+ if offline?
75
+ @cache.get( request_uri )
76
+ else
77
+ @client.get( request_uri )
78
+ end
79
+ end
80
+
81
+ end # class Github
82
+
83
+ end # module Hubba
@@ -0,0 +1,21 @@
1
+ # encoding: utf-8
2
+
3
+ module Hubba
4
+ MAJOR = 0 ## todo: namespace inside version or something - why? why not??
5
+ MINOR = 1
6
+ PATCH = 0
7
+ VERSION = [MAJOR,MINOR,PATCH].join('.')
8
+
9
+ def self.version
10
+ VERSION
11
+ end
12
+
13
+ def self.banner
14
+ "hubba/#{VERSION} on Ruby #{RUBY_VERSION} (#{RUBY_RELEASE_DATE}) [#{RUBY_PLATFORM}]"
15
+ end
16
+
17
+ def self.root
18
+ "#{File.expand_path( File.dirname(File.dirname(File.dirname(__FILE__))) )}"
19
+ end
20
+ end # module Hubba
21
+
@@ -0,0 +1,46 @@
1
+ [
2
+ {
3
+ "login": "vienna-rb",
4
+ "id": 3541331,
5
+ "url": "https://api.github.com/orgs/vienna-rb",
6
+ "repos_url": "https://api.github.com/orgs/vienna-rb/repos",
7
+ "events_url": "https://api.github.com/orgs/vienna-rb/events",
8
+ "members_url": "https://api.github.com/orgs/vienna-rb/members{/member}",
9
+ "public_members_url": "https://api.github.com/orgs/vienna-rb/public_members{/member}",
10
+ "avatar_url": "https://avatars.githubusercontent.com/u/3541331?v=3",
11
+ "description": null
12
+ },
13
+ {
14
+ "login": "openbeer",
15
+ "id": 4464191,
16
+ "url": "https://api.github.com/orgs/openbeer",
17
+ "repos_url": "https://api.github.com/orgs/openbeer/repos",
18
+ "events_url": "https://api.github.com/orgs/openbeer/events",
19
+ "members_url": "https://api.github.com/orgs/openbeer/members{/member}",
20
+ "public_members_url": "https://api.github.com/orgs/openbeer/public_members{/member}",
21
+ "avatar_url": "https://avatars.githubusercontent.com/u/4464191?v=3",
22
+ "description": "Open Public Domain Beer, Brewery n Brewpub Data - Incl. The Free World Beer Book"
23
+ },
24
+ {
25
+ "login": "slideshow-s9",
26
+ "id": 4464373,
27
+ "url": "https://api.github.com/orgs/slideshow-s9",
28
+ "repos_url": "https://api.github.com/orgs/slideshow-s9/repos",
29
+ "events_url": "https://api.github.com/orgs/slideshow-s9/events",
30
+ "members_url": "https://api.github.com/orgs/slideshow-s9/members{/member}",
31
+ "public_members_url": "https://api.github.com/orgs/slideshow-s9/public_members{/member}",
32
+ "avatar_url": "https://avatars.githubusercontent.com/u/4464373?v=3",
33
+ "description": "Free Web Alternative to PowerPoint and Keynote Using Easy-to-Write and Easy-to-Read Plain Text Wiki-Style Markup"
34
+ },
35
+ {
36
+ "login": "openfootball",
37
+ "id": 4477026,
38
+ "url": "https://api.github.com/orgs/openfootball",
39
+ "repos_url": "https://api.github.com/orgs/openfootball/repos",
40
+ "events_url": "https://api.github.com/orgs/openfootball/events",
41
+ "members_url": "https://api.github.com/orgs/openfootball/members{/member}",
42
+ "public_members_url": "https://api.github.com/orgs/openfootball/public_members{/member}",
43
+ "avatar_url": "https://avatars.githubusercontent.com/u/4477026?v=3",
44
+ "description": "Open Public Domain Football Data - Incl. The Free World Football Almanac"
45
+ }
46
+ ]
@@ -0,0 +1,263 @@
1
+ [
2
+ {
3
+ "id": 33192631,
4
+ "name": "austria",
5
+ "full_name": "geraldb/austria",
6
+ "owner": {
7
+ "login": "geraldb",
8
+ "id": 53281,
9
+ "avatar_url": "https://avatars.githubusercontent.com/u/53281?v=3",
10
+ "gravatar_id": "",
11
+ "url": "https://api.github.com/users/geraldb",
12
+ "html_url": "https://github.com/geraldb",
13
+ "followers_url": "https://api.github.com/users/geraldb/followers",
14
+ "following_url": "https://api.github.com/users/geraldb/following{/other_user}",
15
+ "gists_url": "https://api.github.com/users/geraldb/gists{/gist_id}",
16
+ "starred_url": "https://api.github.com/users/geraldb/starred{/owner}{/repo}",
17
+ "subscriptions_url": "https://api.github.com/users/geraldb/subscriptions",
18
+ "organizations_url": "https://api.github.com/users/geraldb/orgs",
19
+ "repos_url": "https://api.github.com/users/geraldb/repos",
20
+ "events_url": "https://api.github.com/users/geraldb/events{/privacy}",
21
+ "received_events_url": "https://api.github.com/users/geraldb/received_events",
22
+ "type": "User",
23
+ "site_admin": false
24
+ },
25
+ "private": false,
26
+ "html_url": "https://github.com/geraldb/austria",
27
+ "description": "open data and scripts for austria (österreich)",
28
+ "fork": false,
29
+ "url": "https://api.github.com/repos/geraldb/austria",
30
+ "forks_url": "https://api.github.com/repos/geraldb/austria/forks",
31
+ "keys_url": "https://api.github.com/repos/geraldb/austria/keys{/key_id}",
32
+ "collaborators_url": "https://api.github.com/repos/geraldb/austria/collaborators{/collaborator}",
33
+ "teams_url": "https://api.github.com/repos/geraldb/austria/teams",
34
+ "hooks_url": "https://api.github.com/repos/geraldb/austria/hooks",
35
+ "issue_events_url": "https://api.github.com/repos/geraldb/austria/issues/events{/number}",
36
+ "events_url": "https://api.github.com/repos/geraldb/austria/events",
37
+ "assignees_url": "https://api.github.com/repos/geraldb/austria/assignees{/user}",
38
+ "branches_url": "https://api.github.com/repos/geraldb/austria/branches{/branch}",
39
+ "tags_url": "https://api.github.com/repos/geraldb/austria/tags",
40
+ "blobs_url": "https://api.github.com/repos/geraldb/austria/git/blobs{/sha}",
41
+ "git_tags_url": "https://api.github.com/repos/geraldb/austria/git/tags{/sha}",
42
+ "git_refs_url": "https://api.github.com/repos/geraldb/austria/git/refs{/sha}",
43
+ "trees_url": "https://api.github.com/repos/geraldb/austria/git/trees{/sha}",
44
+ "statuses_url": "https://api.github.com/repos/geraldb/austria/statuses/{sha}",
45
+ "languages_url": "https://api.github.com/repos/geraldb/austria/languages",
46
+ "stargazers_url": "https://api.github.com/repos/geraldb/austria/stargazers",
47
+ "contributors_url": "https://api.github.com/repos/geraldb/austria/contributors",
48
+ "subscribers_url": "https://api.github.com/repos/geraldb/austria/subscribers",
49
+ "subscription_url": "https://api.github.com/repos/geraldb/austria/subscription",
50
+ "commits_url": "https://api.github.com/repos/geraldb/austria/commits{/sha}",
51
+ "git_commits_url": "https://api.github.com/repos/geraldb/austria/git/commits{/sha}",
52
+ "comments_url": "https://api.github.com/repos/geraldb/austria/comments{/number}",
53
+ "issue_comment_url": "https://api.github.com/repos/geraldb/austria/issues/comments{/number}",
54
+ "contents_url": "https://api.github.com/repos/geraldb/austria/contents/{+path}",
55
+ "compare_url": "https://api.github.com/repos/geraldb/austria/compare/{base}...{head}",
56
+ "merges_url": "https://api.github.com/repos/geraldb/austria/merges",
57
+ "archive_url": "https://api.github.com/repos/geraldb/austria/{archive_format}{/ref}",
58
+ "downloads_url": "https://api.github.com/repos/geraldb/austria/downloads",
59
+ "issues_url": "https://api.github.com/repos/geraldb/austria/issues{/number}",
60
+ "pulls_url": "https://api.github.com/repos/geraldb/austria/pulls{/number}",
61
+ "milestones_url": "https://api.github.com/repos/geraldb/austria/milestones{/number}",
62
+ "notifications_url": "https://api.github.com/repos/geraldb/austria/notifications{?since,all,participating}",
63
+ "labels_url": "https://api.github.com/repos/geraldb/austria/labels{/name}",
64
+ "releases_url": "https://api.github.com/repos/geraldb/austria/releases{/id}",
65
+ "created_at": "2015-03-31T15:16:05Z",
66
+ "updated_at": "2015-03-31T21:03:02Z",
67
+ "pushed_at": "2015-03-31T21:03:02Z",
68
+ "git_url": "git://github.com/geraldb/austria.git",
69
+ "ssh_url": "git@github.com:geraldb/austria.git",
70
+ "clone_url": "https://github.com/geraldb/austria.git",
71
+ "svn_url": "https://github.com/geraldb/austria",
72
+ "homepage": null,
73
+ "size": 552,
74
+ "stargazers_count": 1,
75
+ "watchers_count": 1,
76
+ "language": "Ruby",
77
+ "has_issues": true,
78
+ "has_downloads": true,
79
+ "has_wiki": false,
80
+ "has_pages": false,
81
+ "forks_count": 0,
82
+ "mirror_url": null,
83
+ "open_issues_count": 0,
84
+ "forks": 0,
85
+ "open_issues": 0,
86
+ "watchers": 1,
87
+ "default_branch": "master"
88
+ },
89
+ {
90
+ "id": 31158327,
91
+ "name": "auto",
92
+ "full_name": "geraldb/auto",
93
+ "owner": {
94
+ "login": "geraldb",
95
+ "id": 53281,
96
+ "avatar_url": "https://avatars.githubusercontent.com/u/53281?v=3",
97
+ "gravatar_id": "",
98
+ "url": "https://api.github.com/users/geraldb",
99
+ "html_url": "https://github.com/geraldb",
100
+ "followers_url": "https://api.github.com/users/geraldb/followers",
101
+ "following_url": "https://api.github.com/users/geraldb/following{/other_user}",
102
+ "gists_url": "https://api.github.com/users/geraldb/gists{/gist_id}",
103
+ "starred_url": "https://api.github.com/users/geraldb/starred{/owner}{/repo}",
104
+ "subscriptions_url": "https://api.github.com/users/geraldb/subscriptions",
105
+ "organizations_url": "https://api.github.com/users/geraldb/orgs",
106
+ "repos_url": "https://api.github.com/users/geraldb/repos",
107
+ "events_url": "https://api.github.com/users/geraldb/events{/privacy}",
108
+ "received_events_url": "https://api.github.com/users/geraldb/received_events",
109
+ "type": "User",
110
+ "site_admin": false
111
+ },
112
+ "private": false,
113
+ "html_url": "https://github.com/geraldb/auto",
114
+ "description": "auto - scripts to automate building databases, books, etc.",
115
+ "fork": false,
116
+ "url": "https://api.github.com/repos/geraldb/auto",
117
+ "forks_url": "https://api.github.com/repos/geraldb/auto/forks",
118
+ "keys_url": "https://api.github.com/repos/geraldb/auto/keys{/key_id}",
119
+ "collaborators_url": "https://api.github.com/repos/geraldb/auto/collaborators{/collaborator}",
120
+ "teams_url": "https://api.github.com/repos/geraldb/auto/teams",
121
+ "hooks_url": "https://api.github.com/repos/geraldb/auto/hooks",
122
+ "issue_events_url": "https://api.github.com/repos/geraldb/auto/issues/events{/number}",
123
+ "events_url": "https://api.github.com/repos/geraldb/auto/events",
124
+ "assignees_url": "https://api.github.com/repos/geraldb/auto/assignees{/user}",
125
+ "branches_url": "https://api.github.com/repos/geraldb/auto/branches{/branch}",
126
+ "tags_url": "https://api.github.com/repos/geraldb/auto/tags",
127
+ "blobs_url": "https://api.github.com/repos/geraldb/auto/git/blobs{/sha}",
128
+ "git_tags_url": "https://api.github.com/repos/geraldb/auto/git/tags{/sha}",
129
+ "git_refs_url": "https://api.github.com/repos/geraldb/auto/git/refs{/sha}",
130
+ "trees_url": "https://api.github.com/repos/geraldb/auto/git/trees{/sha}",
131
+ "statuses_url": "https://api.github.com/repos/geraldb/auto/statuses/{sha}",
132
+ "languages_url": "https://api.github.com/repos/geraldb/auto/languages",
133
+ "stargazers_url": "https://api.github.com/repos/geraldb/auto/stargazers",
134
+ "contributors_url": "https://api.github.com/repos/geraldb/auto/contributors",
135
+ "subscribers_url": "https://api.github.com/repos/geraldb/auto/subscribers",
136
+ "subscription_url": "https://api.github.com/repos/geraldb/auto/subscription",
137
+ "commits_url": "https://api.github.com/repos/geraldb/auto/commits{/sha}",
138
+ "git_commits_url": "https://api.github.com/repos/geraldb/auto/git/commits{/sha}",
139
+ "comments_url": "https://api.github.com/repos/geraldb/auto/comments{/number}",
140
+ "issue_comment_url": "https://api.github.com/repos/geraldb/auto/issues/comments{/number}",
141
+ "contents_url": "https://api.github.com/repos/geraldb/auto/contents/{+path}",
142
+ "compare_url": "https://api.github.com/repos/geraldb/auto/compare/{base}...{head}",
143
+ "merges_url": "https://api.github.com/repos/geraldb/auto/merges",
144
+ "archive_url": "https://api.github.com/repos/geraldb/auto/{archive_format}{/ref}",
145
+ "downloads_url": "https://api.github.com/repos/geraldb/auto/downloads",
146
+ "issues_url": "https://api.github.com/repos/geraldb/auto/issues{/number}",
147
+ "pulls_url": "https://api.github.com/repos/geraldb/auto/pulls{/number}",
148
+ "milestones_url": "https://api.github.com/repos/geraldb/auto/milestones{/number}",
149
+ "notifications_url": "https://api.github.com/repos/geraldb/auto/notifications{?since,all,participating}",
150
+ "labels_url": "https://api.github.com/repos/geraldb/auto/labels{/name}",
151
+ "releases_url": "https://api.github.com/repos/geraldb/auto/releases{/id}",
152
+ "created_at": "2015-02-22T09:27:17Z",
153
+ "updated_at": "2015-04-06T14:16:32Z",
154
+ "pushed_at": "2015-04-06T14:16:32Z",
155
+ "git_url": "git://github.com/geraldb/auto.git",
156
+ "ssh_url": "git@github.com:geraldb/auto.git",
157
+ "clone_url": "https://github.com/geraldb/auto.git",
158
+ "svn_url": "https://github.com/geraldb/auto",
159
+ "homepage": null,
160
+ "size": 288,
161
+ "stargazers_count": 1,
162
+ "watchers_count": 1,
163
+ "language": "Ruby",
164
+ "has_issues": true,
165
+ "has_downloads": true,
166
+ "has_wiki": false,
167
+ "has_pages": false,
168
+ "forks_count": 0,
169
+ "mirror_url": null,
170
+ "open_issues_count": 0,
171
+ "forks": 0,
172
+ "open_issues": 0,
173
+ "watchers": 1,
174
+ "default_branch": "master"
175
+ },
176
+ {
177
+ "id": 33404369,
178
+ "name": "backup",
179
+ "full_name": "geraldb/backup",
180
+ "owner": {
181
+ "login": "geraldb",
182
+ "id": 53281,
183
+ "avatar_url": "https://avatars.githubusercontent.com/u/53281?v=3",
184
+ "gravatar_id": "",
185
+ "url": "https://api.github.com/users/geraldb",
186
+ "html_url": "https://github.com/geraldb",
187
+ "followers_url": "https://api.github.com/users/geraldb/followers",
188
+ "following_url": "https://api.github.com/users/geraldb/following{/other_user}",
189
+ "gists_url": "https://api.github.com/users/geraldb/gists{/gist_id}",
190
+ "starred_url": "https://api.github.com/users/geraldb/starred{/owner}{/repo}",
191
+ "subscriptions_url": "https://api.github.com/users/geraldb/subscriptions",
192
+ "organizations_url": "https://api.github.com/users/geraldb/orgs",
193
+ "repos_url": "https://api.github.com/users/geraldb/repos",
194
+ "events_url": "https://api.github.com/users/geraldb/events{/privacy}",
195
+ "received_events_url": "https://api.github.com/users/geraldb/received_events",
196
+ "type": "User",
197
+ "site_admin": false
198
+ },
199
+ "private": false,
200
+ "html_url": "https://github.com/geraldb/backup",
201
+ "description": "backup - scripts to backup repos, etc.",
202
+ "fork": false,
203
+ "url": "https://api.github.com/repos/geraldb/backup",
204
+ "forks_url": "https://api.github.com/repos/geraldb/backup/forks",
205
+ "keys_url": "https://api.github.com/repos/geraldb/backup/keys{/key_id}",
206
+ "collaborators_url": "https://api.github.com/repos/geraldb/backup/collaborators{/collaborator}",
207
+ "teams_url": "https://api.github.com/repos/geraldb/backup/teams",
208
+ "hooks_url": "https://api.github.com/repos/geraldb/backup/hooks",
209
+ "issue_events_url": "https://api.github.com/repos/geraldb/backup/issues/events{/number}",
210
+ "events_url": "https://api.github.com/repos/geraldb/backup/events",
211
+ "assignees_url": "https://api.github.com/repos/geraldb/backup/assignees{/user}",
212
+ "branches_url": "https://api.github.com/repos/geraldb/backup/branches{/branch}",
213
+ "tags_url": "https://api.github.com/repos/geraldb/backup/tags",
214
+ "blobs_url": "https://api.github.com/repos/geraldb/backup/git/blobs{/sha}",
215
+ "git_tags_url": "https://api.github.com/repos/geraldb/backup/git/tags{/sha}",
216
+ "git_refs_url": "https://api.github.com/repos/geraldb/backup/git/refs{/sha}",
217
+ "trees_url": "https://api.github.com/repos/geraldb/backup/git/trees{/sha}",
218
+ "statuses_url": "https://api.github.com/repos/geraldb/backup/statuses/{sha}",
219
+ "languages_url": "https://api.github.com/repos/geraldb/backup/languages",
220
+ "stargazers_url": "https://api.github.com/repos/geraldb/backup/stargazers",
221
+ "contributors_url": "https://api.github.com/repos/geraldb/backup/contributors",
222
+ "subscribers_url": "https://api.github.com/repos/geraldb/backup/subscribers",
223
+ "subscription_url": "https://api.github.com/repos/geraldb/backup/subscription",
224
+ "commits_url": "https://api.github.com/repos/geraldb/backup/commits{/sha}",
225
+ "git_commits_url": "https://api.github.com/repos/geraldb/backup/git/commits{/sha}",
226
+ "comments_url": "https://api.github.com/repos/geraldb/backup/comments{/number}",
227
+ "issue_comment_url": "https://api.github.com/repos/geraldb/backup/issues/comments{/number}",
228
+ "contents_url": "https://api.github.com/repos/geraldb/backup/contents/{+path}",
229
+ "compare_url": "https://api.github.com/repos/geraldb/backup/compare/{base}...{head}",
230
+ "merges_url": "https://api.github.com/repos/geraldb/backup/merges",
231
+ "archive_url": "https://api.github.com/repos/geraldb/backup/{archive_format}{/ref}",
232
+ "downloads_url": "https://api.github.com/repos/geraldb/backup/downloads",
233
+ "issues_url": "https://api.github.com/repos/geraldb/backup/issues{/number}",
234
+ "pulls_url": "https://api.github.com/repos/geraldb/backup/pulls{/number}",
235
+ "milestones_url": "https://api.github.com/repos/geraldb/backup/milestones{/number}",
236
+ "notifications_url": "https://api.github.com/repos/geraldb/backup/notifications{?since,all,participating}",
237
+ "labels_url": "https://api.github.com/repos/geraldb/backup/labels{/name}",
238
+ "releases_url": "https://api.github.com/repos/geraldb/backup/releases{/id}",
239
+ "created_at": "2015-04-04T12:14:24Z",
240
+ "updated_at": "2015-06-28T11:55:10Z",
241
+ "pushed_at": "2015-11-10T08:58:28Z",
242
+ "git_url": "git://github.com/geraldb/backup.git",
243
+ "ssh_url": "git@github.com:geraldb/backup.git",
244
+ "clone_url": "https://github.com/geraldb/backup.git",
245
+ "svn_url": "https://github.com/geraldb/backup",
246
+ "homepage": null,
247
+ "size": 184,
248
+ "stargazers_count": 1,
249
+ "watchers_count": 1,
250
+ "language": "Ruby",
251
+ "has_issues": true,
252
+ "has_downloads": true,
253
+ "has_wiki": true,
254
+ "has_pages": false,
255
+ "forks_count": 0,
256
+ "mirror_url": null,
257
+ "open_issues_count": 0,
258
+ "forks": 0,
259
+ "open_issues": 0,
260
+ "watchers": 1,
261
+ "default_branch": "master"
262
+ }
263
+ ]
@@ -0,0 +1,9 @@
1
+ # encoding: utf-8
2
+
3
+ # minitest setup
4
+ require 'minitest/autorun'
5
+
6
+
7
+ ## our own code
8
+ require 'hubba'
9
+
@@ -0,0 +1,46 @@
1
+ # encoding: utf-8
2
+
3
+ ###
4
+ # to run use
5
+ # ruby -I ./lib -I ./test test/test_cache.rb
6
+
7
+
8
+ require 'helper'
9
+
10
+
11
+ class TestCache < MiniTest::Test
12
+
13
+ def setup
14
+ @cache = Hubba::Cache.new( "#{Hubba.root}/test/cache" )
15
+ end
16
+
17
+ def test_basename
18
+ mappings = [['/users/geraldb', 'users~geraldb'],
19
+ ['/users/geraldb/repos', 'users~geraldb~repos'],
20
+ ['/users/geraldb/repos?per_page=100', 'users~geraldb~repos'],
21
+ ['/users/geraldb/orgs', 'users~geraldb~orgs'],
22
+ ['/users/geraldb/orgs?per_page=100', 'users~geraldb~orgs'],
23
+ ['/orgs/wikiscript/repos', 'orgs~wikiscript~repos'],
24
+ ['/orgs/planetjekyll/repos', 'orgs~planetjekyll~repos'],
25
+ ['/orgs/vienna-rb/repos', 'orgs~vienna-rb~repos']]
26
+
27
+ mappings.each do |mapping|
28
+ assert_equal mapping[1], @cache.request_uri_to_basename( mapping[0] )
29
+ end
30
+ end # method test_basename
31
+
32
+ def test_cache
33
+ orgs = @cache.get( '/users/geraldb/orgs' )
34
+ assert_equal 4, orgs.size
35
+
36
+ repos = @cache.get( '/users/geraldb/repos' )
37
+ assert_equal 3, repos.size
38
+ end # method test_cache
39
+
40
+ def test_cache_miss
41
+ assert_equal nil, @cache.get( '/test/hello' )
42
+ assert_equal nil, @cache.get( '/test/hola' )
43
+ end # method test_cache_miss
44
+
45
+ end # class TestCache
46
+
metadata ADDED
@@ -0,0 +1,103 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: hubba
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Gerald Bauer
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2015-11-16 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: logutils
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rdoc
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '4.0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '4.0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: hoe
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '3.14'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '3.14'
55
+ description: hubba - (yet) another (lite) GitHub HTTP API client / library
56
+ email: ruby-talk@ruby-lang.org
57
+ executables: []
58
+ extensions: []
59
+ extra_rdoc_files:
60
+ - HISTORY.md
61
+ - Manifest.txt
62
+ - README.md
63
+ files:
64
+ - HISTORY.md
65
+ - Manifest.txt
66
+ - README.md
67
+ - Rakefile
68
+ - lib/hubba.rb
69
+ - lib/hubba/cache.rb
70
+ - lib/hubba/client.rb
71
+ - lib/hubba/github.rb
72
+ - lib/hubba/version.rb
73
+ - test/cache/users~geraldb~orgs.json
74
+ - test/cache/users~geraldb~repos.json
75
+ - test/helper.rb
76
+ - test/test_cache.rb
77
+ homepage: https://github.com/rubylibs/hubba
78
+ licenses:
79
+ - Public Domain
80
+ metadata: {}
81
+ post_install_message:
82
+ rdoc_options:
83
+ - "--main"
84
+ - README.md
85
+ require_paths:
86
+ - lib
87
+ required_ruby_version: !ruby/object:Gem::Requirement
88
+ requirements:
89
+ - - ">="
90
+ - !ruby/object:Gem::Version
91
+ version: 1.9.2
92
+ required_rubygems_version: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ requirements: []
98
+ rubyforge_project:
99
+ rubygems_version: 2.2.3
100
+ signing_key:
101
+ specification_version: 4
102
+ summary: hubba - (yet) another (lite) GitHub HTTP API client / library
103
+ test_files: []