gemtalk / rowan Goto Github PK
View Code? Open in Web Editor NEWa new project/package manager for Smalltalk that supports FileTree and Tonel repositories, and is independent of Monticello and Metacello
License: MIT License
a new project/package manager for Smalltalk that supports FileTree and Tonel repositories, and is independent of Monticello and Metacello
License: MIT License
Not quite sure what I've done but Package/Project creation quit working mysteriously.
In the test_rowan_340 repository, you can send RowanPackageDefinitionService>>createPackageNamed:inProject:
The default symbol dictionary name is 'SampleSymbolDictionaryName'. No walkbacks or failure messages in the transcript. It just doesn't show up in the category list.
Maybe pilot error, but I'm creating the packages the same way Dale and I did this morning.
Per this morning's discussion, classes that are not in Rowan now should have a class creation template with '(NONE)' in the package name. However this doesn't compile, making it difficult to do development.
RowanDefinitionService rwSubclass: 'RowanClassDefinitionService'
instVarNames: #( name comment instVarNames
classVarNames classInstVarNames superclassName subclassType
poolDictionaryNames classType packageService meta)
classVars: #()
classInstVars: #()
poolDictionaries: #()
category: 'Rowan-Services'
packageName: '(NONE)'
options: #()
a UserDefinedError occurred (error 2318), reason:halt, No package named '(NONE)' found
UserDefinedError (AbstractException) >> _signalWith: @6 line 25
UserDefinedError (AbstractException) >> signal @2 line 47
RwPrjBrowserTool (Object) >> error: @6 line 7
[] in RwPrjBrowserTool >> addOrUpdateClassDefinition:type:superclass:instVarNames:classVars:classInstVars:poolDictionaries:category:packageName:options: @29 line 6
RwGsImage class >> loadedPackageNamed:ifAbsent: @5 line 11
RwPrjBrowserTool >> _loadedPackageNamed:ifAbsent: @3 line 3
RwPrjBrowserTool >> addOrUpdateClassDefinition:type:superclass:instVarNames:classVars:classInstVars:poolDictionaries:category:packageName:options: @3 line 5
RowanDefinitionService class (Class) >> rwSubclass:instVarNames:classVars:classInstVars:poolDictionaries:category:packageName:options: @6 line 4
Executed Code @2 line 1
GsNMethod >> _executeInContext: @1 line 1
String >> evaluate @5 line 9
JadeServer64bit34 (JadeServer) >> sbClass: @5 line 5
JadeServer64bit34 (JadeServer) >> systemBrowserCommand @74 line 24
[] in JadeServer >> systemBrowserA: @23 line 10
Time class >> secondsElapsedTime: @6 line 11
Time class >> millisecondsElapsedTime: @2 line 6
JadeServer64bit34 (JadeServer) >> millisecondsElapsedTime: @2 line 3
JadeServer64bit34 (JadeServer) >> systemBrowserA: @3 line 4
JadeServer64bit34 (JadeServer) >> systemBrowser: @3 line 2
[] in JadeServer64bit >> systemBrowser: @7 line 4
ExecBlock0 (ExecBlock) >> on:do: @3 line 44
JadeServer64bit34 (JadeServer64bit) >> systemBrowser: @3 line 5
GsNMethod class >> _gsReturnToC @1 line 1
In a rowan-aware class, you can create a method by sending rwCompileMethod:category: to a behavior. The creation of new methods works fine.
Make a change to the method and compile again and it fails with this error.
a UserDefinedError occurred (error 2318), reason:halt, Internal error -- no existing LoadedMethod found for the old compiledMethod.
UserDefinedError (AbstractException) >> _signalWith: @6 line 25
UserDefinedError (AbstractException) >> signal @2 line 47
RwGsPackageSymbolDictionary (Object) >> error: @6 line 7
[] in RwGsPackageSymbolDictionary >> addRecompiledMethod: @38 line 35
IdentityKeyValueDictionary >> at:ifAbsent: @26 line 19
RwGsPackageSymbolDictionary >> addRecompiledMethod: @15 line 32
RwGsMethodSourceSymbolDictPatch >> installSourcePatch @3 line 5
[] in RwGsPatchSetBasic >> updateMethodDictionaries @13 line 10
[] in Set >> do: @8 line 11
KeyValueDictionary >> keysDo: @20 line 18
Set >> do: @4 line 11
RwGsPatchSetBasic >> updateMethodDictionaries @4 line 10
RwGsPatchSetBasic >> apply @19 line 24
RwGsImage class >> applyModification: @11 line 9
RwPrjLoadTool >> loadProjectSetDefinition: @14 line 13
[] in RwPrjBrowserTool >> addOrUpdateMethod:inProtocol:forClassNamed:isMeta:inPackageNamed: @69 line 55
[] in RwPrjBrowserTool >> addOrUpdateMethod:inProtocol:forClassNamed:isMeta:inPackageNamed: @79 line 63
[] in RwAbstractTool >> definitionsForClassNamed:ifFound:ifAbsent: @20 line 11
RwGsImage class >> loadedClassNamed:ifFound:ifAbsent: @10 line 11
RwPrjBrowserTool (RwAbstractTool) >> definitionsForClassNamed:ifFound:ifAbsent: @4 line 4
RwPrjBrowserTool >> addOrUpdateMethod:inProtocol:forClassNamed:isMeta:inPackageNamed: @13 line 60
RwPrjBrowserTool >> addOrUpdateMethod:inProtocol:forClassNamed:isMeta: @13 line 29
MyNewClass class (Behavior) >> rwCompileMethod:category: @8 line 4
[] in JadeServer64bit3x >> compileMethod:behavior:symbolList:inCategory: @12 line 7
ExecBlock0 (ExecBlock) >> on:do: @3 line 44
[] in JadeServer64bit3x >> compileMethod:behavior:symbolList:inCategory: @8 line 13
ExecBlock0 (ExecBlock) >> on:do: @3 line 44
JadeServer64bit34 (JadeServer64bit3x) >> compileMethod:behavior:symbolList:inCategory: @3 line 15
JadeServer64bit34 (JadeServer) >> sbSaveMethod: @13 line 9
JadeServer64bit34 (JadeServer) >> systemBrowserCommand @122 line 40
[] in JadeServer >> systemBrowserA: @23 line 10
Time class >> secondsElapsedTime: @6 line 11
Time class >> millisecondsElapsedTime: @2 line 6
JadeServer64bit34 (JadeServer) >> millisecondsElapsedTime: @2 line 3
JadeServer64bit34 (JadeServer) >> systemBrowserA: @3 line 4
JadeServer64bit34 (JadeServer) >> systemBrowser: @3 line 2
[] in JadeServer64bit >> systemBrowser: @7 line 4
ExecBlock0 (ExecBlock) >> on:do: @3 line 44
JadeServer64bit34 (JadeServer64bit) >> systemBrowser: @3 line 5
GsNMethod class >> _gsReturnToC @1 line 1
Not sure if this is a bug, but opening issue if it is undesirable.
Running RwHybridBrowserToolTest sunit tests creates the symbol dictionary RowanTestData and leaves around the classes SimpleHybrid1, etc.
GS Jade doesn't have a tool (that I can yet find) to file out class categories.
Is there a class category fileout available in the server?
(I'd like to backup my code independently of Rowan for now. I lost yesterday's work when I rebuilt this morning.)
https://github.com/dalehenrich/Rowan#gsdevkit_home-rowan-installation
Creating the Rowan stone leaves you in $GS_HOME/GsDevKit_home/shared/repos/tode. The next cd is incorrect.
I believe the correct next step is
cd $GS_HOME/shared/repos
or cd ../
Currently the initialization order is unspecified:
runInitializers
"run the class initialization methods as needed"
(addedMethods copy
addAll: extendedMethods;
addAll: methodsNeedingRecompile;
yourself) do: [ :methodPatch | methodPatch runInitializer ]
RwPackageProjectSpecification>>packageNamesInLoadOrder should be renamed to RwPackageProjectSpecification>>packageNamesInInitializationOrder (load order is immaterial because of atomic loading - at least at the moment) and the the initializers should be run in package initialization order (first) and class hierarchy order (secondary) ...
Even though I created the method MyNewClass>>createdWithRowan with the rwCompileMethod:category and MyNewClass is a rowan-aware class, sending rowanPackageName
and rowanProjectName
to the compiled method returns (NONE)
Sending the same methods to the compiled method fnoodle3
correctly finds the package and project.
Sending method classCreationTemplateForClass:hybridBrowser: to RowanDefinitionService results in this class definition string, however this method does not appear to be implemented in Rowan:
Object rwSubclass: 'RowanDefinitionService'
instVarNames: #( definition)
classVars: #()
classInstVars: #()
poolDictionaries: #()
inDictionary: ''
category: 'Rowan-Services'
options: #()
In order to update the Dolphin/GS Jade browsers, it would be helpful if the return value of a successful method compile contained this information - method oop, selector.
In particular, RwPrjBrowserTool>>addOrUpdateMethod:inProtocol:forClassNamed:isMeta:inPackageNamed:?
currently returns a RwProjectSetModification. โ
It's not clear to me how to navigate through that object to return the above information.
If you try to clone an already cloned repository, Rowan will attach to the existing clone.
We need an additional message saying that even though the clone was not cloned, it still was attached.
Doing a sender of #halt reveals a long list in the server.
It's unclear how many of these should be cleaned up before the pilot project is released to the customer.
I updated Rowan via the update script, then realized I had not updated my services category. So I recovered, then pushed services to the Rowan shared git repository. I then tried the update rowan script again and it failed with this error.
Dead in water.
topaz > exec iferr 3 : exit 1
Logging out session 1.
--- 04/05/2018 15:30:50.508 PDT Logging out
Error on or near line 64 :: startTopaz test_rowan_340 -l :: startTopaz test_rowan_340 -l
This would be a short-term hack for showing differences in 'hybrid Jade'
Note -Hybrid Jade is the 'quick and dirty' way to get Rowan development in Jade
Too often, I either can't reference an Rowan object (method, class, package, project) by name when I think I should, or I inadvertently try to 're-add' an object that I added before because I referenced it's name.
Here is one use case:
I'm unable to get around this.
In order to use the recently-added #rwCompileMethod's on Behavior, is it required to have created the package first?
(I don't have a way for you to easily reproduce this walkback)
UserDefinedError (AbstractException) >> _signalWith: @6 line 25
UserDefinedError (AbstractException) >> signal @2 line 47
RwPrjBrowserTool (Object) >> error: @6 line 7
[] in RwPrjBrowserTool >> addOrUpdateMethod:inProtocol:forClassNamed:isMeta: @13 line 18
RwGsImage class >> loadedHybridPackageNamed:ifAbsent: @5 line 14
Rowan class >> loadedHybridPackageNamed:ifAbsent: @3 line 3
RwPrjBrowserTool >> addOrUpdateMethod:inProtocol:forClassNamed:isMeta: @3 line 15
RowanMethodDefinitionService class (Behavior) >> rwCompileMethod:category: @8 line 4
[] in JadeServer64bit3x >> compileMethod:behavior:symbolList:inCategory: @12 line 7
ExecBlock0 (ExecBlock) >> on:do: @3 line 44
[] in JadeServer64bit3x >> compileMethod:behavior:symbolList:inCategory: @8 line 13
ExecBlock0 (ExecBlock) >> on:do: @3 line 44
JadeServer64bit34 (JadeServer64bit3x) >> compileMethod:behavior:symbolList:inCategory: @3 line 15
JadeServer64bit34 (JadeServer) >> sbSaveMethod: @13 line 9
JadeServer64bit34 (JadeServer) >> systemBrowserCommand @122 line 40
[] in JadeServer >> systemBrowserA: @23 line 10
Time class >> secondsElapsedTime: @6 line 11
"rowanStack.gs" [dos] 25L, 1585C 1,1 Top
What is the api for determining a Rowan object's change/modification/dirty state?
I found RwLoadedPackage inst var isDirty, but that is only for packages and I would expect that any RwLoadedThing should have an api for identifying changes. (Maybe not RwLoadedMethod)
Somehow, we need to show changes in the image made to packages and projects. This could use the existing McPatch support in Jade for packages or we can do string diffs.
Executing the recently-changed class creation template for non-rowan packages gives a walkback presumably because the dictionary is missing.
To reproduce, execute this string:
RowanDefinitionService subclass: 'RowanProjectDefinitionService'
instVarNames: #(name)
classVars: #()
classInstVars: #()
poolDictionaries: #()
category: 'Rowan-Services'
inDictionary: ''
options: #()
which was generated by:
^self browserTool classCreationTemplateForClass: RowanProjectDefinitionService hybridBrowser: true.
a MessageNotUnderstood occurred (error 2010), a String does not understand #'at:otherwise:'
MessageNotUnderstood >> defaultAction @3 line 3
MessageNotUnderstood (AbstractException) >> _signalWith: @6 line 25
MessageNotUnderstood (AbstractException) >> signal @2 line 47
String (Object) >> doesNotUnderstand: @10 line 10
String (Object) >> _doesNotUnderstand:args:envId:reason: @8 line 13
RowanDefinitionService class (Class) >> _classNamed:inDictionary: @9 line 5
RowanDefinitionService class (Class) >> subclass:instVarNames:classVars:classInstVars:poolDictionaries:inDictionary:options: @2 line 34
RowanDefinitionService class (Class) >> subclass:instVarNames:classVars:classInstVars:poolDictionaries:category:inDictionary:options: @3 line 10
Executed Code @2 line 1
GsNMethod >> _executeInContext: @1 line 1
String >> evaluate @5 line 9
JadeServer64bit34 (JadeServer) >> sbClass: @5 line 5
JadeServer64bit34 (JadeServer) >> systemBrowserCommand @74 line 24
[] in JadeServer >> systemBrowserA: @23 line 10
Time class >> secondsElapsedTime: @6 line 11
Time class >> millisecondsElapsedTime: @2 line 6
JadeServer64bit34 (JadeServer) >> millisecondsElapsedTime: @2 line 3
JadeServer64bit34 (JadeServer) >> systemBrowserA: @3 line 4
JadeServer64bit34 (JadeServer) >> systemBrowser: @3 line 2
[] in JadeServer64bit >> systemBrowser: @7 line 4
ExecBlock0 (ExecBlock) >> on:do: @3 line 44
JadeServer64bit34 (JadeServer64bit) >> systemBrowser: @3 line 5
GsNMethod class >> _gsReturnToC @1 line 1
RwPrjBrowserTool>>classCreationTemplateForSubclassOf:category: passes in a category parameter but doesn't use it.
Probably should either use the parameter or remove it.
Here is the tail end of running
./newBuild_rowan
topaz 1>
topaz 1> commit
Successful commit
topaz 1>
topaz 1> run
| packageManager repo |
packageManager := CypressPackageManager3 new.
repo := CypressAbstractRepository
onUrl: (CypressUrl absoluteFromText: 'tonel:/foos2/users/ewinger/GsDevKit_home/shared/repos/Rowan/src/tonel/' )
alias: ''.
packageManager
defaultSymbolDictionaryName: #'UserGlobals'.
#('Cypress-Core' 'Rowan-Url' 'Rowan-Core' 'Rowan-GemStone' 'Rowan-Cypress' 'Rowan-Tests' 'Rowan-Tode')
do: [ :packageName |
packageManager
addResolvedReference:
(CypressResolvedReference name: packageName repository: repo) ].
packageManager loadResolvedReferences
%
ERROR 2710 , a CypressAddition(add: a CypressMethodDefinition(TDRowanTool class>>initialize)) failed because a MessageNotUnderstood occurred (error 2010), a UndefinedObject does not understand #'repositoryTools' (CypressLoaderError)
topaz 1>
topaz 1> run
Rowan addProject: (STON fromString: (GsFile openReadOnServer: '/foos2/users/ewinger/GsDevKit_home/server/stones/test_rowan_340/rowanSpec.ston') contentsOfEntireFile)
%
ERROR 2010 , a MessageNotUnderstood occurred (error 2010), a UndefinedObject does not understand #'image' (MessageNotUnderstood)
topaz 1> commit
Successful commit
topaz 1> exit
Logging out session 1.
--- 03/08/2018 17:12:06.412 PST Logging out
**Error on or near line 64 :: startTopaz test_rowan_340 -l :: startTopaz test_rowan_340 -l**
ewinger@foos:/foos2/users/ewinger/GsDevKit_home/server/stones/test_rowan_340$
packageNamesInLoadOrder and addPackageNamed: needs to be kept in sync ... adding a new package that is not in packageNamesInLoadOrder might throw an error or might be automatically added to the list ...
https://github.com/dalehenrich/Rowan#gsdevkit_home-rowan-installation
The final step of the installation failed.
ewinger@foos:/foos2/users/ewinger/GsDevKit_home/shared/repos$ startClient tode
"================="
GsDevKit script: startClient tode
path: /foos2/users/ewinger/GsDevKit_home/bin/startClient
"================="
"================="
GsDevKit script: startClient tode
path: /foos2/users/ewinger/GsDevKit_home/dev/clients/tode/startClient
"================="
Pharo STDOUT routed to: /foos2/users/ewinger/GsDevKit_home/dev/clients/tode/logs/tode.log
/foos2/users/ewinger/GsDevKit_home/dev/clients/tode/startClient: line 186: kill: (3929) - No such process
Error on or near line 186 :: startClient tode :: startClient tode
Error on or near line 70 :: startClient tode :: startClient tode
Note. During a prior step, I noticed a potential error message. Shell history didn't go back far enough to see which command it was. It may be related.
Warning: LOCK ENFORCED: Attempt to 'load with conflicts' new project: 'BaselineOfGrease [baseline] from github://GsDevKit/Grease:master/repository' when existing project: 'BaselineOfGrease [baseline] from filetree:///foos2/users/ewinger/GsDevKit_home/shared/repos/Grease/repository' is locked. New project not loaded. Use #onLock: to intercept.
I don't know if it is needed for the pilot, but we may wish to create and post a license statement on the git projects for both Rowan and GS_Jade sometime soon.
I suggest that the tonel reader either add file and line number of each method
to the metadata, or append a comment to the source string that goes into
the smalltalk compiler. Then when debugging you have info to help
validate where the source came from and debug any tool problems.
Updating yesterday, this expression fails
Rowan projectTools diff diffForProjectName: 'Rowan'
with this stack
a UserDefinedError occurred (error 2318), reason:halt, No loaded project named 'Rowan' found
UserDefinedError (AbstractException) >> _signalWith: @6 line 25
UserDefinedError (AbstractException) >> signal @2 line 47
RwGsImage class (Object) >> error: @6 line 7
[] in RwGsImage class >> loadedProjectNamed: @10 line 5
[] in RwGsImage class >> loadedProjectNamed:ifAbsent: @11 line 23
StringKeyValueDictionary >> at:ifAbsent: @15 line 10
RwGsImage class >> loadedProjectNamed:ifAbsent: @6 line 8
RwGsImage class >> loadedProjectNamed: @3 line 4
RwPrjDiffTool >> diffForProjectName: @4 line 4
Executed Code @4 line 1
GsNMethod class >> _gsReturnToC @1 line 1
But this expression still works
(Rowan projectTools diff diffSpecUrl: 'Rowan') asString.
I lost some server code today, presumably from a bad class compilation. I only discovered it sometime later and was able to manually recover all the methods from a prior version of the class.
However, this serves as a reminder that it would be a good exercise to walk through recovering an older version of a method in Rowan. I'd like to do that next week if possible.
The RwPrjBrowserTool doesn't seem to have any api's for adding or removing method categories (that I can find).
What are the api methods?
Package names cannot be used across projects. (at the moment).
If you try to add a package name that already exists, Rowan should handle that.
There are three different use cases:
forceDeleteProjectNamed:
... which is disown
and explicit delete
of classes from symbol dictionaries and extension methods ... this is to be used if there is a bug that prevents deleteProjectNamed:
from working.deleteProjectNamed:
... which simply does a load of the project with no packages followed by a delete of the project.deleteProjectNamed:
needs to have an option to recursively delete dependent projects, otherwise, it should fail if any other projects require
the project to be deleted ... this todo item now part of issue #200I vaguely remember Dale telling me that the current code in TDRowanProjectBrowser>>deleteAllProjectsMenuAction:selectionIndex: was dangerous.
What is the proper code for removing a project from an image given only it's name?
Currently, for example, RowanPackageDefinitionService is in the Rowan-Services category. If I want to compile a method, I have to turn off the rwCompileMethod* hooks and compile the traditional way.
I want to be able to compile every method and class using a rowan api. To get there, we need to:
I ran
(Rowan projectTools diff diffSpecUrl: 'Rowan') asString.
but the string I got contained many changes which I didn't make.
I may just need to update but would like to walk through my check-in with you tomorrow.
Start of file -----
==================== Cypress-Core NO CHANGES ====================
==================== Rowan-Url NO CHANGES ====================
==================== Rowan-Core (-) --> disk (+) ====================
Item was changed:
----- Method: RwLoadedProject class>>newForLoadSpecification: (in category 'instance creation') -----newForLoadSpecification: aLoadSpecification
+ ^ self new initializeForLoadSpecification: aLoadSpecification!
- ^ self new
- initialize;
- initializeForLoadSpecification: aLoadSpecification;
- yourself!
==================== Rowan-Definitions NO CHANGES ====================
==================== Rowan-GemStone (-) --> disk (+) ====================
Item was removed:
- ----- Method: Behavior>>rwRemoveSelector: (in category '*rowan-gemstone') -----rwRemoveSelector: methodSelector
- ^ Rowan projectTools browser
- removeMethod: methodSelector
- forClassNamed: self thisClass name asString
- isMeta: self isMeta!
==================== Rowan-Cypress NO CHANGES ====================
==================== Rowan-Tools (-) --> disk (+) ====================
Item was changed:
----- Method: RwPkgDiffTool>>patchForPackageName: (in category 'smalltalk api') -----patchForPackageName: packageName
+ | loadedPackage loadedProject |
- | loadedPackage loadedProject repo diskSnapshot imageSnapshot |
loadedPackage := Rowan image loadedPackageNamed: packageName.
<snip>
Executing this bit of smalltalk code yields a walkback:
Rowan loadedPackageOfClass: Object
MessageNotUnderstood >> defaultAction @3 line 3
MessageNotUnderstood (AbstractException) >> _signalWith: @6 line 25
MessageNotUnderstood (AbstractException) >> signal @2 line 47
RwGsLoadedPackage class (Object) >> doesNotUnderstand: @10 line 10
RwGsLoadedPackage class (Object) >> _doesNotUnderstand:args:envId:reason: @8 line 13
RwGsPlatform >> loadedPackageOfClass: @3 line 4
Rowan class >> loadedPackageOfClass: @2 line 4
Executed Code @2 line 1
GsNMethod class >> _gsReturnToC @1 line 1
~
After successfully loading Rowan I tried to run a random test, RwLoadingTest>>testMethodDelete.
However, it failed with this stack. The configuration instance variable is nil. That implies some missing
setup is needed to run the tests.
MessageNotUnderstood >> defaultAction @4 line 3
MessageNotUnderstood (AbstractException) >> _signalWith: @6 line 25
MessageNotUnderstood (AbstractException) >> signal @2 line 47
UndefinedObject (Object) >> doesNotUnderstand: @10 line 10
UndefinedObject (Object) >> _doesNotUnderstand:args:envId:reason: @8 line 13
Rowan class >> updateLoadedPackages @3 line 9
Rowan class >> loadedPackagesNamed: @3 line 10
Rowan class >> loadedPackageDefinitionsNamed: @2 line 6
RwLoadingTest >> loadAndTestPackagesNamed:loaded:using: @5 line 7
RwLoadingTest >> loadAndTestPackagesNamed:using: @2 line 3
RwLoadingTest >> testMethodDelete @13 line 20
RwLoadingTest (Object) >> perform: @1 line 1
RwLoadingTest (TestCase) >> performTest @3 line 2
[] in TestCase >> runCase @14 line 5
ExecBlock0 (ExecBlock) >> ensure: @2 line 12
RwLoadingTest (TestCase) >> runCase @5 line 6
[] in TestCase >> debug @9 line 2
ExecBlock0 (ExecBlock) >> ensure: @2 line 12
RwLoadingTest (TestCase) >> debug @3 line 3
RwLoadingTest class (TestCase class) >> debug: @3 line 3
[] in JadeServer >> sbRunMethodTests: @14 line 6
Array (Collection) >> do: @6 line 10
JadeServer64bit34 (JadeServer) >> sbRunMethodTests: @9 line 6
"rowanTestStack.st" [dos] 24L, 1251C 1,1 Top
The rule for running initializers is that all new or changed class-side methods with the #initialize
selector should be executed with the following method:
:
runInitializers
"run the class initialization methods as needed"
(addedMethods copy
addAll: extendedMethods;
addAll: methodsNeedingRecompile;
yourself) do: [ :methodPatch | methodPatch runInitializer ]
I believe that extendedMethods
is exclusively used for added and changed extensions methods, but we need tests to validate that the initializations are handled correctly. Note that we need to include #initialize
methods being moved between packages in the test case to make sure that moves are excluded..
In GS Jade, a user can add and remove Rowan packages from their view. We need an api in a definition class to do both.
Creating a package means to "create from scratch."
Removing a package with classes and extensions is to be determined.
This may already have been discussed, but I am bringing up for a refresher.
I think that the 'tools' references in Rowan should be hidden from the api. When I created a sample package, I ended up with code that looked like this:
| projectService |
projectService := RowanProjectDefinitionService new.
projectDefinition := projectService createSampleProject.
self browserTool removePackageNamed: self samplePackageName.
self projectTools load loadProjectDefinition: projectDefinition.
projectDefinition addPackageNamed: self samplePackageName.
The successive calls to browserTool and projectTools are not intuitive.
Perhaps we can discuss?
In order to see the list of loadedProjects & loadedPackages, I iterated over
Rowan image loadedProjects
then sending
loadedPackages
to each project.
I shouldn't be doing this. Instead, I should use a tool to get those lists. What is that api?
I couldn't find it in
RwPrjBrowserTool
nor the definition classes. You may have told me but I can't remember if you did.
https://github.com/dalehenrich/Rowan#gsdevkit_home-rowan-installation
It would be nice if the installation instructions included
I suspect I've done something wrong, but the failure is deep enough in the Rowan code that there may be something else going on.
To reproduce, file in the attached .gs file and run:
RowanMethodDefinitionService new createSampleMethod.
(Note that the attached file is .txt because GitHub won't let me attach a .gs file :( )
MessageNotUnderstood >> defaultAction @3 line 3
MessageNotUnderstood (AbstractException) >> _signalWith: @6 line 25
MessageNotUnderstood (AbstractException) >> signal @2 line 47
SymbolDictionary (Object) >> doesNotUnderstand: @10 line 10
SymbolDictionary (Object) >> _doesNotUnderstand:args:envId:reason: @8 line 13
RwGsPackageAdditionSymbolDictPatch >> createLoadedPackage @5 line 5
[] in RwGsPatchSetBasic >> addAndUpdateLoadedPackages @6 line 5
[] in Set >> do: @8 line 11
KeyValueDictionary >> keysDo: @20 line 18
Set >> do: @4 line 11
RwGsPatchSetBasic >> addAndUpdateLoadedPackages @2 line 5
RwGsPatchSetBasic >> apply @11 line 14
RwGsImage class >> applyModification: @11 line 9
RwPrjLoadTool >> loadProjectSetDefinition: @14 line 13
RwPrjLoadTool >> loadProjectDefinition: @6 line 7
RowanPackageDefinitionService >> createSamplePackage @11 line 10
RowanClassDefinitionService >> createSampleClass @5 line 5
RowanMethodDefinitionService >> createSampleMethod @5 line 6
GsNMethod class >> _gsReturnToC @1 line 1
[RowanServices.txt](https://github.com/dalehenrich/Rowan/files/1798286/RowanServices.txt)
~
... probably good idea to include constraints in Rowan, since they are not quite going away ...
Executing this in a gemstone workspace gives a does not understand.
Rowan projectTools diff diffForProjectName: 'Rowan'
RowanService>>createSymbolDictionaryNamed: is the method with a reference to RwGsPackageSymbolDictionary. Once I've merged the issue_27 branch into master, you'll be able to create a regular SymbolDictionary in this method and the SymbolDictionary will be rowanized when it is used.
Let's talk on Monday about the best way to do this:
I'll probably go with option 1 over the weekend since I expect to get the new SymbolDictionary code working today and I want the class to be gone at least while I am getting things working ...
Trying to load 'RowanSimple1' and got this walkback.
a MessageNotUnderstood occurred (error 2010), a UndefinedObject does not understand #'asRwRepository'
MessageNotUnderstood >> defaultAction @3 line 3
MessageNotUnderstood (AbstractException) >> _signalWith: @6 line 25
MessageNotUnderstood (AbstractException) >> signal @2 line 47
UndefinedObject (Object) >> doesNotUnderstand: @10 line 10
UndefinedObject (Object) >> _doesNotUnderstand:args:envId:reason: @8 line 13
RwPrjReadTool >> readProjectSetForProjectNamed: @8 line 5
RwPrjLoadTool >> loadProjectNamed: @5 line 7
RowanProjectService >> loadProjectNamed: @4 line 3
GsNMethod class >> _gsReturnToC @1 line 1
I'm just calling this code with 'RowanSimple1'
Rowan projectTools load loadProjectNamed: aName
What is the api for determining if a project exists on disk?
Basically, I'd like to know what information has to be present in order for this command to work:
^(Rowan projectTools diff diffSpecUrl: name) asString.
I suppose it would be good to know the api's for setting that information as well.
Create a package named 'examples' in project 'RowanProject'.
Committed my gemstone transaction.
Then I tried to compile a method RowanPackageDefinitionService>>createPackageNamed:inProject:
Got the error below.
My code sent #rwCompileMethod: category: 'examples' to the behavior.
UserDefinedError (AbstractException) >> _signalWith: @6 line 25
UserDefinedError (AbstractException) >> signal @2 line 47
RwGsPackageSymbolDictionary (Object) >> error: @6 line 7
[] in RwGsPackageSymbolDictionary >> ensureExtensionClassNamed:existsForPackageNamed: @20 line 8
RwGsPackageSymbolDictionary (SymbolDictionary) >> at:ifAbsent: @13 line 18
RwGsPackageSymbolDictionary >> ensureExtensionClassNamed:existsForPackageNamed: @4 line 5
RwGsClassExtensionSymbolDictPatch >> installClassExtensionInSystem @17 line 16
[] in RwGsPatchSetBasic >> installAddedClassExtensions @5 line 3
[] in Set >> do: @8 line 11
KeyValueDictionary >> keysDo: @20 line 18
Set >> do: @4 line 11
RwGsPatchSetBasic >> installAddedClassExtensions @2 line 3
RwGsPatchSetBasic >> apply @15 line 19
RwGsImage class >> applyModification: @11 line 9
RwPrjLoadTool >> loadProjectSetDefinition: @14 line 13
[] in RwPrjBrowserTool >> addOrUpdateMethod:inProtocol:forClassNamed:isMeta:inPackageNamed: @69 line 55
RwPrjBrowserTool >> addOrUpdateMethod:inProtocol:forClassNamed:isMeta:inPackageNamed: @24 line 85
RwPrjBrowserTool >> addOrUpdateMethod:inProtocol:forClassNamed:isMeta: @6 line 23
RowanPackageDefinitionService class (Behavior) >> rwCompileMethod:category: @8 line 4
[] in JadeServer64bit3x >> compileMethod:behavior:symbolList:inCategory: @12 line 7
ExecBlock0 (ExecBlock) >> on:do: @3 line 44
[] in JadeServer64bit3x >> compileMethod:behavior:symbolList:inCategory: @8 line 13
ExecBlock0 (ExecBlock) >> on:do: @3 line 44
JadeServer64bit34 (JadeServer64bit3x) >> compileMethod:behavior:symbolList:inCategory: @3 line 15
JadeServer64bit34 (JadeServer) >> sbSaveMethod: @13 line 9
JadeServer64bit34 (JadeServer) >> systemBrowserCommand @122 line 40
[] in JadeServer >> systemBrowserA: @23 line 10
Time class >> secondsElapsedTime: @6 line 11
Time class >> millisecondsElapsedTime: @2 line 6
JadeServer64bit34 (JadeServer) >> millisecondsElapsedTime: @2 line 3
JadeServer64bit34 (JadeServer) >> systemBrowserA: @3 line 4
JadeServer64bit34 (JadeServer) >> systemBrowser: @3 line 2
[] in JadeServer64bit >> systemBrowser: @7 line 4
ExecBlock0 (ExecBlock) >> on:do: @3 line 44
JadeServer64bit34 (JadeServer64bit) >> systemBrowser: @3 line 5
GsNMethod class >> _gsReturnToC @1 line 1
I retrieve all the loadedPackages in my image with this code:
| stream loadedProjects |
stream := WriteStream on: String new.
loadedProjects := Rowan image loadedProjects.
loadedProjects do:
[:project |
project loadedPackages do:
[:package |
stream
nextPutAll: package name;
lf]].
^stream contents
'Goo
Aaa
Foo
HybridC-Extensions
HybridC-Core
HybridB-Core
Simple-Core
Rowan-EndOfDay
Simple-Extension2
Simple-Extension1
Simple-Core
'
Then I run this code and get the error below.
Rowan image loadedPackageNamed: 'HybridC-Core'.
a UserDefinedError occurred (error 2318), reason:halt, No loaded package named 'HybridC-Core' found
Note that this package was created with a Rowan test. Not sure which.
A declarative, efficient, and flexible JavaScript library for building user interfaces.
๐ Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. ๐๐๐
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google โค๏ธ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.