Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add linter, doctests #63

Draft
wants to merge 4 commits into
base: master
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .JuliaFormatter.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
style = "sciml"
3 changes: 3 additions & 0 deletions .dev/Project.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
[deps]
Git = "d7ba0133-e1db-5d97-8f8c-041e4b3a1eb2"
JuliaFormatter = "98e50ef6-434e-11e9-1051-2b60c6c9e899"
70 changes: 70 additions & 0 deletions .dev/herb_format.jl
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
"""
Formatting script inspired by that of the `Flux.jl` package, which
can be found at:
https://github.com/FluxML/Flux.jl/blob/caa1ceef9cf59bd817b7bf5c94d0ffbec5a0f32c/dev/flux_format.jl
"""

using Pkg
Pkg.activate(@__DIR__)
Pkg.instantiate()

using JuliaFormatter

help = """
Usage: herb_format [flags] [FILE/PATH]...
Formats the given julia files using the Herb formatting options.
If paths are given instead, it will format all *.jl files under
the paths. If nothing is given, all changed julia files are formatted.
-v, --verbose
Print the name of the files being formatted with relevant details.
-h, --help
Print this help message.
--check
Check if the files are formatted without changing them.
"""

options = Dict{Symbol, Bool}()
indices_to_remove = [] # used to delete options once processed

for (index, arg) in enumerate(ARGS)
if arg[1] != '-'
continue
end
val = true
if arg in ["-v", "--verbose"]
opt = :verbose
push!(indices_to_remove, index)
elseif arg in ["-h", "--help"]
opt = :help
push!(indices_to_remove, index)
elseif arg == "--check"
opt = :overwrite
val = false
write(stdout, "Checking files.\n")
push!(indices_to_remove, index)
else
error("Option $arg is not supported.")
end
options[opt] = val
end

# remove options from args
deleteat!(ARGS, indices_to_remove)

# print help message if asked
if haskey(options, :help)
write(stdout, help)
exit(0)
end

# otherwise format files
if isempty(ARGS)
filenames = readlines(`git ls-files "*.jl"`)
else
filenames = ARGS
end

write(stdout, "Formatting in progress.\n")
# format returns true if the files were already formatted
# and false if they were not (had to be formatted)
exit(format(filenames; options...) ? 0 : 1)
20 changes: 20 additions & 0 deletions .dev/setup.jl
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
"""
Dev environment setup script inspired by that of the `Flux.jl` package, which
can be found at:
https://github.com/FluxML/Flux.jl/blob/caa1ceef9cf59bd817b7bf5c94d0ffbec5a0f32c/dev/setup.jl
"""

# instantiate the environment
using Pkg
Pkg.activate(@__DIR__)
Pkg.instantiate()

# setup the custom git hook
using Git

# set the local hooks path
const git = Git.git()
run(`$git config --local core.hooksPath .githooks/`)

# set file permission for hook
Base.Filesystem.chmod(".githooks", 0o777; recursive = true)
2 changes: 2 additions & 0 deletions .git-blame-ignore-revs
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
# Migrate code style to SciML
4a4aaf91ac34c1c0eda650be5a5031432594773a
19 changes: 19 additions & 0 deletions .githooks/pre-commit
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
#!/usr/bin/env bash

# Get the list of files that are about to be committed and filter out only the .jl files
files=$(git diff --cached --name-only --diff-filter=ACM | grep "\.jl$")

# If no files are found, exit
if [ -z "$files" ]; then
exit 0
fi

# Run the herb formatter on the list of files
julia --startup-file=no -O1 --color=yes .dev/herb_format.jl --check $files

# If the formatter exited with an error, abort the commit
if [ $? -ne 0 ]; then
echo "Error: formatter must be run on the files before committing."
echo "Please run julia .dev/herb_format.jl YOUR_CHANGED_FILES.jl"
exit 1
fi
53 changes: 53 additions & 0 deletions .github/workflows/JuliaFormatter.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
name: Formatting Check

on:
push:
branches:
- master
tags: '*'
pull_request:

concurrency:
# Skip intermediate builds: always.
# Cancel intermediate builds: only if it is a pull request build.
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: ${{ startsWith(github.ref, 'refs/pull/') }}
jobs:
format:
name: Julia ${{ matrix.version }} - ${{ matrix.os }} - ${{ matrix.arch }} - ${{ github.event_name }}
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
version:
- '1'
os:
- ubuntu-latest
arch:
- x64
steps:
- uses: actions/checkout@v4

