Or, what if you slice up the argument list before passing to picocli? (Although I probably just wouldn't use it, instead of working around its limitations.)
On Mon, Jan 3, 2022 at 11:28 AM Daniel Dekany <daniel.dek...@gmail.com> wrote: > I think we should first decide how the CLI will be the easiest to > understand for users, regardless of current implementation > details. Actually, most of the code shouldn't assume CLI at all, like many > need to do basically the same things via Maven. (In Maven you use XML to > define the job, which is much less limited.) As for the need for multiple > transformations in a single run, it's surely not needed too often, but > sometimes shared variables can be quite important (for speed, but even > maybe for consistency). > > So, will picocli limitations decide what the Genertor can do, what it's > higher level architecture looks like? That doesn't sound like a > good tradeoff to me. Picocli is quite opinionated, and so not very > flexible. Probably we need to use something else for something that has a > complex CLI. (I hoped it can have positionals in "Repeating Composite > Argument Groups", but apparently it can't.) > > On Sun, Jan 2, 2022 at 10:53 PM Siegfried Goeschl < > siegfried.goes...@gmail.com> wrote: > >> Hi Daniel, >> >> Sorry for the long delay but I was quite busy with some CVEs. >> >> I'm not getting all the points of your suggestions, please see my inline >> comments below >> >> Thanks in advance, >> >> Siegfried Goeschl >> >> >> >> > On 12.12.2021, at 13:17, Daniel Dekany <daniel.dek...@gmail.com> wrote: >> > >> > I did not forget about checking out freemarker-generator. So I played >> > around, have a lot of thoughts. Too many really. So I try to go one >> topic >> > at a time. >> > >> > So this one is about OutputGeneratorDefinition and all related. I >> believe >> > this mechanism ended up being too complicated to be practical for >> users, in >> > big part because the CLI doesn't show clearly where the boundaries of >> > OutputGeneratorDefinition are. I learnt to use these without knowing >> much >> > beforehand, so I'm speaking from experience, and it can >> > get quite confusing. So it should be made more accessible. I'm also >> not in >> > favor of having a bias towards template seeded processing, as we have it >> > now, as it adds asymmetry, which again makes using the tool more >> confusing >> > than it could be. >> > >> > I think non-@Option arguments to the CLI should be the seed files, >> always, >> > and all of them. No matter if they are templates or data files, what >> > matters is that they are seeds. I think that's more intuitive that way; >> > they are the *what* to process, and the options are about *how* to >> process >> > them. So: >> > >> > - If you want to seed from template, then instead of >> > "freemarker-generator some.csv -t some.ftl", you would write >> > "freemarker-generator --data-source=some.csv some.ftl" (or same with >> "-d >> > some.csv"; I would prefer -d over -s). >> > - If you want to seed from data files, then it's like >> > "freemarker-generator --transformation=some.ftl *.csv" (or same with >> "-t >> > some.ftl", and now "t" stands for "transformation", not "template", >> as you >> > never need "template" in this approach). >> > >> >> [SG] That sounds doable >> >> > Above, --transformation only applies to the seed files specified after >> it, >> > and before the next --transformation (if there's any). So that way you >> can >> > have different transformation for different files. If no >> --transformation >> > was specified yet (or if it was --transformation=#templateOutput), the >> seed >> > file will be directly processed as a template. (By the way, then there >> > could be a --transformation=#copy as well.) >> >> [SG] When using picocli all positional parameters (you mentioned >> non-@Options above) go into a single list so there is no good way of >> mixing multiple seeds with positional parameters (see >> https://picocli.info/#_mixing_options_and_positional_parameters < >> https://picocli.info/#_mixing_options_and_positional_parameters>) >> >> > >> > Secondly, we should make scoping more obvious and regular in the CLI. >> The >> > simplest I can imagine from user perspective is if the command line >> > arguments are "executed" left to right (as if we had an imperative >> > programming language, and each argument is a statement). So if you have >> > "freemarker-generator --foo=1 --bar=x file1 file2 --foo=2 file3 file4", >> > where foo and bar are just hypothetical options, then file1 and file2 >> will >> > be processed with foo=1 and bar=x, and file3 and file4 will be processed >> > with foo=2 and bar=x. The --transform examples earlier did this as well. >> > >> >> [SG] As mentioned before picocli collects all positional parameters into >> a single list >> >> > Now the treatment of seed files can be more unfiorm, we don't we don't >> need >> > --data-source-include and --template-include and --template-exclude >> > --data-source-exclude. We just need --exclude and --include, which, >> agaian, >> > applies to every seed file after it, until there's an overriding >> -exclude >> > and --include. >> >> [SG] Using a more uniform "include" and "exclude" makes sense >> >> > >> > We kind of have a similar situation with --output and --output-map, as >> > these treat template seeds and data file seeds differently. I think here >> > again we only need --output, but there, it should be possible to >> specify a >> > more sophisticated template of the output. Like >> > --output="${fileNameNoExtension}.txt". If you got the same output file >> for >> > multiple seeds, that's an error. (The default would be to write to >> stdout, >> > but if multiple seeds write to there, I think that's not intentional and >> > this should be also an error.) >> >> [SG] Want to do a more sophisticated output mapping using variable >> expansion at a later stage >> >> [SG] IMHO multiple seeds should be able to write to STDOUT as multiple >> seeds should be able to write to the same output file. >> >> > >> > Also with this we could get rid of "--shared-..." options. Just put the >> > thing at the beginning of the argument, and it will be seen by all >> seeds. >> > Now admittedly we lose functionality here, compared to >> > OutputGeneratorDefinition-s, as different group of seed files can't have >> > their own data-model and data-sources now. But, you can give name to >> > data-model-s and data sources, even groups for data-sources, so every >> seed >> > processing can just look at what's interesting for it. Not the cleanest, >> > but I think doing it better just doesn't worth the baggage it brought. >> > >> > Last not least, when you need multiple seed file groups, chances are >> that >> > it should be just multiple calls to "freemarker-generator". So my main >> > focus is to make both way of seeding look natural. >> > >> >> [SG] A lot of complexity and edge cases are caused by supporting multiple >> transformations using a single command line invocation >> >> * Shared data models >> * Encodings >> * Include and excludes >> >> What do you think of dropping that? >> >> > -- >> > Best regards, >> > Daniel Dekany >> >> > > -- > Best regards, > Daniel Dekany > -- Best regards, Daniel Dekany