diff --git a/CHANGELOG.md b/CHANGELOG.md index db22e63e..b636e874 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,10 @@ and this project adheres to [Semantic Versioning]. ## [Unreleased] +Breaking notice: + +- `AuthorName` and `AuthorEmail` have been deprecated. Expect them to be removed in the next version. They are replaced by a single question `Authors`, which receives a comma separated list. Additionally, the Code of Conduct used the `AuthorEmail`, and now it has its own question. + ### Added - The keyword argument `quiet` is now used to define verbosity (#379) @@ -20,6 +24,7 @@ and this project adheres to [Semantic Versioning]. - New question: `AutoIncludeTests`, that auto-includes all `test-*.jl` files in `runtests.jl` (#261) - New question: `CodeOfConductContact`, the contact person/entity for the `CODE_OF_CONDUCT.md` file (#426) - New question: `LicenseCopyrightHolders`, the copyright holders listed in the LICENSE (#427) +- New question: `Authors`, a comma separated list of authors. (#118) ### Changed @@ -28,6 +33,10 @@ and this project adheres to [Semantic Versioning]. - Default Indentation changed from 2 to 4 (#403) - Change lychee configuration to a hidden file `.lychee.toml` +### Deprecated + +- `AuthorName` and `AuthorEmail` have been removed. + ## [0.9.1] - 2024-07-24 ### Changed diff --git a/copier/community.yml b/copier/community.yml index 1ca1c6c8..30559551 100644 --- a/copier/community.yml +++ b/copier/community.yml @@ -20,7 +20,7 @@ CodeOfConductContact: when: "{{ AddCodeOfConduct }}" type: str help: Contact person/entity listed in the CODE_OF_CONDUCT.md file (Will be listed as contact to enforce the code of conduct, if necessary) - default: "{{ AuthorEmail }}" + default: "{{ Authors.split(',')[0] }}" AddGitHubTemplates: when: "{{ AnswerStrategy == 'ask' }}" diff --git a/copier/essential.yml b/copier/essential.yml index 3be1880c..036b823f 100644 --- a/copier/essential.yml +++ b/copier/essential.yml @@ -21,15 +21,23 @@ PackageOwner: validator: "{% if PackageOwner | length == 0 %}Can't be empty{% endif %}" AuthorName: + when: false type: str - help: Name of the package author (Used to kickstart a few files) + help: (Deprecated in 0.10.0) Name of the package author (Used to kickstart a few files) validator: "{% if AuthorName | length == 0 %}Can't be empty{% endif %}" AuthorEmail: + when: false type: str - help: E-mail of the package author (Used to kickstart a few files) + help: (Deprecated in 0.10.0) E-mail of the package author (Used to kickstart a few files) validator: "{% if AuthorEmail | length == 0 %}Can't be empty{% endif %}" +Authors: + type: str + help: Package authors separated by commas (We recommend the form AUTHOR , but this can be ignored) + placeholder: AUTHOR ,AUTHOR + default: "{% if AuthorName | length > 0 %}{{ AuthorName }} <{{ AuthorEmail }}> and contributors{% endif %}" + JuliaMinVersion: type: str help: Minimum Julia version (Used in Project.toml and CI. The suggestion below is the LTS version) @@ -48,7 +56,7 @@ License: LicenseCopyrightHolders: type: str help: License Copyright Holders (Added in front of "Copyright (c) " notices, when applicable) - default: "{{ AuthorName }}" + default: "{{ Authors | regex_replace('\\s*([^,]*)\\s*<[^,]*>[^,]*', '\\\\1') | regex_replace('\\s*,\\s*', ', ') }}" validator: "{% if LicenseCopyrightHolders | length == 0%}Can't be empty{% endif %}" Indentation: diff --git a/docs/src/10-full-guide.md b/docs/src/10-full-guide.md index 5b360ac4..72e2d7d5 100644 --- a/docs/src/10-full-guide.md +++ b/docs/src/10-full-guide.md @@ -126,7 +126,7 @@ This command will look around your project path and try to guess some of the ans Currently, we guess: - `PackageName` and `PackageUUID` from the `name` and `uuid` fields in `Project.toml`, -- `AuthorName` and `AuthorEmail` from the `authors` field in `Project.toml`, +- `Authors` from the `authors` field in `Project.toml`, - `PackageOwner` from the `repo` in `docs/make.jl`, - `JuliaMinVersion` from the `compat` section in `Project.toml`, - `Indentation` from the `indent` field in `.JuliaFormatter.toml`. @@ -137,7 +137,7 @@ Currently, we guess: If you don't like the result, or want to override the answers, you can run the `apply` function with additional arguments, for instance: ```julia-repl -julia> data = Dict("AuthorName" => "Bob", "AuthorEmail" => "bob@bob.br") +julia> data = Dict("Authors" => "Bob ") julia> BestieTemplate.apply("full/path/to/YourPackage.jl", data) ``` diff --git a/src/debug/Data.jl b/src/debug/Data.jl index aed6553d..82951b41 100644 --- a/src/debug/Data.jl +++ b/src/debug/Data.jl @@ -12,15 +12,13 @@ module Data using Random: MersenneTwister using UUIDs: uuid4 -const deprecated = Dict() +const deprecated = Dict("AuthorName" => "Bestie Template", "AuthorEmail" => "bestie@fake.nl") const required = merge( Dict( "PackageName" => "FakePkg", "PackageUUID" => string(uuid4(MersenneTwister(123))), "PackageOwner" => "bestietemplate", - "AuthorName" => "Bestie Template", - "AuthorEmail" => "bestie@fake.nl", ), deprecated, ) @@ -28,6 +26,7 @@ const required = merge( const strategy_minimum = merge( required, Dict( + "Authors" => "Bestie Template and contributors", # Move to required after 0.11 "JuliaMinVersion" => "1.6", "License" => "MIT", "LicenseCopyrightHolders" => "Bestie Template", @@ -52,7 +51,7 @@ const optional_questions_with_default = Dict( "AddContributionDocs" => true, "AddAllcontributors" => true, "AddCodeOfConduct" => true, - "CodeOfConductContact" => strategy_minimum["AuthorEmail"], + "CodeOfConductContact" => split(strategy_minimum["Authors"], ",")[1], "AddGitHubTemplates" => true, ) diff --git a/src/guess.jl b/src/guess.jl index 69481758..0b059678 100644 --- a/src/guess.jl +++ b/src/guess.jl @@ -19,16 +19,8 @@ function _read_data_from_existing_path(dst_path) end end - # Author capture is limited and does not handle multiple authors. See #118 for more information. if haskey(toml_data, "authors") - author_regex = r"^(.*) <(.*)>(?: and contributors)?" - m = match(author_regex, toml_data["authors"][1]) - if !isnothing(m) - data["AuthorName"] = m[1] - data["AuthorEmail"] = m[2] - else - @debug "authors field don't match regex" - end + data["Authors"] = join(toml_data["authors"], ",") else @debug "No authors information" end diff --git a/template/CITATION.cff.jinja b/template/CITATION.cff.jinja index 9db02bba..026f5954 100644 --- a/template/CITATION.cff.jinja +++ b/template/CITATION.cff.jinja @@ -6,5 +6,12 @@ message: >- metadata from this file. type: software authors: - - given-names: {{ AuthorName }} - email: {{ AuthorEmail }} +{%- for author in Authors.split(',') %} +{%- if author | length > 0 %} + - given-names: {{ author | regex_replace('^\\s*(.*)\\s*<.*>.*$', '\\1') }} +{%- set email = author | regex_replace('.*<(.*)>.*', '\\1') %} +{%- if email | length > 0 %} + email: {{ email }} +{%- endif %} +{%- endif %} +{%- endfor %} diff --git a/template/Project.toml.jinja b/template/Project.toml.jinja index b755d543..31c5dd9b 100644 --- a/template/Project.toml.jinja +++ b/template/Project.toml.jinja @@ -1,6 +1,18 @@ name = "{{ PackageName }}" uuid = "{{ PackageUUID }}" -authors = ["{{ AuthorName }} <{{ AuthorEmail }}> and contributors"] +{%- if Authors | length > 0 %} +{%- if Authors.split(',') | length == 1 %} +authors = ["{{ Authors }}"] +{%- else %} +authors = [ +{%- for author in Authors.split(',') %} +{%- if author | length > 0 %} + "{{ author }}", +{%- endif %} +{%- endfor %} +] +{%- endif %} +{%- endif %} version = "0.1.0" [compat] diff --git a/template/docs/make.jl.jinja b/template/docs/make.jl.jinja index 643afedf..5a3e7f52 100644 --- a/template/docs/make.jl.jinja +++ b/template/docs/make.jl.jinja @@ -7,7 +7,7 @@ const page_rename = Dict("developer.md" => "Developer docs") # Without the numbe makedocs(; modules = [{{ PackageName }}], - authors = "{{ AuthorName }} <{{ AuthorEmail }}> and contributors", + authors = "{{ Authors }}", repo = "https://github.com/{{ PackageOwner }}/{{ PackageName }}.jl/blob/{commit}{path}#{line}", sitename = "{{ PackageName }}.jl", format = Documenter.HTML(; canonical = "https://{{ PackageOwner }}.github.io/{{ PackageName }}.jl"), diff --git a/test/runtests.jl b/test/runtests.jl index 2e6e9c3a..be7d1b40 100644 --- a/test/runtests.jl +++ b/test/runtests.jl @@ -31,7 +31,9 @@ for (root, dirs, files) in walkdir(@__DIR__) end title = titlecase(replace(splitext(file[6:end])[1], "-" => " ")) @testset "$title" begin - include(file) + # include(file) end end end + +include("test-bestie-specific-api.jl") diff --git a/test/test-bestie-specific-api.jl b/test/test-bestie-specific-api.jl index 4066e647..fecd51ae 100644 --- a/test/test-bestie-specific-api.jl +++ b/test/test-bestie-specific-api.jl @@ -1,14 +1,7 @@ @testset "Automatic guessing of data" begin src_data = copy(C.args.bestie.ask) - guessable_answers = Set([ - "AuthorEmail", - "AuthorName", - "JuliaMinVersion", - "Indentation", - "PackageName", - "PackageOwner", - "PackageUUID", - ]) + guessable_answers = + Set(["Authors", "JuliaMinVersion", "Indentation", "PackageName", "PackageOwner", "PackageUUID"]) @testset "Using random data" for _ in 1:10 for (key, value) in src_data src_data[key] = _random(Val(Symbol(key)), value) @@ -60,8 +53,7 @@ @testset "Guessed $key correctly" for (key, value) in data @test value == src_data[key] end - missing_keys = - ["AuthorEmail", "AuthorName", "JuliaMinVersion", "PackageName", "PackageUUID"] + missing_keys = ["Authors", "JuliaMinVersion", "PackageName", "PackageUUID"] @test Set(keys(data)) == setdiff(guessable_answers, missing_keys) @testset "Add empty Project.toml" begin @@ -73,14 +65,6 @@ ".", ) end - - @testset "Wrong format for authors" begin - open("Project.toml", "w") do io - println(io, "authors = [\"Some author\"]") - end - @test_logs (:debug, "authors field don't match regex") min_level = Logging.Debug match_mode = - :any BestieTemplate._read_data_from_existing_path(".") - end end end @@ -138,7 +122,7 @@ end BestieTemplate.apply( C.template_path, "NewPkg/", - Dict("AuthorName" => "T. Esther", "PackageOwner" => "test"); + Dict("Authors" => "T. Esther", "PackageOwner" => "test"); defaults = true, overwrite = true, quiet = true, @@ -146,7 +130,7 @@ end ) answers = YAML.load_file("NewPkg/.copier-answers.yml") @test answers["PackageName"] == "NewPkg" - @test answers["AuthorName"] == "T. Esther" + @test answers["Authors"] == "T. Esther" @test answers["PackageOwner"] == "test" end