Skip to content

Guide: Add a plugin authors guide to Yardoc #1

Description

@orta
# Lint markdown files inside your projects.
# This is done using the [proselint](http://proselint.com) python egg.
# Results are passed out as a table in markdown.
#
# @example Specifying custom CocoaPods installation options
#
#          # Runs a linter with comma style disabled
#          proselint.disable_linters = [“misc.scare_quotes”, "misc.tense_present"]
#          proselint.lint_files “_posts/*.md”
#
#          # Runs a linter with all styles, on modified and added markpown files in this PR
#          proselint.lint_files
#
# @see: artsy/artsy.github.io
# @tags: blogging, blog, writing, jekyll, middleman, hugo, metalsmith, gatsby, express
#
class DangerProselint < DangerPlugin

  # Allows you to disable a collection of linters from being ran.
  # You can get a list of [them here](https://github.com/amperser/proselint#checks)
  attr_accessor :disable_linters

  # Lints the globbed files, which can
  #
  # @param   [String] files
  #          A globbed string which should return the files that you want to lint, defaults to nil.
  #          if nil, modified and added files will be used.
  # @return  [void]
  #
  def lint_files(files=nil)
    # Installs a prose checker if needed
    system "pip install --user proselint" unless proselint_installed?

    # Check that this is in the user's PATH
    if `which proselint`.strip.empty?
      dangerfile.fail "proselint is not in the user's PATH, or it failed to install"
      return
    end

    # Either use files provided, or use the modified + added
    markdown_files = files ? Dir.glob(files) : (modified_files + added_files)
    markdown_files.select! do |line| (line.end_with?(".markdown") || line.end_with?(".md")) end

    require 'json'
    result_jsons = Hash[markdown_files.uniq.collect { |v| [v, JSON.parse(`proselint #{v} --json`.strip) ] }]
    proses = result_jsons.select { |path, prose| prose['data']['errors'].count }
    current_branch = env.request_source.pr_json["head"]["ref"]

    # We got some error reports back from proselint
    if proses.count > 0
      message = "### Proselint found issues\n\n"
      message << "_note_: Proselint is experimental in our process, it won't fail the build, or affect other PRs. It [may offer](http://proselint.com/approach/) some useful advice though though.\n\n"

      proses.each do |path, prose|
        github_loc = "/artsy/artsy.github.io/tree/#{current_branch}/#{path}"
        message << "#### [#{path}](#{github_loc})\n\n"

        message << "Line | Message | Severity |\n"
        message << "| --- | ----- | ----- |\n"

        prose["data"]["errors"].each do |error|
          message << "#{error['line']} | #{error['message']} | #{error['severity']}\n"
        end
      end

      markdown message
    end

    # Determine if proselint is currently installed in the system paths.
    # @return  [Bool]

    def proselint_installed?
      `which proselint`.strip.empty?
    end
  end

end

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Fields

    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions