The "version exceptions" are for Racket versions, for example, the "raco 
pkg install cover" in a Racket 8.0 installation will query the 
url: https://pkgs.racket-lang.org/pkg/cover?version=8.0, while the same 
command in a Racket 6.7 installation will 
query https://pkgs.racket-lang.org/pkg/cover?version=6.7.  

You can check with curl what the responses for each of those queries is.

Alex.

On Thursday, March 18, 2021 at 1:58:41 AM UTC+8 Jeff Henrikson wrote:

> Thanks for the help.
>
> In fact there are two concepts here, and part of what I think confused you 
> is something I just discovered this week and plan to report as a bug: 
> https://pkgs.racket-lang.org/pkgs-all does not include the package's 
> version . . .
>
> It seems that the issue you raise applies more generally than to 
> /pkgs-all.  See appended below curl commands that show that the package 
> version is also missing in the response to a request for information on a 
> specific package.
>
> Could it be that the package service is actually deleting old versions of 
> packages when new ones are uploaded?
>
>
> Jeff
>
>
> curl 
> https://raw.githubusercontent.com/florence/cover/release/cover-lib/info.rkt
>
> #lang info
>
> (define collection 'multi)
> (define version "3.3.3")
> (define pkg-desc "A code coverage library -- implementation")
>
> (define deps '("base"
>                "compiler-lib"
>                "custom-load"
>                "data-lib"
>                "errortrace-lib"
>                "syntax-color-lib"
>                "testing-util-lib"))
>
> curl https://pkgs.racket-lang.org/pkg/cover-lib
>
> #hasheq((author . "[email protected]") (authors . ("[email protected]")) 
> (build . #hash((conflicts-log . #f) (dep-failure-log . #f) (docs . ()) 
> (failure-log . #f) (min-failure-log . #f) (success-log . 
> "server/built/install/cover-lib.txt") (test-failure-log . #f) 
> (test-success-log . "server/built/test-success/cover-lib.txt"))) (checksum 
> . "ad50ffa8f6246053bec24b39b9cae7fad1534373") (checksum-error . #f) 
> (collection . (multi)) (conflicts . ()) (date-added . 1582684086) 
> (dependencies . ("base" "compiler-lib" "custom-load" "data-lib" 
> "errortrace-lib" "syntax-color-lib" "testing-util-lib")) (description . "A 
> code coverage tool, implementation part") (implies . ()) (last-checked . 
> 1615994547) (last-edit . 1582684243) (last-updated . 1582839053) (modules . 
> ((lib "cover/strace.rkt") (lib "cover/cover.rkt") (lib 
> "cover/private/raw.rkt") (lib "cover/private/format-utils.rkt") (lib 
> "cover/private/file-utils.rkt") (lib "cover/format.rkt") (lib 
> "cover/private/contracts.rkt") (lib "cover/main.rkt") (lib 
> "cover/raco.rkt") (lib "cover/private/shared.rkt") (lib 
> "cover/private/html/html.rkt"))) (name . "cover-lib") (ring . 1) 
> (search-terms . #hasheq((:build-success: . #t) (author:[email protected] 
> . #t) (ring:1 . #t) (testing . #t) (tools . #t))) (source . 
> "https://github.com/florence/cover.git?path=cover-lib#release"; 
> <https://github.com/florence/cover.git?path=cover-lib#release>) (tags . 
> ("testing" "tools")) (versions . #hash((default . #hasheq((checksum . 
> "ad50ffa8f6246053bec24b39b9cae7fad1534373") (source . 
> "https://github.com/florence/cover.git?path=cover-lib#release"; 
> <https://github.com/florence/cover.git?path=cover-lib#release>) 
> (source_url . 
> "https://github.com/florence/cover.git?path=cover-lib#release"; 
> <https://github.com/florence/cover.git?path=cover-lib#release>))))))
>
>
> On 3/16/21 5:41 PM, Philip McGrath wrote:
>
> Hi Jeff,
>
> In fact there are two concepts here, and part of what I think confused you 
> is something I just discovered this week and plan to report as a bug: 
> https://pkgs.racket-lang.org/pkgs-all does not include the package's 
> version: that's what's discussed on the Package Concepts 
> <https://docs.racket-lang.org/pkg/Package_Concepts.html> page you linked 
> to. The ?version= query parameter corresponds to the `'versions` (plural—in 
> hindsight this should have had a different name!) entry in the hash table, 
> which is documented slightly below the passage you quoted from the section 
> on Remote and Directory Catalogs 
> <https://docs.racket-lang.org/pkg/catalog-protocol.html#%28part._.Remote_and_.Directory_.Catalogs%29>
> :
>
>>
>>    - 
>>    
>>    'versions (optional) — a hash table mapping version strings and '
>>    default to hash tables, where each version-specific hash table 
>>    provides mappings to override the ones in the main hash table, and '
>>    default applies to any version not otherwise mapped.
>>    
>>    Clients of a remote catalog may request information for a specific 
>>    version, but they should also check for a 'versions entry in a 
>>    catalog response, in case a catalog with version-specific mappings is 
>>    implemented as a directory or by a file-serving HTTP server. A '
>>    default mapping, meanwhile, allows the main hash table to provide 
>>    information that is suitable for clients at version 5.3.6 and earlier 
>>    (which do not check for 'versions).
>>    
>> This field is not a property of the package: it is part of the package 
> catalog. For example, when registering a package at 
> https://pkgs.racket-lang.org, you can optionally enter this data in a 
> field on the web form. The purpose is to implement "version exceptions", 
> which are documented further down the page—but clearly this section should 
> be much more pervasively linked to, because this is quite confusing:
>
>> To make supporting multiple versions of Racket easier, the package 
>> catalog 
>> <https://docs.racket-lang.org/pkg/Package_Concepts.html#%28tech._package._catalog%29>
>>  
>> software supports version exceptions. Version exceptions allow package 
>> authors to specify alternative package source 
>> <https://docs.racket-lang.org/pkg/Package_Concepts.html#%28tech._package._source%29>s
>>  
>> to be used when installing a given package using a specific version of 
>> Racket.
>>
>> For example, a package that uses on Racket 6.0-specific features could 
>> provide a version exception 
>> <https://docs.racket-lang.org/pkg/getting-started.html#%28tech._version._exception%29>
>>  
>> for Racket 5.3.6 using a different branch or tag in the package’s GitHub 
>> repository, or a different zip archive, as package source. Users installing 
>> the package from Racket 6.0 will use the default source for the package, 
>> while those using Racket 5.3.5 will install from the alternative branch, 
>> tag, or archive.
>>
> This is very rarely useful, in my experience: I thought I might have used 
> it once, but it now seems I didn't.
>
> With that confusing detour out of the way, on to your actual question: 
> "What is the intended use of the version field in the Racket package 
> manager?"
>
> The summary you quoted is right, but there are some important details:
>
> A version is intended to reflect available features of a package, and 
>> should not be confused with different releases of a package as indicated by 
>> the checksum.
>>
>
> Let's imagine package A depends on package B. Both are at version 0.0. Now 
> B exports a new function, which A would like to use. If B is well-behaved, 
> it has changed its package info.rkt file to include:
>
>> (define version "0.1")
>>
> Now A can write:
>
>> (define deps
>>   '("base" 
>>     ["B" #:version "0.1"]))
>>
> and `raco pkg` will prompt anyone who installs or updates A but has an old 
> version of B to update B, too.
>
> Note that there are some important differences from the semver systems 
> used by some other package managers: in particular, by design, the only 
> possible version constraint is "at least". When you write:
>
> It seems natural for packages that tightly depend on quickly evolving 
>> features of the Racket language to have a versioning scheme coupled to 
>> Racket's own versions.  On the other hand, for packages that work with a 
>> variety of possible Racket versions, it seems to make sense that said 
>> packages would have their own release cycles, compatibility aspirations, 
>> and semantic versioning contract.
>>
>
> Racket has some strong views about compatibility, both as a 
> language/distribution and in the design of its package manager. Racket has, 
> from my perspective, a fairly remarkable level of commitment to not 
> breaking existing code. The package system is modeled on an os-level 
> package manager, a deliberate choice to move away from the intricate 
> versioning mechanism of the older PLaneT package system. It is focused on 
> getting your files installed in the right place. The expectation is that 
> releases of a package will only add functionality, not remove or break it. 
> A package therefore need only increment the version number if it has added 
> something that someone else wants to ensure is available.
>
> If you make a breaking change, the idea is that you should create a new 
> collection (which may or may not be part of a new package) with a new name: 
> consider scribble/lp2 
> <https://docs.racket-lang.org/scribble/lp.html#(part._scribble_lp2_.Language)>
>  
> and scribble/lp 
> <https://docs.racket-lang.org/scribble/lp.html#(part._scribble_lp_.Language)>
> .
> One of the strongest arguments I've seen for this approach is from a 
> non-Racket context: https://ometer.com/parallel.html (h/t Andy Wingo 
> <https://www.wingolog.org/archives/2020/02/07/lessons-learned-from-guile-the-ancient-spry>
> )
>
> If you are familiar with some other package managers, this can sound very 
> scary, but it has never been a problem at all for me in practice. There is 
> also an escape hatch, because this is a matter of social norms, not 
> something automatically enforced: if you call your package, or part of it, 
> "unstable" or "experimental", like unstable/gui/redex 
> <https://docs.racket-lang.org/unstable-redex/index.html> or my 
> adjutor/unstable <https://docs.racket-lang.org/adjutor/Unstable.html>, or 
> you put a big scary warning in the docs like this 
> <https://docs.racket-lang.org/ricoeur-tei-utils/Installing___Updating_This_Library.html#%28part._.Status_of_.This_.Library%29>
>  
> (again, one of mine) or this 
> <https://docs.racket-lang.org/pollen/Unstable_module_reference.html>, you 
> can follow whatever kind of support practice you want.
>
> -Philip
>
> On Tue, Mar 16, 2021 at 6:51 PM Jeff Henrikson <[email protected]> wrote:
>
> Hello racket-users,
>>
>> As far as I can tell from reading the Racket documentation, the racket 
>> package manager has only one field to indicate version.  I am trying to 
>> understand the intended use of the version field.
>>
>> Here the documentation seems to recommend that packages use the version 
>> field to denote a semantic versioning scheme of for the specific package's 
>> release cycle:
>>
>> https://docs.racket-lang.org/pkg/Package_Concepts.html
>>         a version — a string of the form ‹maj›.‹min›, ‹maj›.‹min›.‹sub›, 
>> or ‹maj›.‹min›.‹sub›.‹rel›, where ‹maj›, ‹min›, ‹sub›, and ‹rel› are all 
>> canonical decimal representations of natural numbers, ‹rel› is not 0, ‹sub› 
>> is not 0 unless ‹rel› is supplied, ‹min› has no more than two digits, and 
>> ‹sub› and ‹rel› have no more than three digits. A version is intended to 
>> reflect available features of a package, and should not be confused with 
>> different releases of a package as indicated by the checksum.
>>
>> Here the documentation refers to a "Racket version number," which might 
>> be taken to mean a version number of the Racket language:
>>
>> https://docs.racket-lang.org/pkg/catalog-protocol.html
>>         8.1 Remote and Directory Catalogs
>>             In the case of a remote URL or a local directory naming a 
>> package catalog, the URL/path is extended as follows to obtain information 
>> about packages:
>>
>>             pkg and ‹package› path elements, where ‹package› is a package 
>> name, plus a version=‹version› query (where ‹version› is a Racket version 
>> number) in the case of a remote URL.
>>
>> It seems natural for packages that tightly depend on quickly evolving 
>> features of the Racket language to have a versioning scheme coupled to 
>> Racket's own versions.  On the other hand, for packages that work with a 
>> variety of possible Racket versions, it seems to make sense that said 
>> packages would have their own release cycles, compatibility aspirations, 
>> and semantic versioning contract.
>>
>> Note that some package managers for evolving languages have two 
>> versioning coordinates, one for the language version and one for the 
>> package version.
>>
>> Appended below this message is a small racket program that inspects data 
>> from the https://pkgs.racket-lang.org/pkgs-all HTTP endpoint.  According 
>> to this analysis, 21% of published Racket packages version using version 
>> numbers of the Racket language.  Fewer than 1% of published Racket packages 
>> seem to version using their own version scheme.  And 78% of published 
>> Racket packages have only ever filled the version field with "default".
>>
>> As the documentation notes, using checksum instead of a version field is 
>> sort of like saying any feature can change at any time to any degree: "A 
>> version is intended to reflect available features of a package, and should 
>> not be confused with different releases of a package as indicated by the 
>> checksum."
>>
>> My question is this: What is the intended use of the version field in the 
>> Racket package manager?
>>
>> Thanks in advance,
>>
>>
>> Jeff Henrikson
>>
>>
>> #lang racket
>>
>> ;; obtain data with:
>> ;; curl https://pkgs.racket-lang.org/pkgs-all > contrib_pkgs-all.sexp
>>
>>
>> ;; relfin is "contrib_pkgs-all.sexp" or similar.
>> ;;
>> ;; In practice it's one value that comes over the wire, so
>> ;; we'll just take the car now.
>> (define (read-pkgs5 relfin)
>>   (letrec (
>>            (fin (open-input-file relfin))
>>            (iter (lambda (xs)
>>                    (let ((x (read fin)))
>>                      (if (not (equal? x eof))
>>                          (iter (cons x xs))
>>                          (begin
>>                            (close-input-port fin)
>>                            xs))))))
>>     (car (reverse (iter '())))))
>>
>>
>> ;;; Get the versions of a package hash
>> (define (versions-of-pkg pkg)
>>   (hash-keys (hash-ref pkg 'versions)))
>>
>> ;;; Is there at least one version that appears to be distinct
>> ;;; from a racket version?
>> ;; Racket version numbers contemporaneous with the remote catalog
>> ;; seem to start around version 6.
>> (define (package-uses-version-for-package? pkg)
>>   (not (empty? (filter (lambda (v)
>>                          (and
>>                           (string? v)
>>                           (string<? v "5")))
>>                        (versions-of-pkg pkg)))))
>>
>>
>>
>> ;;; Is there at least one version that appears to be a racket version?
>> ;; Racket version numbers contemporaneous with the remote catalog
>> ;; seem to start around version 6.
>> (define (package-uses-version-for-racket? pkg)
>>   (not (empty? (filter (lambda (v)
>>                          (and
>>                           (string? v)
>>                           (not (equal? v "default"))
>>                           (string<? "5" v)))
>>                        (versions-of-pkg pkg)))))
>>
>> ;;; Histogram the identified uses of the version field
>> (define (classify-version-use pkgs)
>>   (define (how-used pkg)
>>     (cond
>>            ((package-uses-version-for-package? pkg) 'package-versioned)
>>            ((package-uses-version-for-racket? pkg) 'racket-versioned)
>>            (else 'no-versioning-used)))
>>   (define (increment x)
>>     (+ x 1))
>>   (let* (
>>          (h (make-hash))
>>          (_ (for-each (lambda (kv)
>>                         (hash-update! h (how-used (cdr kv)) increment 0))
>>                       (hash->list pkgs)))
>>          (num-by-use (hash->list h)))
>>     num-by-use))
>>
>>
>>
>> (module+ main
>>   (define pkgs (read-pkgs5 "contrib_pkgs-all.sexp"))
>>
>>   (classify-version-use pkgs)
>>   ;; '((no-versioning-used . 1472) (racket-versioned . 379) 
>> (package-versioned . 13))
>> )
>>
>>
>> -- 
>> You received this message because you are subscribed to the Google Groups 
>> "Racket Users" group.
>> To unsubscribe from this group and stop receiving emails from it, send an 
>> email to [email protected].
>> To view this discussion on the web visit 
>> https://groups.google.com/d/msgid/racket-users/cde363b4-f0c4-eb6f-c68f-7033bfa14c3c%40gmail.com
>>  
>> <https://groups.google.com/d/msgid/racket-users/cde363b4-f0c4-eb6f-c68f-7033bfa14c3c%40gmail.com?utm_medium=email&utm_source=footer>
>> .
>>
>

-- 
You received this message because you are subscribed to the Google Groups 
"Racket Users" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/racket-users/e8538154-c543-4d7b-ad23-135f9a2f6d84n%40googlegroups.com.

Reply via email to