From 507fd0a59ab1b8006ac4bd3a92cb08ecad76e5f9 Mon Sep 17 00:00:00 2001 From: Kai Jaeger Date: Mon, 11 Sep 2023 11:00:04 +0200 Subject: [PATCH] =?UTF-8?q?The=20`Search=20[]QNL`=20report=20now=20allows?= =?UTF-8?q?=20to=20search=20=E2=8E=95SE=20as=20well?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- APLSource/Admin/Make.aplf | 15 +- APLSource/Fire/FindFireReadMe.aplf | 1 + APLSource/Fire/GUI/CreateReportMenu.aplf | 1 + APLSource/Fire/GUI/SearchQNL/CreateGUI.aplf | 26 +- APLSource/Fire/GUI/SearchQNL/OnOK.aplf | 1 + APLSource/Fire/History.apla | 4 + APLSource/Fire/ShowReadMe.aplf | 2 +- APLSource/Fire/Version.aplf | 2 +- Docs/ReleaseNotes.md | 7 +- Fire.iss | 11 +- cider.config | 73 +-- html/FireAndRegularExpressions.html | 80 +++ html/ReadMe.html | 553 ++++++++++++++++++++ html/ReleaseNotes.html | 255 +++++++++ html/UsefulRegExes.html | 147 ++++++ packages_dev/apl-buildlist.json | 2 +- packages_dev/apl-dependencies.txt | 6 +- 17 files changed, 1096 insertions(+), 90 deletions(-) create mode 100644 html/FireAndRegularExpressions.html create mode 100644 html/ReadMe.html create mode 100644 html/ReleaseNotes.html create mode 100644 html/UsefulRegExes.html diff --git a/APLSource/Admin/Make.aplf b/APLSource/Admin/Make.aplf index 88ac07e..07bf46d 100644 --- a/APLSource/Admin/Make.aplf +++ b/APLSource/Admin/Make.aplf @@ -1,5 +1,9 @@ Make flag;targetPath;home;M;name;setupExe;myUCMDsFolder;C;tempFolder;data;buff;cfg ⍝ Version 7.3.0 ⋄ 2023-06-18 +⍝ * 7.2.2 ⋄ 2023-09-11 +⍝ * Bug fixes +⍝ * HTML documents were not found +⍝ * Superfluous files removed from install folder ⍝ * 7.2.1 ⋄ 2023-06-18 ⍝ * Uses latest features of MakeHelpers now ⍝ * Question added to avoid mishaps @@ -16,7 +20,7 @@ :If 18≢⊃⊃(//)⎕VFI buff←{⍵/⍨2>+\⍵='.'}2⊃# ⎕WG'APLVersion' ⍝ ('"Make" a new version with 18.0 - this is ',buff)⎕SIGNAL 11 :EndIf - :AndIf ##.TestCases.CommTools.YesOrNo 'Sure yout want to create a new version of Fire? (The WS will be destroyed in the process)' + :AndIf ##.TestCases.CommTools.YesOrNo'Sure yout want to create a new version of Fire? (The WS will be destroyed in the process)' home←##.CiderConfig.HOME,'/' targetPath←home,'Dist/' {⍵:.}' '≠1↑0⍴⎕FX↑'r←M' 'r←⎕SE.MakeHelpers' ⍝ avoids creating a link in # that points to ⎕SE at the expense of defeating auto-complete @@ -27,7 +31,9 @@ ⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝ M.RecreateFolder targetPath M.IncreaseBuildIDInFunction'#.Fire.Fire.Version' - M.FetchLaterUserCommand'Fire_uc.dyalog'cfg C('[MyUCMDs]',name) + :If ⎕NEXISTS M.GetMyUCMDsFolder'/Fire/Fire_uc.dyalog' + M.CopyBetter(home,'APLSource/Fire_uc.dyalog')(M.GetMyUCMDsFolder'/Fire/Fire_uc.dyalog')'Project version' '[MyUCMDs] version' + :EndIf {}⎕SE.Cider.CloseProject'' ⍝ Precaution ⎕WSID←tempFolder,name,'.dws' 0 ⎕SAVE ⎕WSID @@ -36,8 +42,8 @@ '#.Fire.Fire'#.⎕CY ⎕WSID 0 ⎕SAVE ⎕WSID './packages'M.CopyTo tempFolder - M.ConvertMarkdownToHtml5(home,'Docs/')(tempFolder,'html/') - M.##.F.DeleteFile tempFolder,'/html/readme.html' + M.ConvertMarkdownToHtml5(home,'Docs/')(home,'html/') + (home,'html/*')M.CopyTo tempFolder (home,##.CiderConfig.CIDER.source,'/',name,'_UC.dyalog')M.CopyTo tempFolder (home,'LICENSE')M.CopyTo tempFolder (home,'Fire.ico')M.CopyTo tempFolder @@ -52,6 +58,7 @@ :If 1 M.YesOrNo'Would you like to execute "',setupExe,'" ?' ⎕CMD targetPath,setupExe :EndIf + M.##.F.RmDirByForce tempFolder ⎕←'Clearing the workspace...' ⎕CLEAR :EndIf diff --git a/APLSource/Fire/FindFireReadMe.aplf b/APLSource/Fire/FindFireReadMe.aplf index 6cc0668..2b77381 100644 --- a/APLSource/Fire/FindFireReadMe.aplf +++ b/APLSource/Fire/FindFireReadMe.aplf @@ -25,4 +25,5 @@ :EndIf :EndIf p←Parent.FilesAndDirs.NormalizePath p + 'Cannot find HTML documents'Assert 0<≢p :EndIf diff --git a/APLSource/Fire/GUI/CreateReportMenu.aplf b/APLSource/Fire/GUI/CreateReportMenu.aplf index 200562d..2dc7cdb 100644 --- a/APLSource/Fire/GUI/CreateReportMenu.aplf +++ b/APLSource/Fire/GUI/CreateReportMenu.aplf @@ -5,6 +5,7 @@ ∆←⊂'MenuItem' ∆,←⊂'Caption'('Search QNL...') ∆,←⊂'HintObj'n.Info + ∆,←⊂'Accelerator'(118 0) ∆,←⊂'Hint' 'Search for names recursively. Note that this is the only way to find the name of a non-scripted namespace!' n.SearchQNL←⍎'SearchQNL'rf.⎕WC ∆ n.SearchQNL.onSelect←'OnSearchQNL' diff --git a/APLSource/Fire/GUI/SearchQNL/CreateGUI.aplf b/APLSource/Fire/GUI/SearchQNL/CreateGUI.aplf index 0ae3519..eb0830f 100644 --- a/APLSource/Fire/GUI/SearchQNL/CreateGUI.aplf +++ b/APLSource/Fire/GUI/SearchQNL/CreateGUI.aplf @@ -4,13 +4,13 @@ ∆←⊂'Form' ∆,←⊂'Caption'(##.##.AddPidToCaption'Fire - Search ⎕NL') ∆,←⊂'Coord' 'Pixel' - ∆,←⊂'Size'(200 400) + ∆,←⊂'Size'(200 480) ∆,←⊂'Posn'(n.Form.Posn+50) ∆,←⊂'IconObj'n.TheIcon n2.Form←⍎'TheForm'n.Form.⎕WC ∆ n2.Form.CursorObj←0 n2.Form.n←n2 - + n2.Form.onConfigure←'##.OnConfigure'n2.Form.Size ∆←⊂'Label' ∆,←⊂'Posn'(10 10) @@ -62,6 +62,28 @@ ∆,←⊂'Attach'(4⍴'Top' 'Left') n2.Last←⍎'Last'n2.Group.⎕WC ∆ + ∆←⊂'Group' + ∆,←⊂'Caption' 'Start search in' + ∆,←⊂'Posn'(n2.Group.Posn[0],10+1⊃+⌿⊃n2.Group.(Posn Size)) + ∆,←⊂'Size'(80 160) + ∆,←⊂'Attach'(4⍴'Top' 'Left') + n2.Group2←⍎'Group'n2.Form.⎕WC ∆ + + ∆←⊂'Button' + ∆,←⊂'Caption' '&#' + ∆,←⊂'Posn'(20 10) + ∆,←⊂'Style' 'Radio' + ∆,←⊂'State' 1 + ∆,←⊂'Attach'(4⍴'Top' 'Left') + n2.Root←⍎'FullPath'n2.Group2.⎕WC ∆ + + ∆←⊂'Button' + ∆,←⊂'Caption' '⎕S&E' + ∆,←⊂'Posn'((15+↑+/⊃n2.FullPath.(Posn Size)),10) + ∆,←⊂'Style' 'Radio' + ∆,←⊂'Attach'(4⍴'Top' 'Left') + n2.QSE←⍎'Last'n2.Group2.⎕WC ∆ + ∆←⊂'Button' ∆,←⊂'Caption' '&OK' ∆,←⊂'Default' 1 diff --git a/APLSource/Fire/GUI/SearchQNL/OnOK.aplf b/APLSource/Fire/GUI/SearchQNL/OnOK.aplf index 73b5e03..14dc5f9 100644 --- a/APLSource/Fire/GUI/SearchQNL/OnOK.aplf +++ b/APLSource/Fire/GUI/SearchQNL/OnOK.aplf @@ -4,5 +4,6 @@ parms.SearchIsRegEx←n2.IsRegEx.State parms.SearchFor←n2.SearchFor.Text parms.Case←n2.Case.State + parms.StartSearchIn←↑n2.(Root QSE).State/'#' '⎕SE' Search parms } diff --git a/APLSource/Fire/History.apla b/APLSource/Fire/History.apla index e3da066..4f0831c 100644 --- a/APLSource/Fire/History.apla +++ b/APLSource/Fire/History.apla @@ -1,6 +1,10 @@ ( '⍝ Contains information regarding the last release. A full history is available on GitHub. (This line is ignored)' '' + '* 9.6.0 from 2023-09-11' + ' * The "Search ⎕NL" report now allows to search either in # or in ⎕SE' + ' * "Search in ⎕NL" has now a function key assigned to it: F7' + '' '* 9.5.2 from 2023-03-25' ' * Bug fix: people who do not tick "Options > Object Syntax > Expose GUI Properties" could not use "Replace"' '' diff --git a/APLSource/Fire/ShowReadMe.aplf b/APLSource/Fire/ShowReadMe.aplf index b2b796c..9052d3e 100644 --- a/APLSource/Fire/ShowReadMe.aplf +++ b/APLSource/Fire/ShowReadMe.aplf @@ -1,7 +1,7 @@ {r}←ShowReadMe dummy;f;msg ⍝ Load the Markdown-based HTML document and show it in the default browser. r←⍬ - :If F.Exists{0∊⍴⍵:0 ⋄ ⍺⍺ ⍵}G.HelpPath + :If F.Exists{0=≢⍵:0 ⋄ ⍺⍺ ⍵}G.HelpPath A.GoToWebPage'file://',G.HelpPath :Else msg←⊂'Could not find the document.' diff --git a/APLSource/Fire/Version.aplf b/APLSource/Fire/Version.aplf index 24827ff..721587d 100644 --- a/APLSource/Fire/Version.aplf +++ b/APLSource/Fire/Version.aplf @@ -1,3 +1,3 @@ r←Version ⍝ See also `History` - r←'Fire' '9.5.2+268' '2023-03-25' + r←'Fire' '9.6.0+276' '2023-10-11' diff --git a/Docs/ReleaseNotes.md b/Docs/ReleaseNotes.md index 39c7f52..51d668a 100644 --- a/Docs/ReleaseNotes.md +++ b/Docs/ReleaseNotes.md @@ -13,6 +13,10 @@ A bump of the minor number indicates added functionality plus possibly bug fixes A bump of the patch number indicates bug fixes. +## Version 9.6.0 from 2023-09-11 + +* The "Search [ ]NL" report now allows to start a search in either `#` or in `⎕SE`. + ## Version 9.5.2 from 2023-03-25 Bug fix: people who do not tick "Options > Object Syntax > Expose GUI Properties" could not use "Replace" @@ -136,4 +140,5 @@ Bug fix: people who do not tick "Options > Object Syntax > Expose GUI Properties * When after a search for an RegEx a one-by-one replace operation was triggered Fire might produce a VALUE ERRROR. * In the "Replace" dialog the "Delete lines" options should not be available (active) when it is a RegEx search. * The `∆List` function created by `Fire.API.CreateSearchParms` was buggy. -* Internal change: all calls to acre via ⎕SE.UCMDS have now been replaced by calls to acre's API. \ No newline at end of file +* Internal change: all calls to acre via ⎕SE.UCMDS have now been replaced by calls to acre's API. + diff --git a/Fire.iss b/Fire.iss index cadc751..27c07d4 100644 --- a/Fire.iss +++ b/Fire.iss @@ -43,13 +43,14 @@ Name: "english"; MessagesFile: "compiler:Default.isl"; LicenseFile: "License"; [Files] Source: "{#TargetDir}Fire_uc.dyalog"; DestDir: "{app}"; -Source: "{#TargetDir}Fire_uc.dyalog"; DestDir: "{app}/test/"; -Source: "{#TargetDir}html/FireAndRegularExpressions.html"; DestDir: "{app}"; -Source: "{#TargetDir}html/ReleaseNotes.html"; DestDir: "{app}"; -Source: "{#TargetDir}html/UsefulRegExes.html"; DestDir: "{app}"; +Source: "{#TargetDir}ReadMe.html"; DestDir: "{app}"; +Source: "{#TargetDir}FireAndRegularExpressions.html"; DestDir: "{app}"; +Source: "{#TargetDir}FireAndRegularExpressions.html"; DestDir: "{app}"; +Source: "{#TargetDir}ReleaseNotes.html"; DestDir: "{app}"; +Source: "{#TargetDir}UsefulRegExes.html"; DestDir: "{app}"; Source: "{#TargetDir}{#MyAppExeName}"; DestDir: "{app}" Source: "{#TargetDir}packages/*"; DestDir: "{app}/packages/"; Flags: recursesubdirs -;Source: "{#TargetDir}LICENSE"; DestDir: "{app}" +Source: "{#TargetDir}LICENSE"; DestDir: "{app}" ; NOTE: Don't use "Flags: ignoreversion" on any shared system files [Icons] diff --git a/cider.config b/cider.config index c388481..27a639a 100644 --- a/cider.config +++ b/cider.config @@ -1,72 +1 @@ -{ - CIDER: { - dependencies: { - tatin: "./packages/", - }, - dependencies_dev: { - tatin: "./packages_dev=TestCases", - }, - distributionFolder: "Dist", - init: "Initialize", - make: "Admin.Make 1", - parent: "#", - projectSpace: "Fire", - project_url: "https://github.com/aplteam/Fire", - source: "APLSource", - tests: "TestCases.RunTests", - }, - LINK: { - arrays: 0, - beforeRead: "", - beforeWrite: "", - caseCode: 0, - codeExtensions: [ - "aplf", - "aplo", - "apln", - "aplc", - "apli", - "dyalog", - "apl", - "mipage", - ], - fastLoad: 0, - flatten: 0, - forceExtensions: 0, - forceFilenames: 1, - getFilename: "", - typeExtensions: [ - [ - 2, - "apla", - ], - [ - 3, - "aplf", - ], - [ - 4, - "aplo", - ], - [ - 9.1, - "apln", - ], - [ - 9.4, - "aplc", - ], - [ - 9.5, - "apli", - ], - ], - watch: "ns", - }, - SYSVARS: { - io: 1, - ml: 1, - }, - USER: { - }, -} +{ CIDER: { dependencies: { tatin: "./packages/", }, dependencies_dev: { tatin: "./packages_dev=TestCases", }, distributionFolder: "Dist", init: "Initialize", make: "Admin.Make 1", parent: "#", projectSpace: "Fire", project_url: "https://github.com/aplteam/Fire", source: "APLSource", tests: "TestCases.RunTests", }, LINK: { forceFilenames: 1, watch: "ns", }, SYSVARS: { io: 1, ml: 1, }, USER: { }, } diff --git a/html/FireAndRegularExpressions.html b/html/FireAndRegularExpressions.html new file mode 100644 index 0000000..dd9f662 --- /dev/null +++ b/html/FireAndRegularExpressions.html @@ -0,0 +1,80 @@ + + + + + +Fire RegEx + + + + + +
+ +

Fire and Regular Expression

+
+
+

Fire supports Regular Expressions (RegEx). If you have never used them before you need to invest some time in order to master them. Be warned, it is everything but easy, but you will be rewared: RegEx are extremely powerful and allow you to do things with Fire that cannot be achieved by other means.

+
+ +

Case Study I: Variables assignment

+
+
+

Change assignments to a variable no matter what else is to be found on that line.

+

Imagine that in a namespace #.TestCases you have 100 or so test functions. All their names start with Test_.

+

In every one of them R (the explicit result variable) has the value 1 (for failure) assigned somewhere close to the top and the value 0 (for okay) somewhere at the end of the function.

+

You might want to assign the result of two niladic functions, ∆Failure and ∆OK to R instead of the integers.

+

If nothing else is contained on those lines then you don't need regular expressions at all, but unfortunately sometimes there is a comment on that line like ⍝ Failure or ⍝ OK, and the number of spaces between the integer and the symbol may well vary.

+

This cannot be solved without Regular Expressions.

+

Here is what you would do:

+
    +
  1. Restrict the search to the namespace #.TestCases.
  2. +
  3. Enter ^.*R←0 *⍝.*$ into the “Search for” field .
  4. +
  5. Tick the box “Is RegEx”.
  6. +
  7. Press the “Find” button.
  8. +
  9. Check the hit list and remove any functions that do not fit with the DEL key. You can also press F2 to get the hit report to make sure that you've got what you are looking for.
  10. +
  11. Click the “Replace” button.
  12. +
  13. Enter R←∆OK into the “Replace by” box.
  14. +
  15. Click the “Process” button.
  16. +
+

That way you will replace R←0 everywhere by R←∆OK.

+
+ +

Case Study II: Search repeatedly for groups of characters

+
+
+

Assuming that you have a function NGET which is called in your deeply nested application by these statements:

+
test
+ a1←↑NGET filename1
+ a2←↑NGET filename2 ⋄ b1←↑##.NGET filename3
+ a3←↑NGET filename4 ⋄ b2←↑##.NGET filename5 ⋄ c1←↑##.##.NGET filename6
+ d1←↑##.##.##.NGET filename7
+

Imagine you have changed ⎕ML everywhere from 3 to 1. Rather than using for first you must now use .

+

Obviously we need to make sure that the ##. groups survive untouched no matter how often they occur in front of NGET.

+

You can find all those statements with

+
←↑((##\.)*)(NGET)
+

That would corretly find all the occurences.

+

Even better: with ←⊃\1\3 as a replace string you can convert all the into without changing anything else.

+

That's because we can refer to groups with \1 for the first group, \2 for the second and so on, up to a maximum of 99 groups.

+

The () around (##.) make sure that this is handled as a group. The ()* around that group says: find that group zero or more times. Any number of times, actually.

+
+

Naming groups

+

Adressing groups by number can get you into trouble in several ways:

+ +

You can get around these problems by naming groups:

+

←↑(?<hashes>(##\.)*)(?<fnsCall>NGET)

+

The name of the first group is “hashes”, the second group's name is “fnsCall”

+

The corresponding replace string would read:

+

←⊃\<hashes>\<fnsCall>

+
+ + + diff --git a/html/ReadMe.html b/html/ReadMe.html new file mode 100644 index 0000000..b9da9a5 --- /dev/null +++ b/html/ReadMe.html @@ -0,0 +1,553 @@ + + + + + +Fire ReadMe + + + + + + +
+ +

Fire

+
+
+

Note that FiRe stands for FInd and REplace. Fire is a Windows-only application.

+
+ +

1. Features

+
+
+

Fire has a couple of features that Dyalog's built-in “Search” tool do not offer. These are the main features:

+ +

Fire has however many more features:

+ +
+ +

2. Fire to the rescue

+
+
+

Fire also overcomes a couple of problems that Dyalog's built-in Search tool is suffering from.

+ +
+ +

3. Prerequisites

+
+
+ +
+ +

4. Installing Fire

+
+
+
+ +

4.1. General information

+
+
+

Since version 7.1.0 Fire comes with its own installer. Just double-click it and your are done. It does not require admin rights.

+

The installer installs Fire by default into %USERPROFILE%\Documents\MyUCMDs which translates to C:\Users\{userid}\Documents\MyUCMDs with a default Windows installation. This folder, if it exists, is scanned by Dyalog for user commands.

+

Note that installing into %USERPROFILE% means that you have to install it separately for every user who wants to use Fire.

+
+ +

4.2. Get rid of pre-installer versions of Fire

+
+
+

If you have used Fire before version 7.1 then you might have installed it somewhere different. If this is the case then your are strongly advised to remove Fire (both the script Fire_uc.dyalog and the folder Fire\ from that folder before running the installer.

+

Without doing this the old installation will continue to exist, and depending on the sequence of folders Dyalog scans for user commands Dyalog might continue to execute the older version, because the first one wins.

+
+ +

4.3. Installing Fire somewhere else

+
+
+

If for some reason you decide to install Fire not in the default location but somewhere else then that's fine. Of course the hosting folder must be among the folders scanned by Dyalog for user commands; see the “User Command” tab in the Dyalog Configuration dialog.

+

If you want to change the installation folder later when you install Fire again then it is strongly recommended that you un-install it first: execute this EXE in order to achieve that:

+
%USERPROFILE%\Documents\MyUCMDs\Fire\unins000.exe
+

Without doing this the old installation will continue to exist, and depending on the sequence of folders Dyalog scans for user commands Dyalog might continue to execute the older version, because the first one wins.

+
+ +

5. Running Fire

+
+
+

After having installed Fire you can start it by executing:

+
]Fire
+

The User Command checks whether Fire is already available in ⎕SE. If that is not the case then it is copied into ⎕SE. From now on it is started directly from ⎕SE which you might find significantly faster than loading it into ⎕SE first depending on where Fire is copied from in your environment.

+

Of course you can make that change persistent by saving your session. However, when a new version of Fire comes along you need a way to load this new version. This can be achieved by specifying an optional parameter:

+
]Fire -fl
+

“fl” stands for “force load”. This loads Fire into ⎕SE no matter whether it's already there or not.

+
+ +

6. What Fire scans

+
+
+
    +
  1. Named namespaces
  2. +
  3. Scripts
  4. +
  5. Functions and operators
  6. +
  7. GUI instances which have KeepOnClose←1
  8. +
+
+ +

7. What Fire does not scan

+
+
+
    +
  1. Unnamed namespaces.
  2. +
  3. Class instances.
  4. +
  5. GUI instances which have KeepOnClose←0.
  6. +
  7. Ghostly namespaces.
  8. +
  9. References
  10. +
+
+ +

8. Anomalies

+
+
+
+ +

8.1. Scripted versus non-scripted namespaces

+
+
+

Scripted namespace are in some ways an anomaly in Dyalog APL. For example, if there is a function foo in a namespace NS then the statement NS.⎕EX 'foo' deletes the function from an ordinary (non-scripted) namespace but not from a scripted namespace, though it is removed from the namespace that is connected to the script. ⎕FX behaves similarly strange.

+

Fire processes functions and operators in scripted namespaces in the same way as in ordinary namespaces. That means that a function that carries a hit is listed on its own in both cases.

+

A namespace script as such is only listed in the hit list when it carries variable definitions or comments with hits.

+

However, this is inconsistent with what Fire does with functions and operators: in ordinary namespaces a variable is listed on it's own only when its value — not the name! — carries a hit. For scripted namespaces it's listed on its own when the value or the name carries a hit.

+

The reason for this inconsistency is that there is no good way to tell function assignments (like fns←+/) from variable assignments.

+

Since “Replace” is only available for variables of certain types anyway, this still seemed the best way to deal with the problem.

+
+ +

8.2. References

+
+
+

There are two different flavours of references to be considered:

+ +

It is possible to tell a reference pointing to a tfn from that tfn, but with a large number of functions it would slow down Fire siginificantly.

+

Worse, there is no way to tell a reference pointing to a dfn from that dfn.

+

Therefore Fire does not even attempt to identify such references. That could result in the same function listed twice in the hit list, once under its real name and once under the name of the reference.

+

That should not pose a problem, even if you perform a “Replace” operation: Fire would carry out the same operation twice, wasting a bit of time but delivering the desired result.

+
+ +

8.3. Nested scripted namespaces

+
+
+

If you attempt to change a function or operator that lives in a scripted namespace which itself lives in a scripted namespace then Fire cannot perform the change.

+

For example, given this script:

+
:Namespace Outer
+    :Namespace Inner
+        ∇ r←PI
+          r←3.14
+        ∇
+    :EndNamespace
+:EndNamespace
+

If you attempt to replace 3.14 by 3.14159265359 with Fire then that would fail; Fire will tell you BTW.

+

Here is why:

+
      ⍪c←⎕nr '#.Outer.Inner.PI'
+  r←PI
+  r←3.14
+      2⊃c
+ r←3.14
+      (2⊃c)←'r←3.14159265359'
+      #.Outer.Inner.⎕FX c
+      ⍪#.Outer.Inner.⎕NR 'PI'
+  r←PI
+  r←3.14159265359
+      #.Outer.Inner.PI
+3.14159265359
+      ⍪⎕SRC #.Outer.Inner
+     :Namespace Inner
+         ∇ r←PI
+           r←3.14
+         ∇
+     :EndNamespace
+

As you can see, by now the code in the namespace associated with the script (that's what gets executed!) is no longer in sync with the script.

+

Now this is in accordance with the documentation. When you want to change a function in a script you need to use ⎕FIX and it will work. Fire is actually doing this behind the scenes, and it works well unless scripted namespaces are nested!

+

To illustrate the problem let's start again with this script:

+
:Namespace Outer
+    :Namespace Inner
+        ∇ r←PI
+          r←3.14
+        ∇
+    :EndNamespace
+:EndNamespace
+

This time we modify not the function but the inner script:

+
      ⍪c←⎕src Outer.Inner
+     :Namespace Inner
+         ∇ r←PI
+           r←3.14
+         ∇
+     :EndNamespace
+      3⊃c
+          r←3.14
+      (3⊃c)←'r←3.14159265359'
+      Outer.⎕fix c
+      3⊃⎕src Outer.Inner
+          r←3.14159265359
+      Outer.Inner.PI
+3.14159265359
+      ⍪⎕SRC Outer
+ :Namespace Outer
+     :Namespace Inner
+         ∇ r←PI
+           r←3.14
+         ∇
+     :EndNamespace
+ :EndNamespace
+
+

This is unfortunate for two reasons:

+
    +
  1. ⎕FIX and ⎕SRC should be the inverse of each other; they are not.
  2. +
  3. As a programmer I do not have other means than ⎕FIX for modifying Inner, but that does not work.
  4. +
+

However, for the time being all Fire can do when it finds a hit in an inner namespace is to tell you, the user, that it will not be able to carry out any changes in that inner namespace.

+

Hopefully using nested namespaces will not become popular…

+
+ +

8.4. Ghostly namespaces

+
+
+

Note that Fire does not scan ghostly namespaces. These are namespaces which exist together with GUI objects as well as classes. If you did not know about ghostly namespaces then it might be best to ignore them: they can be quite confusing.

+

Ghostly namespaces exist for a very long time but until OO was introduced to Dyalog APL they were kept hidden from users.

+

If you would like to know more then consider this code:

+
      ⎕fix ':Class Test' ':EndClass'
+      Test.⎕FX'r←Hello' 'r←''World'''
+      Test.Hello
+World
+

If you are under the impression that you've created a method “Hello” in the class “Test” then you are wrong: that cannot work because the function “Hello” does not carry an “Access Public” statement, so it wouldn't be possible to call the method as a class member anyway.

+

The same is true for this:

+
      #.Test.⎕IO←0
+

This statement does not throw an error, so somehow it was successful. Referencing works as well:

+
      #.Test.⎕IO
+1
+

However, ⎕IO must be a private property of the class, so it can never be set or even referenced directly: you cannot specify anywhere an “Access Public” statement for ⎕IO.

+

But since we managed to execute these statements successfully (⎕FX 'Hello' and ⎕IO←0) the question is where they have been executed. Well, in the ghostly namespace which exists together with the class script, sharing the same name.

+

Even if Fire would show the function Hello in the hit list there is another anomaly: executing Test.⎕ed 'Hello' doesn't allow you to edit it. That means that Fire does not have the means to allow you editing the code.

+

The final obstacle: making a change to the class Test will make Hello disappear because the ghostly namespace will be re-created when the class is (re-) fixed.

+

Therefore it seems to be best to ignore ghostly namespaces altogether.

+
+ +

8.4.1. GUI objects and ghostly namespaces

+
+
+

Investigate this code:

+
      'MyForm' ⎕WC 'Form' ('KeepOnClose' 1)
+      MyForm.⎕FX'r←Hello' 'r←''World'''
+

Note that strictly speaking this is the same thing: There is a GUI object called “MyForm” but there is also a ghostly namespace holding the “Hello” function. However, Dyalog APL perfectly keeps that as a secret: it has always been that way since GUI objects were introduced into Dyalog APL a long time ago, yet nobody ever realized this because Dyalog APL behaved in a way that makes that actually impossible.

+
+ +

8.4.2. Semi-ghostly namespaces

+
+
+

Note that this code:

+
      ⎕FIX':Namespace MyNS' ':EndNamespace'
+      MyNS.⎕FX'r←Hello' 'r←''World'''
+

has consequences that make it look as if a ghostly namespace is involved when actually there isn't. Look at this:

+
      MyNS.Hello
+World
+      ⎕←⍪MyNS.⎕SRC MyNS
+ :Namespace MyNS
+ :EndNamespace
+

You can execute “Hello” but it's not part of the script - looks like a ghostly namespace is involved, right?!

+

Well, it's not. By definition a namespace script can only be changed by editing the script. Therefore the ⎕FX statement did actually add the function “Hello” to the namespace but not to the namespace script. In other words, the script and the namespace are now out of sync.

+

According to Dyalog this is not a bug but a feature.

+

BTW, this:

+
      ⎕FIX ':Namespace MyNS' '∇r←Hello2' 'r←''1 2 3''' '∇' ':EndNamespace'
+      MyNS.Hello2
+1 2 3
+      MyNS.⎕EX 'Hello2'
+      MyNS.Hello2
+VALUE ERROR
+      MyNS.Hello2
+     ∧
+

has a similar effect: the ⎕EX statement did actually remove the Hello2 function from the namespace but not from the script.

+

Note that Fire investigates the script rather than the namespace. Hello2 therefore would not pop up in Fire because it's not part of the script. If you find this confusing - so do I.

+

If you now think: “Hang on, if ⎕FX does not change a script at all, then surely a ”Replace“ operation with Fire must fail, right?” then luckily you would be wrong: Fire is smart enough to recognize the situation and manipulates - and finally fixes - the script rather than individual functions.

+

By the way, if for any reason you want to know whether there is code somewhere in a ghostly namespace then you can achieve this by executing the “Report ghosts” command from the “Reports” menu.

+

Note that code that exists in a ghostly namespace associated with an external object (Like an Excel workbook) is not reported; Fire cares about APL objects only.

+
+ +

8.5. 2 ⎕FIX with the file:// protocol

+
+
+

You can use

+
2 ⎕FIX 'file:///path/to/MyClass.aplc'
+

This will bring the class into the workspace and link it to the file.

+

If for any reason you break that link with the 5178⌶ I-Beam then it leaves behind a kind of zombie: you cannot edit the code anymore, and ⎕SRC would generate a NONCE ERROR on it, despite the fact that the code still executes.

+

Fire would not find anything inside such a zombie. Dyalogs own search tool would find stuff inside any function and any operator inside MyClass, be it private or public, but nothing outside functions and operators.

+

Our advice is to not use 2 ⎕FIX with the file protocol if you can help it; instead use

+
2 ⎕FIX ⊃⎕NGET '/path/to/MyClass.aplc
+
+ +

9. Deleting stuff

+
+
+

The “Replace” dialog has a check box “Delete lines/items with hits”. That seems to be easy enough: any lines that carry the search string are going to be deleted. However, there are details you need to be aware of:

+
    +
  1. Variables of any type are ignored.
  2. +
  3. The first and the last line of any script is never deleted, no matter whether they carry a hit or not. It should be obvious why that is.
  4. +
  5. The first line of any function or operator is never deleted, no matter whether they carry a hit or not. However, be aware of the next topic.
  6. +
  7. A tfn that carries hits on all its lines is deleted.
  8. +
  9. A one-line dfn that carries a hit is deleted.
  10. +
+
+ +

10. Tips and Tricks

+
+
+
+ +

10.1. ⎕DQ and the “Wait” method

+
+
+

Fire does not execute either ⎕DQ or Wait on its main GUI. That allows one to move the focus to the session by pressing <Ctrl+Tab> in Fire. Sadly there is no way to move the focus back to Fire without the mouse.

+

Avoiding ⎕DQ works well in many circumstances but it might cause problems when other threads are running. In that case you are advised to finish those threads before you use Fire.

+
+ +

10.2. Threads and Fire

+
+
+

Threads can pose a problem. This is particularly true for the “Replace” operation. That is the reason that the “Replace” operation cannot be triggered when other threads than the main threads are running.

+
+ +

10.3. Editing

+
+
+

When you edit one or more APL objects from Fire you can double-click another APL object in an Edit window successfully. You can also go to the session and add another Edit window to those which are already open. However, you are advised to use this with care.

+
+ +

10.4. Report “Detailed hits”

+
+
+

After having performed a search the report “Detailed hits” allows you to check the hits in context. This is particularly useful in order to find out whether the hit list needs some fine tuning.

+

Note that you can remove objects from the “Detailed hits” report, and this will also remove them from the hit list.

+
+ +

10.5. Print object name(s) to the session

+
+
+

Note that you can make Fire print the fully qualified name of all selected items in the hit list either by selecting the appropriate command from the context menu or by pressing F4.

+
+ +

10.6. Copy object name to “Search for”

+
+
+

Via the context menu or by pressing F6 you can copy the name of the currently selected object in the hit list to the “Search for” control. This option is inactive in case more than just one row of the hit list is selected.

+
+ +

10.7. The “Start looking here” control

+
+
+

You can reduce the length of the path in the “Start looking in” by one “unit” by pressing Ctrl+Backspace. For example, if the current contents of the control is

+

#.foo.my.subnamespaceNumber0911

+

then pressing Ctrl+Backspace reduces this to

+

#.foo.my

+

Note that this works only when the cursor is positioned to the right of the contents.

+

By pressing the <delete> key — when the focus is in the “Start looking here” field — you can reduce it from

+

#.foo.my.subnamespaceNumber0911

+

to just

+

#

+
+ +

10.8. Enlarge the window

+
+
+

If the hit list is too big to display all hits try pressing F8. This will enhance the height of the window to what's either necessary to display the full list or what is the maximum size of the monitor. This might not work too well on multiple-monitor systems when the screen sizes of the monitors involved are different.

+
+ +

11. Fire's API

+
+
+

Since version 8.0 Fire comes with an API, meaning that you can take adantage of some of Fire's features under program control.

+

You must make sure that Fire is available in ⎕SE. This can either be achieved by just executing the ]Fire user command or by executing ]Fire -noGUI which does load Fire into ⎕SE but does not run Fire, meaning that the GUI would not show.

+

You can then execute the appropriate methods from the namespace ⎕SE._Fire.Fire.API.

+
+ +

11.1. Searching for a string

+
+
+

Let's assume you want to search the string “abc” in ⎕SE. This is what you would do:

+
      F←⎕SE._Fire.Fire.API
+      parms←F.CreateParms
+      parms. ∆List
+ APL_Name       0
+ Greedy         0
+ Negate         0
+ Report         0
+ SearchIsRegEx  0
+ APL_Code       1
+ Case           1
+ Code           1
+ Comments       1
+ Text           1
+ Vars           1
+ StartSearchIn  #
+      parms.StartSearchIn←'⎕se'
+      parms F.Search 'abc'
+ ⎕SE.Parser        4 9.4
+ ⎕SE.SALT          2 9.4
+ ⎕SE.UnicodeFile   1 9.4
+

There are three columns:

+ +

If you want to get the hits listed set Report to 1:

+
      parms←F.CreateParms
+      parms.StartSearchIn←'⎕se'
+      parms.Report←1
+      ⎕←parms F.Search 'abc'
+ ∇⎕SE.Parser[⎕47 130 131]∇
+  [47]  (LOWER UPPER)←'abcdefghijklmnopqrstuvwxyzàáâãåèéêëòóôõöøùúûäæü' 'ABCDEFGHIJKLMNOPQRSTUVWXYZÀÁÂÃÅÈÉÊËÒÓÔÕÖØÙÚÛÄÆÜ'
+  [130] ⍝ sw←123 Switch 'abc' ⍝ if 'abc' has not been set 123 is returned.
+  [131] ⍝ If /abc=789 was specified in the parsed string the value returned will be ,789, not '789'
+ ∇⎕SE.SALT[⎕735 737]∇
+  [735] t←'0123456789abcdefghijklmnopqrstuvwxyz' ⋄ ex←ex,(⍴ex)↓'^=_'
+  [737] to←t,'aaaaaaeeeeeiiiioooooouuuunpdsccabcdefghijklmnopqrstuvwxyzaaaaaaeeeeeiiiioooooouuuudyn',ex
+ ∇⎕SE.UnicodeFile[⎕298]∇
+  [298] charset←'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789 abcdefghijklmnopqrstuvwxyz0123456789'
+
+ +

11.2. Search ⎕NL (Name List)

+
+
+

Since version 9.0 the API also allows you to search ⎕NL recursively. Note that this always searches #.

+

Let's assume you want to perform a search for “string” in the names of all objects, and that the search should not be case sensitive.

+

We can do this without further ado because the defaults fit:

+
      F.SearchQNL 'search'
+
+

If we want to search for all functions that start their names with “Search” we must use a RegEx, and it should be a case sensitive search. For that we need to set some parameters:

+
      parms←F.CreateParmsFor_QNL_Search
+      parms.∆List  ⍝ List the defaults
+ Case           0
+ FullPath       0
+ SearchFor
+ SearchIsRegEx  0
+      parms←SearchIsRegEx←1
+      parms←Case←1
+      parms F.SearchQNL '^Search'
+
+

Note that if you want to find “search” in the full path of the APL objects (like “Foo” in #.Fist.Foo.MyFunction) then you must set FullPath to 1.

+
+ +

12. Useful Regular expressions

+
+
+

There is a separate document UsefulRegExes.html available — see there.

+
+ +

13. Link and Fire

+
+
+

Since version 9.2 Fire supports Link. However, Fire needs at least Link version 3.0.0 for that to work.

+

In case only an older version is found Fire will print warnings to the session.

+
+ +

14. Salt and Fire

+
+
+

Note that managing scripts with Salt it deprecated. Use Link instead.

+

The Simple APL Library Toolkit (SALT) which is supplied with Dyalog APL is supported by Fire: when a script is managed by SALT then the script “contains” an ordinary namespace SALT_Data. This namespace contains a number of variables including

+ +

and others. SALT uses them for its own purposes.

+

When a script is re-fixed with ⎕FIX then the namespace SALT_Data disappears.

+

However, Fire works out whether a script is managed by SALT and restores the namespace SALT_Data after having re-fixed it as part of a “Replace” operation. Therefore the script continues to be managed by SALT.

+

What Fire does not do is actually saving any object via a SALT command. The simple reason is that when you change an object in the workspace it does not necessarily mean that you want to save those changes on disk. It's completely up to the programmer to make that decision.

+
+ +

15. Showing the PID in all Fire window captions

+
+
+

Dyalog allows you to specify the captions of many GUI elements like the session, the Workspace Explorer, message boxes etc. by setting certain values in the Windows Registry. For details search for “Windows captions” in the Dyalog Help.

+

In case you've added {PID} - which stands for “Process ID” - to the MessageBox value Fire will honor this and show the PID in all its GUI elements as well.

+

In case you wonder what this is good for: there are people out there who have more than just one Dyalog session running at the same time, sometimes many. In such cases it can be very useful to know the process ID a particular message box belongs to, because it can be very awkward or impossible to find out by other means.

+

Kai Jaeger — 2022-08-31

+ + diff --git a/html/ReleaseNotes.html b/html/ReleaseNotes.html new file mode 100644 index 0000000..e58d4ab --- /dev/null +++ b/html/ReleaseNotes.html @@ -0,0 +1,255 @@ + + + + + +Fire Release Notes + + + + + + +
+ +

Release Notes

+
+
+

Note that with version 9.0.0 Fire started using the concept of semantic versioning (SemVer).

+

In short this means that a bump of the major version number indicates a breaking change. For example, 9.* does not run on versions of Dyalog older than 18.0.

+

A bump of the minor number indicates added functionality plus possibly bug fixes.

+

A bump of the patch number indicates bug fixes.

+
+ +

1. Version 9.6.0 from 2023-09-11

+
+
+ +
+ +

2. Version 9.5.2 from 2023-03-25

+
+
+

Bug fix: people who do not tick “Options > Object Syntax > Expose GUI Properties” could not use “Replace”

+
+ +

3. Version 9.5.1 from 2023-03-12

+
+
+ +
+ +

4. Version 9.5.0 from 2023-02-06

+
+
+ +
+ +

5. Version 9.4.4 from 2022-12-15

+
+
+ +
+ +

6. Version 9.4.3 from 2022-12-13

+
+
+ +
+ +

7. Version 9.4.2 from 2022-11-08

+
+
+ +
+ +

8. Version 9.4.1 from 2022-09-23

+
+
+ +
+ +

9. Version 9.4.0 from 2022-09-11

+
+
+ +
+ +

10. Version 9.3.0 from 2021-12-14

+
+
+ +
+ +

11. Version 9.2.1 from 2021-10-24

+
+
+ +
+ +

12. Version 9.2.0 from 2021-10-03

+
+
+ +
+ +

13. Version 9.1.3 from 2021-04-30

+
+
+ +
+ +

14. Version 9.1.2 from 2021-04-18

+
+
+ +
+ +

15. Version 9.1.1 from 2021-04-17

+
+
+ +
+ +

16. Version 9.1.0 from 2021-04-07

+
+
+ +
+ +

17. Version 9.0.1 from 2021-04-05

+
+
+ +
+ +

18. Version 9.0.0

+
+
+ + + diff --git a/html/UsefulRegExes.html b/html/UsefulRegExes.html new file mode 100644 index 0000000..6d8458f --- /dev/null +++ b/html/UsefulRegExes.html @@ -0,0 +1,147 @@ + + + + + +Fire: Useful RegExes + + + + + + +
+ +

Useful regular expressions

+
+
+

This document aims to collect regular expressions that are particularly useful to the APL programmer.

+

This is by no means an introduction into regular expressions. It just aims to give some tips for useful regular expressions, although it tries to explain how they work.

+
+ +

1. Dotted names and ##

+
+
+

Occasionally an APL programmer wants to find all occurrences of the string ##.. For example:

+
##.MyClass.Fns 1       ⍝ Should be found
+##.##.MyClass2.Fns2 1  ⍝ Should be found, too
+#.MyClass.OtherFns 1   ⍝ Should NOT be found
+

This can be achieved with this regular expression:

+
##\.
+

If you want to find all occurrences of ##.##. but neither #. nor ##.##.## etc then this would do:

+
##\.##\.(?!#)
+

If on the other hand you want to find all references to #. but not ##. and ##.## etc:

+
(?<![#.])#\.(?!#)
+
+ +

Explanation

+
+
+

Let's analyze (?<![#.])#\.(?!#) :

+
    +
  1. (?< together with the closing ) forces the regular expression engine to look to the left of the current position. This is called a look-behind. +

    The ![#.] part reads “neither a . nor a #”. Only when this condition is met would the RegEx engine carry on trying to find a match, otherwise it would give up and move one character forward and start again.

  2. +
  3. It then tries to find a match for #. Only if this is true would the RegEx engine keep trying.
  4. +
  5. It then tries to find a # at the current position.
  6. +
  7. If that succeeds it moves forward one character and then tries to find a dot.
  8. +
  9. If that's successfull the RegEx engine would perform a look-ahead. That means it looks one character ahead without actually moving the current position, no matter whether it's a match or not. It's the (? part (together with the closing )) that does this. +

    The !#! bit reads “is not a #”.

  10. +
+

Only if all these checks are successful will the engine finally signal a hit.

+
+ +

Tests

+
+
+
      myRegEx←'(?<![#.])#\.(?!#)'
+      ⍴ myRegEx ⎕s 0 ⊣ '#.NS1.NS2.Fns 1'
+1
+      ⍴ myRegEx ⎕s 0 ⊣ '#.#.NS1.NS2.Fns 1'
+0
+      ⍴ myRegEx ⎕s 0 ⊣ '##.NS1.NS2.Fns 1'
+0
+      ⍴ myRegEx ⎕s 0 ⊣ '##.##.NS1.NS2.Fns 1'
+0
+      ⍴ myRegEx ⎕s 0 ⊣ '##.##.#.NS1.NS2.Fns 1'
+0
+
+ +

2. Finding specific numbers

+
+
+

Imagine you want to search for a specific number like 123. You don't want to find the negative version of if (¯123) but you want to find it at the beginning of a line as well as the end, and also as part of a word as in abc123xyz.

+

This can be achieved with this regular expression:

+
'(?<![0-9¯-])123([^0-9]|$)'⎕S 0 ⊣ data
+
+ +

Explanation

+
+
+

What is this doing:

+
    +
  1. (?< together with the closing ) forces the regular expression to check the position to the left of the current position; that's called a look-behind. +

    It then performs three checks defined by what's between the two square brackets:

    +
      +
    • 0-9 stands for all digits from 0 to 9
    • +
    • ¯ stands for itself: the APL character used to indicate a negative value.
    • +
    • - stands for itself: the “normal” minus character.
    • +
    +

    We add ¯ and - because we don't want to find any negative numbers.

  2. +
  3. We add a ! because we need to negate the result of the checks.
  4. +
  5. If there is a match then the engine checks whether there is a 1 at the current position. If that's the case then it moves on to the next character and checks for a “2” etc. until it has matched the 3.
  6. +
  7. Finally it checks whether the next character is either not a digit ([^0-9]) or (logical OR is represented by the | symbol) an end of line character; that's what the $ stands for.
  8. +
+
+ +

Tests

+
+
+
      ⍴'(?<![0-9¯-])123([^0-9]|$)'⎕S 0 ⊣ '123'
+1
+      ⍴'(?<![0-9¯-])123([^0-9]|$)'⎕S 0 ⊣ ' 123'
+1
+      ⍴'(?<![0-9¯-])123([^0-9]|$)'⎕S 0 ⊣ '123 '
+1
+      ⍴'(?<![0-9¯-])123([^0-9]|$)'⎕S 0 ⊣ '123 123'
+2
+      ⍴'(?<![0-9¯-])123([^0-9]|$)'⎕S 0 ⊣ '123 123 ¯123'
+2
+      ⍴'(?<![0-9¯-])123([^0-9]|$)'⎕S 0 ⊣ '123 123 ¯123 123abc123'
+4
+      ⍴'(?<![0-9¯-])123([^0-9]|$)'⎕S 0 ⊣'1234'
+0
+
+ +

3. Find a word

+
+
+

If you look for “it” but you are not interested in “itself” and “initially” then you can use word boundaries: \b:

+
      ⍴'\bit\b'⎕S 0 ⊣'This was it, initially. In itself it was...'
+2
+

However, by default word boundaries are defined by the ANSI character set. That means that it's not going to work in case Unicode characters are involved. For example:

+
      ⍴'\bit\b'⎕S 0 ⊣'itßelf'
+1
+

ß is a Unicode but not an ANSI character; it is therefore considered a word boundary by the RegEx engine. Luckily with version 16.0 of Dyalog APL a new version of the underlying PCRE library is shipped, and this version offers the option to use Unicode properties for word boundaries.

+

This new feature can be switched on and off with the “UCP” option which was introduced in version 16.0:

+
      ⍴'\bit\b'⎕S 0⍠('UCP' 1)⊣'itßelf'
+0
+

The default is 0 in order to make sure that the behaviour does not change but naturally when using the Unicode version of Dyalog you will almost certainly change it to 1. Fire does in fact use 1 as the default and does not show the option at all because the Classic version of Dyalog APL is not supported anyway.

+ + diff --git a/packages_dev/apl-buildlist.json b/packages_dev/apl-buildlist.json index a80d00c..11d6161 100644 --- a/packages_dev/apl-buildlist.json +++ b/packages_dev/apl-buildlist.json @@ -1 +1 @@ -{ packageID: [ "aplteam-Tester2-3.5.0", "aplteam-Inno-1.0.0", "aplteam-FilesAndDirs-5.5.0", "aplteam-CommTools-1.5.0", "aplteam-CodeCoverage-0.10.2", "aplteam-APLTreeUtils2-1.2.0", "aplteam-APLProcess-0.5.1", "aplteam-WinSys-5.0.1", "aplteam-OS-3.1.1", "aplteam-IniFiles-5.0.3", "aplteam-Execute-3.0.2", ], principal: [ 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, ], url: [ "https://tatin.dev/", "https://tatin.dev/", "https://tatin.dev/", "https://tatin.dev/", "https://tatin.dev/", "https://tatin.dev/", "https://tatin.dev/", "https://tatin.dev/", "https://tatin.dev/", "https://tatin.dev/", "https://tatin.dev/", ], } +{ packageID: [ "aplteam-Tester2-3.5.0", "aplteam-Inno-1.0.2", "aplteam-FilesAndDirs-5.5.0", "aplteam-CommTools-1.6.1", "aplteam-CodeCoverage-0.10.3", "aplteam-APLTreeUtils2-1.2.0", "aplteam-APLProcess-0.5.1", "aplteam-WinSys-5.0.1", "aplteam-OS-3.1.1", "aplteam-IniFiles-5.0.3", "aplteam-Execute-3.0.2", ], principal: [ 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, ], url: [ "https://tatin.dev/", "https://tatin.dev/", "https://tatin.dev/", "https://tatin.dev/", "https://tatin.dev/", "https://tatin.dev/", "https://tatin.dev/", "https://tatin.dev/", "https://tatin.dev/", "https://tatin.dev/", "https://tatin.dev/", ], } diff --git a/packages_dev/apl-dependencies.txt b/packages_dev/apl-dependencies.txt index d203921..3de9831 100644 --- a/packages_dev/apl-dependencies.txt +++ b/packages_dev/apl-dependencies.txt @@ -1,7 +1,7 @@ aplteam-APLTreeUtils2-1.2.0 aplteam-FilesAndDirs-5.5.0 -aplteam-CodeCoverage-0.10.2 +aplteam-CodeCoverage-0.10.3 aplteam-Tester2-3.5.0 aplteam-APLProcess-0.5.1 -aplteam-Inno-1.0.0 -aplteam-CommTools-1.5.0 +aplteam-Inno-1.0.2 +aplteam-CommTools-1.6.1