- uses: dorny/paths-filter@v3
id: filter
with:
filters: |
julia_file_change:
- added|modified: '**.jl'
list-files: 'shell'

- uses: julia-actions/setup-julia@latest
if: steps.filter.outputs.julia_file_change == 'true'
with:
version: ${{ matrix.version }}

- uses: julia-actions/cache@v1

- name: Apply JuliaFormatter
if: steps.filter.outputs.julia_file_change == 'true'
run: |
julia --color=yes .dev/herb_format.jl --verbose ${{ steps.filter.outputs.julia_file_change_files }}
- name: Check formatting diff
if: steps.filter.outputs.julia_file_change == 'true'
run: |
git diff --color=always --exit-code
54 changes: 54 additions & 0 deletions .github/workflows/check_docs.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
name: Check Docs

on:
push:
branches:
- master
tags: '*'
pull_request:

jobs:
documentation:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Set up Julia
uses: julia-actions/setup-julia@v1
with:
version: '1' # Use the latest stable Julia version
- name: Install dependencies
run: |
julia --project=docs -e '
using Pkg;
Pkg.develop(PackageSpec(path=pwd()));
Pkg.instantiate();
Pkg.add("Documenter");
'
- name: Try building documentation and run doctests
run: |
julia --project=docs -e '
using Documenter, HerbConstraints;
content = """
```@meta
CurrentModule = HerbConstraints
DocTestSetup = quote
using HerbConstraints
end
```
```@autodocs
Modules = [HerbConstraints]
```
"""
mkpath("src/")
open("src/index.md", "w") do file
write(file, content)
end
makedocs(
sitename="HerbConstraints.jl",
modules=[HerbConstraints],
format=Documenter.HTML(),
doctest=true,
warnonly=[:missing_docs],
pages=["index.md"]
);
'
143 changes: 70 additions & 73 deletions src/HerbConstraints.jl
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,6 @@ Inside the [`propagate!`](@ref) function, the constraint can use the following s
"""
abstract type AbstractLocalConstraint <: AbstractConstraint end


"""
function get_priority(::AbstractLocalConstraint)

Expand Down Expand Up @@ -78,77 +77,75 @@ include("grammarconstraints/forbidden_sequence.jl")
include("grammarconstraints/unique.jl")

export
AbstractGrammarConstraint,
AbstractLocalConstraint,

DomainRuleNode,
VarNode,
pattern_match,
check_tree,

#grammar constraints
Forbidden,
Ordered,
Contains,
ContainsSubtree,
ForbiddenSequence,
Unique,

#local constraints
LocalForbidden,
LocalOrdered,
LocalContains,
LocalContainsSubtree,
LocalForbiddenSequence,
LocalUnique,

#public solver functions
GenericSolver,
Solver,
SolverState,
new_state!,
save_state!,
load_state!,
isfeasible,
get_state,
get_tree,
get_grammar,
get_starting_symbol,
get_state,
get_node_at_location,
get_hole_at_location,
get_max_depth,
get_max_size,
get_tree_size,

#tree manipulations
remove!,
remove_all_but!,
substitute!,
remove_node!,

#domainutils
is_subdomain,
partition,
are_disjoint,
get_intersection,

#solverstatistics
track!,

#functions related to stateful objects
restore!,
StateInt,
get_value,
set_value!,
increment!,
decrement!,

#uniform solver
UniformSolver,

#state fixed shaped hole
StateHole,
freeze_state
AbstractGrammarConstraint,
AbstractLocalConstraint, DomainRuleNode,
VarNode,
pattern_match,
check_tree,

#grammar constraints
Forbidden,
Ordered,
Contains,
ContainsSubtree,
ForbiddenSequence,
Unique,

#local constraints
LocalForbidden,
LocalOrdered,
LocalContains,
LocalContainsSubtree,
LocalForbiddenSequence,
LocalUnique,

#public solver functions
GenericSolver,
Solver,
SolverState,
new_state!,
save_state!,
load_state!,
isfeasible,
get_state,
get_tree,
get_grammar,
get_starting_symbol,
get_state,
get_node_at_location,
get_hole_at_location,
get_max_depth,
get_max_size,
get_tree_size,

#tree manipulations
remove!,
remove_all_but!,
substitute!,
remove_node!,

#domainutils
is_subdomain,
partition,
are_disjoint,
get_intersection,

#solverstatistics
track!,

#functions related to stateful objects
restore!,
StateInt,
get_value,
set_value!,
increment!,
decrement!,

#uniform solver
UniformSolver,

#state fixed shaped hole
StateHole,
freeze_state

end # module HerbConstraints
Loading
Loading