jekyll-github-metadata 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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: []