I’m wondering if others might spot a better way of handling this - but with 
Exercism, I’ve got 100 exercises to manage. An Exercise is a TestCase and 1 or 
more solution classes (normally 1, but sometimes several). I had initially used 
Tags to manage this, there was an ExercismExercise package, and then a tag for 
each exercise. This was quite neat and tidy - however its flawed as it doesn’t 
allow extension methods on the tags (they live on the parent package - which is 
problematic as in use, the exercises are loaded one by one from tonel files as 
the student progresses), it also does let you critique an individual exercise… 
so essentially they aren’t sub-projects and I was recommended to promote them 
to proper Packages.

This was all quite trivial to support with tags but now I have to grapple with 
the BaselineOf for my project (to manage all these exercises in development 
mode - where you want to load them all, run all their tests, and add to them 
etc).

As each exercise depends on an ExercismTestCase - I have a single pre-req for 
each one, and then, in development mode, I have to load all 100 of them. The 
best I came up with was the following - but its a hell of a lot more 
complicated than the previous tag solution where effectively the owning package 
let me do this once (and membership of that package automatically gave a tag 
this pre-req and containment behaviour).

So instead I have to do the following (and I’m left wondering if I’m missing 
some easier way). The bold bits are where I’ve tried to do something to try and 
workaround this - its the array of  packageNames that is a bit distasteful to 
me, and it feels a lot like I have to express the same information twice - one 
in the iceberg window to add all these packages, and then again in the method 
of names, to set the identical pre-req on each of them… I find in this respect, 
I’m missing Envy developer here?

Anyone have some better suggestions? Or do we need to try and make the tools 
better?

Tim

baseline: spec
        <baseline>
        
        spec
                for: #common
                do: [ 
                        self setUpExercisesFor: spec.
                        spec
                                package: 'ExercismPharo70'; "Pharo 
override/patch methods"
                                package: 'ExercismTools' 
                                        with: [ spec requires: 
#('ExercismPharo70') ];
                                
                                package: 'ExercismTests'
                                        with: [ spec requires: 
#('ExercismTools' 'ExercismMocking'), 
                                                self exerciseTestPackageNames ];
                                        
                                package: 'ExercismSystemTests'
                                        with: [ spec requires: 
#('ExercismTests') ];
                                
                                        
                                package: 'ExercismDev'
                                        with: [ spec requires: #(
                                                'OSProcess' "For shelling out 
to configlet"
                                                'Ring2' "For mentoring support 
of shadow browsing"
                                                'ExercismTools' ),  
                                                self exercisePackageNames,
                                                #('Exercism'

                                                'ExercismTests' 
                                                'ExercismSystemTests')];
                                
                                group: 'default'
                                        with: #('ExercismTools' 
'Exercise@Welcome');
                                
                                group: 'dev'
                                        with: #('ExercismDev’)].

setUpExercisesFor: spec
        self class exercisePackageNames, self class exerciseTestPackageNames 
                do:
                        [ :name | spec package: name with: [ spec requires: 
#('ExercismTools') ] ].

exercisePackageNames
        "Answer the list of exercise package names (as we don't yet have proper 
projects)"

        ^ #('Exercise@Acronym' 'Exercise@Allergies' 'Exercise@Anagram' 
'Exercise@ArmstrongNumbers' 'Exercise@AtbashCipher' 'Exercise@Binary' 
'Exercise@Bowling' 'Exercise@Clock' 'Exercise@CollatzConjecture' 
'Exercise@Darts' 'Exercise@Diamond' 'Exercise@Die' 'Exercise@Etl' 
'Exercise@Forth' 'Exercise@GradeSchool' 'Exercise@Grains' 'Exercise@Hamming' 
'Exercise@HelloWorld' 'Exercise@HighScores' 'Exercise@IsbnVerifier' 
'Exercise@Isogram' 'Exercise@Leap' 'Exercise@Luhn' 'Exercise@MatchingBrackets' 
'Exercise@Pangram' 'Exercise@Proverb' 'Exercise@Raindrops' 
'Exercise@ResistorColorDuo' 'Exercise@ReverseString' 'Exercise@RobotSimulator' 
'Exercise@RomanNumerals' 'Exercise@SecretHandshake' 'Exercise@Sieve' 
'Exercise@SpaceAge' 'Exercise@SumOfMultiples' 'Exercise@Tournament' 
'Exercise@TwelveDays' 'Exercise@TwoFer' 'Exercise@Welcome' 'Exercise@WordCount')

Reply via email to