jekyll-github-metadata 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/lib/jekyll-github-metadata.rb +86 -0
- data/lib/jekyll-github-metadata/client.rb +52 -0
- data/lib/jekyll-github-metadata/ghp_metadata_generator.rb +12 -0
- data/lib/jekyll-github-metadata/pages.rb +23 -0
- data/lib/jekyll-github-metadata/repository.rb +119 -0
- data/lib/jekyll-github-metadata/sanitizer.rb +53 -0
- data/lib/jekyll-github-metadata/value.rb +48 -0
- data/lib/jekyll-github-metadata/version.rb +5 -0
- metadata +122 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 7118e76a45b88b13ed74056081b4f8c770afe7eb
|
4
|
+
data.tar.gz: 4c68fc503a1c8d070ec518af2c3cece4d21bd642
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 1f392cde09024155ffd90de399a77ff4a58b9ce9d631b25c07c42c0dad43efa649b620a2285eadc92f956a49a35a4d0efbaf34317568d321000e50e26d85a71d
|
7
|
+
data.tar.gz: 3347b15c29ebea89267d5388ae89b4b1be87a87b7f61e7686b69841a384389dea2df1818daaebc404508c5ca2696b49b7a9d091bb0bcf024401c03f43260ef4f
|
@@ -0,0 +1,86 @@
|
|
1
|
+
module Jekyll
|
2
|
+
module GitHubMetadata
|
3
|
+
autoload :Client, 'jekyll-github-metadata/client'
|
4
|
+
autoload :Pages, 'jekyll-github-metadata/pages'
|
5
|
+
autoload :Repository, 'jekyll-github-metadata/repository'
|
6
|
+
autoload :Sanitizer, 'jekyll-github-metadata/sanitizer'
|
7
|
+
autoload :Value, 'jekyll-github-metadata/value'
|
8
|
+
autoload :VERSION, 'jekyll-github-metadata/version'
|
9
|
+
|
10
|
+
class << self
|
11
|
+
attr_accessor :repository
|
12
|
+
|
13
|
+
def environment
|
14
|
+
Jekyll.env || Pages.env || 'development'
|
15
|
+
end
|
16
|
+
|
17
|
+
def client
|
18
|
+
@client ||= Client.new
|
19
|
+
end
|
20
|
+
|
21
|
+
def values
|
22
|
+
@values ||= Hash.new
|
23
|
+
end
|
24
|
+
|
25
|
+
def clear_values!
|
26
|
+
@values = Hash.new
|
27
|
+
end
|
28
|
+
|
29
|
+
def [](key)
|
30
|
+
values[key.to_s]
|
31
|
+
end
|
32
|
+
|
33
|
+
def to_h
|
34
|
+
values
|
35
|
+
end
|
36
|
+
|
37
|
+
def to_liquid
|
38
|
+
to_h
|
39
|
+
end
|
40
|
+
|
41
|
+
def register_value(key, value)
|
42
|
+
values[key.to_s] = Value.new(value)
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
# Environment-Specific
|
47
|
+
register_value('environment', proc { environment })
|
48
|
+
register_value('hostname', proc { Pages.github_url })
|
49
|
+
register_value('pages_hostname', proc { Pages.pages_hostname })
|
50
|
+
register_value('api_url', proc { Pages.api_url })
|
51
|
+
|
52
|
+
register_value('versions', proc {
|
53
|
+
begin
|
54
|
+
require 'github-pages'
|
55
|
+
GitHubPages.versions
|
56
|
+
rescue LoadError; Hash.new end
|
57
|
+
})
|
58
|
+
|
59
|
+
# The Juicy Stuff
|
60
|
+
register_value('public_repositories', proc { |c,r| c.list_repos(r.owner, "type" => "public") })
|
61
|
+
register_value('organization_members', proc { |c,r| c.organization_public_members(owner) if r.organization_repository? })
|
62
|
+
register_value('build_revision', proc { `git rev-parse HEAD`.strip })
|
63
|
+
register_value('project_title', proc { |_,r| r.name })
|
64
|
+
register_value('project_tagline', proc { |_,r| r.tagline })
|
65
|
+
register_value('owner_name', proc { |_,r| r.owner })
|
66
|
+
register_value('owner_url', proc { |_,r| r.owner_url })
|
67
|
+
register_value('owner_gravatar_url', proc { |_,r| r.owner_gravatar_url })
|
68
|
+
register_value('repository_url', proc { |_,r| r.repository_url })
|
69
|
+
register_value('repository_nwo', proc { |_,r| r.nwo })
|
70
|
+
register_value('repository_name', proc { |_,r| r.name})
|
71
|
+
register_value('zip_url', proc { |_,r| r.zip_url })
|
72
|
+
register_value('tar_url', proc { |_,r| r.tar_url })
|
73
|
+
register_value('clone_url', proc { |_,r| r.repo_clone_url })
|
74
|
+
register_value('releases_url', proc { |_,r| r.releases_url })
|
75
|
+
register_value('issues_url', proc { |_,r| r.issues_url })
|
76
|
+
register_value('wiki_url', proc { |_,r| r.wiki_url })
|
77
|
+
register_value('language', proc { |_,r| r.language })
|
78
|
+
register_value('is_user_page', proc { |_,r| r.user_page? })
|
79
|
+
register_value('is_project_page', proc { |_,r| r.project_page? })
|
80
|
+
register_value('show_downloads', proc { |_,r| r.show_downloads? })
|
81
|
+
register_value('url', proc { |_,r| r.pages_url })
|
82
|
+
register_value('contributors', proc { |c,r| c.contributors(r.nwo) })
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
require_relative 'jekyll-github-metadata/ghp_metadata_generator'
|
@@ -0,0 +1,52 @@
|
|
1
|
+
module Jekyll
|
2
|
+
module GitHubMetadata
|
3
|
+
class Client
|
4
|
+
def initialize(options = nil)
|
5
|
+
require 'octokit'
|
6
|
+
@client = build_octokit_client(options)
|
7
|
+
end
|
8
|
+
|
9
|
+
def safe_require(gem_name)
|
10
|
+
require gem_name
|
11
|
+
true
|
12
|
+
rescue LoadError
|
13
|
+
false
|
14
|
+
end
|
15
|
+
|
16
|
+
def build_octokit_client(options = nil)
|
17
|
+
options = options || Hash.new
|
18
|
+
if ENV['JEKYLL_GITHUB_TOKEN']
|
19
|
+
options.merge!(:access_token => ENV['JEKYLL_GITHUB_TOKEN'])
|
20
|
+
elsif File.exist?(File.join(ENV['HOME'], '.netrc')) && safe_require('netrc')
|
21
|
+
options.merge!(:netrc => true)
|
22
|
+
else
|
23
|
+
Jekyll.logger.warn "GitHubMetadata:", "No GitHub API authentication could be found." +
|
24
|
+
" Some fields may be missing or have incorrect data."
|
25
|
+
end
|
26
|
+
Octokit::Client.new(options)
|
27
|
+
end
|
28
|
+
|
29
|
+
def method_missing(meth, *args, &block)
|
30
|
+
if @client.respond_to?(meth)
|
31
|
+
instance_variable_get(:"@#{meth}") ||
|
32
|
+
instance_variable_set(:"@#{meth}", save_from_errors { @client.send(meth, *args, &block) })
|
33
|
+
else
|
34
|
+
super(meth, *args, &block)
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
def save_from_errors(default = false, &block)
|
39
|
+
if block.arity == 1
|
40
|
+
block.call(@client)
|
41
|
+
else
|
42
|
+
block.call
|
43
|
+
end
|
44
|
+
rescue Faraday::Error::ConnectionFailed,
|
45
|
+
Octokit::NotFound,
|
46
|
+
Octokit::Unauthorized,
|
47
|
+
Octokit::TooManyRequests
|
48
|
+
default
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
require 'jekyll'
|
2
|
+
|
3
|
+
module Jekyll
|
4
|
+
module GitHubMetadata
|
5
|
+
class GHPMetadataGenerator < Jekyll::Generator
|
6
|
+
def generate(site)
|
7
|
+
GitHubMetadata.repository = GitHubMetadata::Repository.new(site.config.fetch('repository'))
|
8
|
+
site.config['github'] = GitHubMetadata.to_liquid
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module Jekyll
|
2
|
+
module GitHubMetadata
|
3
|
+
class Pages
|
4
|
+
class << self
|
5
|
+
def env
|
6
|
+
ENV.fetch('PAGES_ENV', 'dotcom')
|
7
|
+
end
|
8
|
+
|
9
|
+
def api_url
|
10
|
+
'https://api.github.com'
|
11
|
+
end
|
12
|
+
|
13
|
+
def github_url
|
14
|
+
'github.com'
|
15
|
+
end
|
16
|
+
|
17
|
+
def pages_hostname
|
18
|
+
'github.io'
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,119 @@
|
|
1
|
+
module Jekyll
|
2
|
+
module GitHubMetadata
|
3
|
+
class Repository
|
4
|
+
attr_reader :nwo, :owner, :name
|
5
|
+
def initialize(name_with_owner)
|
6
|
+
@nwo = name_with_owner
|
7
|
+
@owner = nwo.split("/").first
|
8
|
+
@name = nwo.split("/").last
|
9
|
+
end
|
10
|
+
|
11
|
+
def organization_repository?
|
12
|
+
!!GitHubMetadata.client.organization(owner)
|
13
|
+
end
|
14
|
+
|
15
|
+
def git_ref
|
16
|
+
user_page? ? 'master' : 'gh-pages'
|
17
|
+
end
|
18
|
+
|
19
|
+
def repo_info
|
20
|
+
@repo_into ||= (Value.new(proc { |c| c.repository(nwo) }).render || Hash.new)
|
21
|
+
end
|
22
|
+
|
23
|
+
def language
|
24
|
+
repo_info["language"]
|
25
|
+
end
|
26
|
+
|
27
|
+
def tagline
|
28
|
+
repo_info["description"]
|
29
|
+
end
|
30
|
+
|
31
|
+
def owner_url
|
32
|
+
"#{Pages.github_url}/#{owner}"
|
33
|
+
end
|
34
|
+
|
35
|
+
def owner_gravatar_url
|
36
|
+
"#{owner_url}.png"
|
37
|
+
end
|
38
|
+
|
39
|
+
def repo_clone_url
|
40
|
+
"#{repository_url}.git"
|
41
|
+
end
|
42
|
+
|
43
|
+
def repository_url
|
44
|
+
"#{Pages.github_url}/#{nwo}"
|
45
|
+
end
|
46
|
+
|
47
|
+
def zip_url
|
48
|
+
"#{repository_url}/zipball/#{git_ref}"
|
49
|
+
end
|
50
|
+
|
51
|
+
def tar_url
|
52
|
+
"#{repository_url}/tarball/#{git_ref}"
|
53
|
+
end
|
54
|
+
|
55
|
+
def releases_url
|
56
|
+
"#{repository_url}/releases"
|
57
|
+
end
|
58
|
+
|
59
|
+
def issues_url
|
60
|
+
"#{repository_url}/issues" if repo_info["has_issues"]
|
61
|
+
end
|
62
|
+
|
63
|
+
def wiki_url
|
64
|
+
"#{repository_url}/wiki" if repo_info["has_wiki"]
|
65
|
+
end
|
66
|
+
|
67
|
+
def show_downloads?
|
68
|
+
!!repo_info["has_downloads"]
|
69
|
+
end
|
70
|
+
|
71
|
+
def user_page?
|
72
|
+
primary?
|
73
|
+
end
|
74
|
+
|
75
|
+
def project_page?
|
76
|
+
!primary?
|
77
|
+
end
|
78
|
+
|
79
|
+
def primary?
|
80
|
+
user_page_domains.include? name.downcase
|
81
|
+
end
|
82
|
+
|
83
|
+
def github_repo?
|
84
|
+
owner.eql?('github')
|
85
|
+
end
|
86
|
+
|
87
|
+
def default_user_domain
|
88
|
+
if github_repo?
|
89
|
+
"#{owner}.#{Pages.github_hostname}".downcase
|
90
|
+
else
|
91
|
+
"#{owner}.#{Pages.pages_hostname}".downcase
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
def user_page_domains
|
96
|
+
[
|
97
|
+
default_user_domain,
|
98
|
+
"#{owner}.github.com".downcase # legacy
|
99
|
+
]
|
100
|
+
end
|
101
|
+
|
102
|
+
def pages_url
|
103
|
+
if cname || primary?
|
104
|
+
"http://#{domain}"
|
105
|
+
else
|
106
|
+
File.join("http://#{domain}", name)
|
107
|
+
end
|
108
|
+
end
|
109
|
+
|
110
|
+
def cname
|
111
|
+
@cname ||= (Value.new(proc { |c| c.pages(nwo) }).render || {'cname' => nil})['cname']
|
112
|
+
end
|
113
|
+
|
114
|
+
def domain
|
115
|
+
cname || default_user_domain
|
116
|
+
end
|
117
|
+
end
|
118
|
+
end
|
119
|
+
end
|
@@ -0,0 +1,53 @@
|
|
1
|
+
module Jekyll
|
2
|
+
module GitHubMetadata
|
3
|
+
module Sanitizer
|
4
|
+
extend self
|
5
|
+
# Sanitize an object.
|
6
|
+
# When the resource is either `false`, `true`, `nil` or a number,
|
7
|
+
# it returns the resource as-is. When the resource is an array,
|
8
|
+
# it maps over the entire array, sanitizing each of its values.
|
9
|
+
# When the resource responds to the #to_hash method, it returns
|
10
|
+
# the value of #sanitize_resource (see below). If none of the
|
11
|
+
# aforementioned conditions are met, the return value of #to_s
|
12
|
+
# is used.
|
13
|
+
#
|
14
|
+
# resource - an Object
|
15
|
+
#
|
16
|
+
# Returns the sanitized resource.
|
17
|
+
def sanitize(resource)
|
18
|
+
case resource
|
19
|
+
when Array
|
20
|
+
resource.map { |item| sanitize(item) }
|
21
|
+
when Numeric
|
22
|
+
resource
|
23
|
+
when FalseClass
|
24
|
+
false
|
25
|
+
when TrueClass
|
26
|
+
true
|
27
|
+
when NilClass
|
28
|
+
nil
|
29
|
+
else
|
30
|
+
if resource.respond_to?(:to_hash)
|
31
|
+
sanitize_resource(resource)
|
32
|
+
else
|
33
|
+
resource.to_s
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
# Sanitize the Sawyer Resource or Hash
|
39
|
+
# Note: the object must respond to :to_hash for this to work.
|
40
|
+
# Consider using #sanitize instead of this method directly.
|
41
|
+
#
|
42
|
+
# resource - an Object which responds to :to_hash
|
43
|
+
#
|
44
|
+
# Returns the sanitized sawyer resource or hash as a hash.
|
45
|
+
def sanitize_resource(resource)
|
46
|
+
resource.to_hash.inject({}) do |result, (k, v)|
|
47
|
+
result[k.to_s] = sanitize(v)
|
48
|
+
result
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
require 'json'
|
2
|
+
|
3
|
+
module Jekyll
|
4
|
+
module GitHubMetadata
|
5
|
+
class Value
|
6
|
+
attr_reader :value
|
7
|
+
|
8
|
+
def initialize(value)
|
9
|
+
@value = value
|
10
|
+
end
|
11
|
+
|
12
|
+
def render
|
13
|
+
@value = if @value.respond_to?(:call)
|
14
|
+
case @value.arity
|
15
|
+
when 0
|
16
|
+
@value.call
|
17
|
+
when 1
|
18
|
+
@value.call(GitHubMetadata.client)
|
19
|
+
when 2
|
20
|
+
@value.call(GitHubMetadata.client, GitHubMetadata.repository)
|
21
|
+
else
|
22
|
+
raise ArgumentError.new("Whoa, arity of 0, 1, or 2 please in your procs.")
|
23
|
+
end
|
24
|
+
else
|
25
|
+
@value
|
26
|
+
end
|
27
|
+
@value = Sanitizer.sanitize(@value)
|
28
|
+
end
|
29
|
+
|
30
|
+
def to_s
|
31
|
+
render.to_s
|
32
|
+
end
|
33
|
+
|
34
|
+
def to_json(*)
|
35
|
+
render.to_json
|
36
|
+
end
|
37
|
+
|
38
|
+
def to_liquid
|
39
|
+
case render
|
40
|
+
when String, Numeric, Array
|
41
|
+
render
|
42
|
+
else
|
43
|
+
to_json
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
metadata
ADDED
@@ -0,0 +1,122 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: jekyll-github-metadata
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Parker Moore
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2014-09-20 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: octokit
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '3.3'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '3.3'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: bundler
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '1.5'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '1.5'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: rake
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: rspec
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: jekyll
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - "~>"
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '2.0'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - "~>"
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '2.0'
|
83
|
+
description:
|
84
|
+
email:
|
85
|
+
- parkrmoore@gmail.com
|
86
|
+
executables: []
|
87
|
+
extensions: []
|
88
|
+
extra_rdoc_files: []
|
89
|
+
files:
|
90
|
+
- lib/jekyll-github-metadata.rb
|
91
|
+
- lib/jekyll-github-metadata/client.rb
|
92
|
+
- lib/jekyll-github-metadata/ghp_metadata_generator.rb
|
93
|
+
- lib/jekyll-github-metadata/pages.rb
|
94
|
+
- lib/jekyll-github-metadata/repository.rb
|
95
|
+
- lib/jekyll-github-metadata/sanitizer.rb
|
96
|
+
- lib/jekyll-github-metadata/value.rb
|
97
|
+
- lib/jekyll-github-metadata/version.rb
|
98
|
+
homepage: https://github.com/parkr/github-metadata
|
99
|
+
licenses:
|
100
|
+
- MIT
|
101
|
+
metadata: {}
|
102
|
+
post_install_message:
|
103
|
+
rdoc_options: []
|
104
|
+
require_paths:
|
105
|
+
- lib
|
106
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - ">="
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '0'
|
111
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
112
|
+
requirements:
|
113
|
+
- - ">="
|
114
|
+
- !ruby/object:Gem::Version
|
115
|
+
version: '0'
|
116
|
+
requirements: []
|
117
|
+
rubyforge_project:
|
118
|
+
rubygems_version: 2.2.2
|
119
|
+
signing_key:
|
120
|
+
specification_version: 4
|
121
|
+
summary: The site.github namespace
|
122
|
+
test_files: []
|