From 5f5e12e1a0f8cdf1ea11c608fd65d481cd4fffd0 Mon Sep 17 00:00:00 2001 From: Yadong Li Date: Sun, 30 Sep 2018 18:02:45 -0400 Subject: [PATCH 1/2] fixed warnings for julia 0.7 --- REQUIRE | 2 +- src/.DocOpt.jl.swp | Bin 0 -> 36864 bytes src/DocOpt.jl | 40 +++++++++++++++++++++------------------- test/runtests.jl | 2 +- 4 files changed, 23 insertions(+), 21 deletions(-) create mode 100644 src/.DocOpt.jl.swp diff --git a/REQUIRE b/REQUIRE index 137767a..859ad46 100644 --- a/REQUIRE +++ b/REQUIRE @@ -1 +1 @@ -julia 0.6 +julia 0.7 diff --git a/src/.DocOpt.jl.swp b/src/.DocOpt.jl.swp new file mode 100644 index 0000000000000000000000000000000000000000..9a3553c49284d7b122874a5674c81bcb6ba206fd GIT binary patch literal 36864 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 literal 0 HcmV?d00001 diff --git a/src/DocOpt.jl b/src/DocOpt.jl index fd8807f..b729bb8 100644 --- a/src/DocOpt.jl +++ b/src/DocOpt.jl @@ -4,10 +4,12 @@ module DocOpt export docopt +using Printf, Dates + # port of str.partition in Python function partition(s::AbstractString, delim::AbstractString) - range = search(s, delim) - if length(range) == 0 + range = findfirst(delim, s) + if range == nothing # no match return s, "", "" elseif length(range) == 1 @@ -59,8 +61,8 @@ mutable struct Option <: LeafPattern function Option(option_description::AbstractString) short, long, argcount, value = nothing, nothing, 0, false options, _, description = partition(strip(option_description), " ") - options = replace(options, ',', ' ') - options = replace(options, '=', ' ') + options = replace(options, ',' => ' ') + options = replace(options, '=' => ' ') for s in split(options) if startswith(s, "--") long = s @@ -108,13 +110,13 @@ mutable struct Tokens new(source, error) end function Tokens(source::AbstractString, error=DocOptLanguageError) - source = replace(source, r"([\[\]\(\)\|]|\.\.\.)", s -> " " * s * " ") - source = matchall(r"\S*<.*?>|\S+", source) + source = replace(source, r"([\[\]\(\)\|]|\.\.\.)" => s -> " " * s * " ") + source = collect((m.match for m in eachmatch(r"\S*<.*?>|\S+", source))) new(source, error) end end -function Base.iteratorsize(::Type{Tokens}) +function IteratorSize(::Type{Tokens}) return Base.SizeUnknown() end @@ -259,7 +261,7 @@ function flat(pattern::BranchPattern, types=[]) if typeof(pattern) in types return [pattern] else - return reduce(vcat, Pattern[], [flat(child, types) for child in pattern.children]) + return reduce(vcat, [flat(child, types) for child in pattern.children], init=Pattern[]) end end @@ -275,7 +277,7 @@ function fix_identities(pattern::Pattern, uniq=nothing) uniq = uniq === nothing ? unique(flat(pattern)) : uniq for (i, child) in enumerate(pattern.children) if !isa(child, BranchPattern) - pattern.children[i] = uniq[findfirst(uniq, child)] + pattern.children[i] = uniq[something(findfirst(isequal(child), uniq), 0)] else fix_identities(child, uniq) end @@ -305,11 +307,11 @@ function transform(pattern::Pattern) result = Any[] groups = Any[Pattern[pattern]] while !isempty(groups) - children = shift!(groups) + children = popfirst!(groups) parents = [Required, Optional, OptionsShortcut, Either, OneOrMore] if any(map(t -> t in map(typeof, children), parents)) child = first(filter(c -> typeof(c) in parents, children)) - splice!(children, findfirst(children, child)) + splice!(children, something(findfirst(isequal(child), children), 0)) if isa(child, Either) for c in child.children push!(groups, vcat([c], children)) @@ -329,11 +331,11 @@ end Base.hash(pattern::Pattern) = pattern |> string |> hash Base.getindex(tokens::Tokens, i::Integer) = tokens.tokens[i] -Base.start(tokens::Tokens) = 1 -Base.done(tokens::Tokens, i::Int) = i > endof(tokens.tokens) -Base.next(tokens::Tokens, i::Int) = tokens.tokens[i], i + 1 +Base.iterate(tokens::Tokens) = isempty(tokens.tokens) ? nothing : (tokens.tokens[1], 2) +Base.iterate(tokens::Tokens, i::Int) = (i > lastindex(tokens.tokens)) ? nothing : (tokens.tokens[i], i+1) +Base.length(tokens::Tokens) = length(tokens.tokens) -move!(tokens::Tokens) = isempty(tokens.tokens) ? nothing : shift!(tokens.tokens) +move!(tokens::Tokens) = isempty(tokens.tokens) ? nothing : popfirst!(tokens.tokens) current(tokens::Tokens) = isempty(tokens.tokens) ? nothing : tokens[1] # parsers @@ -471,7 +473,7 @@ function parse_atom(tokens, options) return parse_long(tokens, options) elseif startswith(token, '-') && !isdash(token) return parse_shorts(tokens, options) - elseif startswith(token, '<') && endswith(token, '>') || all(isupper, token) + elseif startswith(token, '<') && endswith(token, '>') || all(isuppercase, token) return [Argument(move!(tokens))] else return [Command(move!(tokens))] @@ -504,7 +506,7 @@ end function parse_section(name, source) pattern = Regex("^([^\\n]*$name[^\\n]*\\n?(?:[ \\t].*?(?:\\n|\$))*)", "im") - map(strip, matchall(pattern, source)) + map(strip, collect((m.match for m in eachmatch(pattern, source)))) end function parse_defaults(doc) @@ -523,7 +525,7 @@ end function formal_usage(section) _, _, section = partition(section, ':') words = split(strip(section)) - program = shift!(words) + program = popfirst!(words) patterns = AbstractString[] for w in words if w == program @@ -601,7 +603,7 @@ function docopt(doc::AbstractString, return ret end if exit_on_error - @printf(STDERR, "%s\n", docoptexit.usage) + @printf(stderr, "%s\n", docoptexit.usage) isinteractive() || exit(1) else throw(docoptexit) diff --git a/test/runtests.jl b/test/runtests.jl index 84bac78..d618833 100644 --- a/test/runtests.jl +++ b/test/runtests.jl @@ -1,4 +1,4 @@ -using Base.Test +using Test using DocOpt # import docopt method import DocOpt: From a28da07808d1f67fc946bfd72d75cb2a2995f056 Mon Sep 17 00:00:00 2001 From: Yadong Li Date: Wed, 10 Oct 2018 15:17:25 -0400 Subject: [PATCH 2/2] upped julia version for CI --- .travis.yml | 3 ++- src/.DocOpt.jl.swp | Bin 36864 -> 0 bytes 2 files changed, 2 insertions(+), 1 deletion(-) delete mode 100644 src/.DocOpt.jl.swp diff --git a/.travis.yml b/.travis.yml index f3aef35..7cdeb7f 100644 --- a/.travis.yml +++ b/.travis.yml @@ -2,6 +2,7 @@ language: julia os: - linux julia: - - 0.6 + - 0.7 + - 1.0 notifications: email: false diff --git a/src/.DocOpt.jl.swp b/src/.DocOpt.jl.swp deleted file mode 100644 index 9a3553c49284d7b122874a5674c81bcb6ba206fd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 36864 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