Skip to content

Commit

Permalink
Set title and description in dev (#104)
Browse files Browse the repository at this point in the history
Merge pull request 104
  • Loading branch information
benbalter authored and jekyllbot committed Aug 7, 2017
1 parent f571d8c commit 6b53042
Show file tree
Hide file tree
Showing 13 changed files with 314 additions and 230 deletions.
2 changes: 2 additions & 0 deletions .rspec
@@ -0,0 +1,2 @@
--require spec_helper
--order random
4 changes: 4 additions & 0 deletions .rubocop.yml
Expand Up @@ -11,3 +11,7 @@ Metrics/LineLength:
Metrics/BlockLength:
Exclude:
- spec/**/*

Metrics/MethodLength:
Exclude:
- spec/**/
25 changes: 20 additions & 5 deletions lib/jekyll-github-metadata.rb
Expand Up @@ -18,25 +18,30 @@ module Errors
end

module GitHubMetadata
NoRepositoryError = Class.new(Jekyll::Errors::FatalException)

autoload :Client, "jekyll-github-metadata/client"
autoload :MetadataDrop, "jekyll-github-metadata/metadata_drop"
autoload :Pages, "jekyll-github-metadata/pages"
autoload :Repository, "jekyll-github-metadata/repository"
autoload :RepositoryFinder, "jekyll-github-metadata/repository_finder"
autoload :RepositoryCompat, "jekyll-github-metadata/repository_compat"
autoload :Sanitizer, "jekyll-github-metadata/sanitizer"
autoload :Value, "jekyll-github-metadata/value"
autoload :VERSION, "jekyll-github-metadata/version"

NoRepositoryError = RepositoryFinder::NoRepositoryError

if Jekyll.const_defined? :Site
require_relative "jekyll-github-metadata/site_github_munger"
end

class << self
attr_accessor :repository
attr_reader :repository_finder
attr_writer :client, :logger

def site
repository_finder.site
end

def environment
Jekyll.respond_to?(:env) ? Jekyll.env : (Pages.env || "development")
end
Expand All @@ -61,9 +66,19 @@ def client
@client ||= Client.new
end

def repository
@repository ||= GitHubMetadata::Repository.new(repository_finder.nwo).tap do |repo|
Jekyll::GitHubMetadata.log :debug, "Generating for #{repo.nwo}"
end
end

def site=(new_site)
reset!
@repository_finder = GitHubMetadata::RepositoryFinder.new(new_site)
end

def reset!
@logger = nil
@client = nil
@logger = @client = @repository = @nwo = @site = nil
end
end
end
Expand Down
86 changes: 12 additions & 74 deletions lib/jekyll-github-metadata/metadata_drop.rb
Expand Up @@ -8,11 +8,6 @@ class MetadataDrop < Jekyll::Drops::Drop

mutable true

def initialize(site)
@site = site
super(nil)
end

def to_s
require "json"
JSON.pretty_generate to_h
Expand All @@ -34,20 +29,7 @@ def keys
def_delegator :"Jekyll::GitHubMetadata::Pages", :api_url, :api_url
def_delegator :"Jekyll::GitHubMetadata::Pages", :help_url, :help_url

def versions
@versions ||= begin
require "github-pages"
GitHubPages.versions
rescue LoadError
{}
end
end

def build_revision
@build_revision ||= begin
ENV["JEKYLL_BUILD_REVISION"] || `git rev-parse HEAD`.strip
end
end
private def_delegator :"Jekyll::GitHubMetadata", :repository

def_delegator :repository, :owner_public_repositories, :public_repositories
def_delegator :repository, :organization_public_members, :organization_members
Expand Down Expand Up @@ -76,66 +58,22 @@ def build_revision
def_delegator :repository, :latest_release, :latest_release
def_delegator :repository, :private?, :private

private
attr_reader :site

def repository
@repository ||= GitHubMetadata::Repository.new(nwo(site)).tap do |repo|
Jekyll::GitHubMetadata.log :debug, "Generating for #{repo.nwo}"
def versions
@versions ||= begin
require "github-pages"
GitHubPages.versions
rescue LoadError
{}
end
end

def git_exe_path
ENV["PATH"].to_s.split(File::PATH_SEPARATOR).map { |path| File.join(path, "git") }.find { |path| File.exist?(path) }
end

def git_remotes
return [] if git_exe_path.nil?
`#{git_exe_path} remote --verbose`.to_s.strip.split("\n")
end

def git_remote_url
git_remotes.grep(%r!\Aorigin\t!).map do |remote|
remote.sub(%r!\Aorigin\t(.*) \([a-z]+\)!, "\\1")
end.uniq.first || ""
end

def nwo_from_git_origin_remote
return unless Jekyll.env == "development" || Jekyll.env == "test"
matches = git_remote_url.chomp(".git").match %r!github.com(:|/)([\w-]+)/([\w\.-]+)!
matches[2..3].join("/") if matches
end

def nwo_from_env
ENV["PAGES_REPO_NWO"]
end

def nwo_from_config(site)
repo = site.config["repository"]
repo if repo && repo.is_a?(String) && repo.include?("/")
def build_revision
@build_revision ||= begin
ENV["JEKYLL_BUILD_REVISION"] || `git rev-parse HEAD`.strip
end
end

# Public: fetches the repository name with owner to fetch metadata for.
# In order of precedence, this method uses:
# 1. the environment variable $PAGES_REPO_NWO
# 2. 'repository' variable in the site config
# 3. the 'origin' git remote's URL
#
# site - the Jekyll::Site being processed
#
# Return the name with owner (e.g. 'parkr/my-repo') or raises an
# error if one cannot be found.
def nwo(site)
nwo_from_env || \
nwo_from_config(site) || \
nwo_from_git_origin_remote || \
proc do
raise GitHubMetadata::NoRepositoryError, "No repo name found. " \
"Specify using PAGES_REPO_NWO environment variables, " \
"'repository' in your configuration, or set up an 'origin' " \
"git remote pointing to your github.com repository."
end.call
end
private

# Nothing to see here.
def fallback_data
Expand Down
71 changes: 71 additions & 0 deletions lib/jekyll-github-metadata/repository_finder.rb
@@ -0,0 +1,71 @@
module Jekyll
module GitHubMetadata
class RepositoryFinder
NoRepositoryError = Class.new(Jekyll::Errors::FatalException)

attr_reader :site
def initialize(site)
@site = site
end

# Public: fetches the repository name with owner to fetch metadata for.
# In order of precedence, this method uses:
# 1. the environment variable $PAGES_REPO_NWO
# 2. 'repository' variable in the site config
# 3. the 'origin' git remote's URL
#
# site - the Jekyll::Site being processed
#
# Return the name with owner (e.g. 'parkr/my-repo') or raises an
# error if one cannot be found.
def nwo
@nwo ||= begin
nwo_from_env || \
nwo_from_config || \
nwo_from_git_origin_remote || \
proc do
raise NoRepositoryError, "No repo name found. " \
"Specify using PAGES_REPO_NWO environment variables, " \
"'repository' in your configuration, or set up an 'origin' " \
"git remote pointing to your github.com repository."
end.call
end
end

private

def nwo_from_env
ENV["PAGES_REPO_NWO"]
end

def nwo_from_config
repo = site.config["repository"]
repo if repo && repo.is_a?(String) && repo.include?("/")
end

def git_exe_path
ENV["PATH"].to_s
.split(File::PATH_SEPARATOR)
.map { |path| File.join(path, "git") }
.find { |path| File.exist?(path) }
end

def git_remotes
return [] if git_exe_path.nil?
`#{git_exe_path} remote --verbose`.to_s.strip.split("\n")
end

def git_remote_url
git_remotes.grep(%r!\Aorigin\t!).map do |remote|
remote.sub(%r!\Aorigin\t(.*) \([a-z]+\)!, "\\1")
end.uniq.first || ""
end

def nwo_from_git_origin_remote
return unless Jekyll.env == "development" || Jekyll.env == "test"
matches = git_remote_url.chomp(".git").match %r!github.com(:|/)([\w-]+)/([\w\.-]+)!
matches[2..3].join("/") if matches
end
end
end
end
27 changes: 13 additions & 14 deletions lib/jekyll-github-metadata/site_github_munger.rb
Expand Up @@ -4,10 +4,13 @@
module Jekyll
module GitHubMetadata
class SiteGitHubMunger
attr_reader :site
extend Forwardable

def_delegators :"Jekyll::GitHubMetadata", :site
private def_delegator :"Jekyll::GitHubMetadata", :repository

def initialize(site)
@site = site
Jekyll::GitHubMetadata.site = site
end

def munge!
Expand All @@ -16,9 +19,8 @@ def munge!
# This is the good stuff.
site.config["github"] = github_namespace

return unless should_add_fallbacks?
add_url_and_baseurl_fallbacks!
add_title_and_description_fallbacks!
add_url_and_baseurl_fallbacks! if should_add_url_fallbacks?
end

private
Expand All @@ -35,13 +37,14 @@ def github_namespace
end

def drop
@drop ||= MetadataDrop.new(site)
@drop ||= MetadataDrop.new(GitHubMetadata.site)
end

# Set `site.url` and `site.baseurl` if unset.
def add_url_and_baseurl_fallbacks!
site.config["url"] ||= repository.url_without_path
site.config["baseurl"] = repository.baseurl if should_set_baseurl?
site.config["url"] ||= Value.new("url", proc { |_c, r| r.url_without_path })
return unless should_set_baseurl?
site.config["baseurl"] = Value.new("baseurl", proc { |_c, r| r.baseurl })
end

# Set the baseurl only if it is `nil` or `/`
Expand All @@ -51,17 +54,13 @@ def should_set_baseurl?
end

def add_title_and_description_fallbacks!
site.config["title"] ||= repository.name
site.config["description"] ||= repository.tagline
site.config["title"] ||= Value.new("title", proc { |_c, r| r.name })
site.config["description"] ||= Value.new("description", proc { |_c, r| r.tagline })
end

def should_add_fallbacks?
def should_add_url_fallbacks?
Jekyll.env == "production" || Pages.page_build?
end

def repository
drop.send(:repository)
end
end
end
end
Expand Down
54 changes: 24 additions & 30 deletions lib/jekyll-github-metadata/value.rb
Expand Up @@ -3,6 +3,9 @@
module Jekyll
module GitHubMetadata
class Value
extend Forwardable
def_delegators :render, :+, :to_s, :to_json, :eql?, :hash

attr_reader :key, :value

def initialize(*args)
Expand All @@ -19,48 +22,39 @@ def initialize(*args)
end

def render
@value = if @value.respond_to?(:call)
case @value.arity
when 0
@value.call
when 1
@value.call(GitHubMetadata.client)
when 2
@value.call(GitHubMetadata.client, GitHubMetadata.repository)
else
raise ArgumentError, "Whoa, arity of 0, 1, or 2 please in your procs."
end
else
@value
end
@value = Sanitizer.sanitize(@value)
return @rendered if defined? @rendered
@rendered = @value = Sanitizer.sanitize(call_or_value)
rescue RuntimeError, NameError => e
Jekyll::GitHubMetadata.log :error, "Error processing value '#{key}':"
raise e
end

def to_s
render.to_s
end

def to_json(*)
render.to_json
end

def to_liquid
case render
when nil
nil
when true, false
value
when Hash
value
when String, Numeric, Array
when nil, true, false, Hash, String, Numeric, Array
value
else
to_json
end
end

private

# Calls the value Proc with the appropriate number of arguments
# or returns the raw value if it's a literal
def call_or_value
return value unless value.respond_to?(:call)
case value.arity
when 0
value.call
when 1
value.call(GitHubMetadata.client)
when 2
value.call(GitHubMetadata.client, GitHubMetadata.repository)
else
raise ArgumentError, "Whoa, arity of 0, 1, or 2 please in your procs."
end
end
end
end
end

0 comments on commit 6b53042

Please sign in to comment.