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 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
@@ -0,0 +1,5 @@
1
+ module Jekyll
2
+ module GitHubMetadata
3
+ VERSION = '0.1.0'
4
+ end
5
+ 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: []