go to post Ben Spead · May 21, 2019 Per your second question, best practice is generally to use System Defaults which are set in your Namespace and store the production settings (rather than storing them in the Production class). This allows you to prevent having to have differences in the Production class between branches.
go to post Ben Spead · May 2, 2019 Steve - #2 is helpful if you want to leverage existing structures for authentication, auditing, transport or other functions that rely on CSP sessions . This can be used as part of a strategy of incrementally moving an application from a CSP-based architecture to Angular.
go to post Ben Spead · Apr 8, 2019 If your machine is virtualized, just clone the VM (that is what we do for all of our test upgrades). NOTE - make sure to stand it up on an isolated network segment so that it doesn't try to do any inbound file processing or other communication that it should not (especially if you clone LIVE).
go to post Ben Spead · Apr 5, 2019 @Peter Cooper Thanks again for sharing the start of your journey with the Community. I am curious if you are planning to provide another Update Article? I would love to hear about how your journey has progressed over the past year and what you have learned along the way which could help others!Cheers,Ben
go to post Ben Spead · Mar 18, 2019 Bouncing off of @Robert.Cemper 's hints, if you are using a default SMP (system management portal) login you can just pass in the arguments for the username and password fields as follows:https://mytest.myserver.com/csp/sys/UtilHome.csp?CacheUserName=tech&CachePassword=demoI just tested this and it worked like a charm :) (use your own credentials of course)
go to post Ben Spead · Mar 11, 2019 Exactly! We are actively using it internally within InterSystems - both in internal application development, and in HealthShare product development. As discussed in the video we have found incredible value in this tool for decreasing technical debt (and making sure new changes don't add to it). We thought customers might find the value in it as well.
go to post Ben Spead · Mar 11, 2019 @Mike.Davidovich You are most welcome. In terms of why TestCoverage was released on OpenExchange, it is something we have been exploring internally last year and wanted to share with the Community in time for Global Summit 2018. In terms of whether or not it will actually make it into product, I can't speak to that but perhaps the author @Timothy Leavitt can comment on that (I believe there were at least exploratory discussions with Product Management on this topic).
go to post Ben Spead · Mar 6, 2019 The first half of that should be helpful. Code coverage may be helpful too if they are able to move into a CI type BUILD infrastructure (I don't know how well Test Coverage would work in a more dynamic Dev environment as longitudinal history might be harder to maintain ... haven't really thought about that too much before...)
go to post Ben Spead · Mar 6, 2019 Mike,We're using UnitTesting for application validation for internal application development within InterSystems. If you have any specific questions, feel free to create new Questions in the D.C. and tag me, or if you would prefer a general discussion you can ask your Account Manager or Sales Engineer to set up a discussion with me.There have also been several Global Summit presentations which have touched on the topic - not sure if you've seen these?Best,Ben SpeadManager, AppServices, InterSystems
go to post Ben Spead · Feb 21, 2019 Sorry - I forgot that you first need to specify the source control class in the Management Portal. Put "Source Control" in the Search box on the SMP homepage, and then go to that page (e.g. http://localhost:57772/csp/sys/mgr/%25CSP.UI.Portal.SourceControl.zen). Select the Namespace in the left column and then "%Studio.SourceControl.ISC". Save the changes and try the BaselineExport() again. When you are done with the export, change the Source Control back to "None"As a general tip, if you do enable and enforce source control, then you wouldn't need to be querying your class definitions to find variations between environments - you could see all of that (and so much more!) in your source control system ;)
go to post Ben Spead · Feb 21, 2019 I understand ... so you want to only export specific things which it has found to have differences in the code. That makes sense since you are trying to use it at the end of a piece of code already in place. I am afraid I don't know how to do that, but if you contact Support they may be able to suggest a trick or two.
go to post Ben Spead · Feb 21, 2019 Is there a reason that the use of a Virtual Namespace is a requirement? If not, you can use ##class(%Studio.SourceControl.ISC).BaselineExport() to export the entire contents of the Namespace to disk for file-based diffing (this is how I normally do it)
go to post Ben Spead · Jan 18, 2019 I can only comment on the original functionality in %Studio.SourceControl.ISC - if you're extending it you will need to do some debugging to see exactly why you are seeing the behavior that you are.In the original %Studio.SourceControl.ISC class, when working in Connected mode (ie, Caché can issue p4 commands in real time to the Perforce server), the p4 command should take care of changing the file back to ReadOnly, which is what triggers GetStatus() to see it is uneditable and therefore not checked out. It may be that your GetStatus() isn't correctly interpretting the Reaonly state of the file, or if you are on UNIX, it may be that Caché doesn't see it properly as Readonly (this can happen if you are running your instance as Root). Note - I think there may be a bug where after checking the %Studio.SourceControl.Change table isn't updated appropriately, but the primary indicator of checked out/ checked in should be that Readonly bit on the file.Hopefully this is enough to get you moving on this, and if not then I suggest you call Support to have them take a look with you and debug. If there are any other questions I can answer in this forum I am happy to try.Best of luck!
go to post Ben Spead · Jan 17, 2019 Adrian - are you writing your own Perforce hooks or use the sample Perforce hooks that ship with Caché? (%Studio.SourceControl.ISC.cls).In %Studio.SourceControl.ISC.cls it checks to see if the file in the local workspace is Readonly or ReadWrite. If Readonly it assumes it is not checked out and prompts the user to check out. If ReadWrite it will see if it is a multi-developer or single-developer instance. if single developer it can just edit it. If multi-developer it will check in %Studio.SourceControl.Change to see if the current user is the one who checked it out - if so they can edit, if not they can a message of who is editing it in the Output window and the item is treated as ReadOnly to them.
go to post Ben Spead · Jan 12, 2019 Eduard - I completely agree!The nice (or annoying, depending on your perspective) thing about moving to the discipline of unit testing is that it forces you to write your code in a more modular (and therefore more testable) manner, and refactoring to meet these goals is a great byproduct of a testing focus :)
go to post Ben Spead · Jan 11, 2019 Alex - I think it isn't a smart idea to call into a specific line number of a routine since the contents will change. Instead you should call the line labels/functions called within the routine by outside of the routine and pass all appropriate variables, etc that way.Trying to call a specific line number will certainly lead to faster than desired 'bit rot' in your unit test library.
go to post Ben Spead · Jan 3, 2019 Welcome to the the InterSystems Developer Community!!1) ObjectScript is a (very, very large) superset of the M language (previously known as MUMPS)2) InterSystems IRIS uses much of the core technology that was in Caché, but it is a break from the past in many ways and allows next-gen development tools, architectures, etc. InterSystems IRIS is an upgrade path which current Caché based applications should seriously consider. Zen is a legacy web development technology which runs on top of Caché (it ships with Caché and InterSystems IRIS)3) The answer to this depends on whether you are taking straight globals, or persistent objects. Any data persisted via InterSystems Object or Relational structures can automatically be accessed via SQL. If you are just writing straight globals (e.g. set ^Patient(123)=foobar) then you can't query unless you set up an SQLStorage mapping to your globals4) You can map your existing global structures to object definitions for OO/SQL access using SQLStorage (https://docs.intersystems.com/irislatest/csp/docbook/DocBook.UI.Page.cls...). It looks like there isn't a lot in the docs on that so you should contact Support for more details on how to set it up to match your existing data to definitions which you can hit with traditional SQL.Hope that helps!
go to post Ben Spead · Jan 2, 2019 Excellent article Michelle! Very well done :)I absolutely concur that if a shared dev instance is going to be used along with client-side hooks then locking is a *must*! However, some may find that exclusive ownership on a single Shared dev instance is too restrictive, but find themselves still needing a Shared dev instance in the mix for certain reasons. An alternative would be a Mixed mode of working with a Shared Dev and one or more Private Dev environment. We have found that this mode works really well for us in the case for large teams on active projects - locking across the board we've found to be too restrictive in how it blocks work. We have found this on a couple of our most active applications where we need shared development instance for a number of reasons. In order to make this work, you will need to move to using Server-Side Source Control hooks on the Shared dev instance, and then developers that don't require work on the shared dev instance can have a private instance which uses either Server-Side or Client-Side source control hooks (in our case we use server-side in Private dev instances to make it easier to support). This will work because the Server-Side Hooks on Shared should manage concurrency of any developers connected to that instance (they can't check out a file someone is already working on), while not locking the file in source control which would prevent other developers from touching it on their Private Dev instances. Just throwing this out there as another option for those who find that they are tripping over exclusive locking, and are not comfortable running with unlocked files on the Shared Dev instance.Also, a big thumbs up for including the suggestions of Jenkins - we have started using it this year to automate build/unit/code coverage testing on every check-in and are seeing some great results!
go to post Ben Spead · Nov 21, 2018 Make sure that you review all of the shortcuts outlined in the documentation (there are a LOT of useful ones there):https://docs.intersystems.com/irislatest/csp/docbook/DocBook.UI.Page.cls...Also, check out one of my favorite things to do with Studio which isn't as widely known as it should be:https://community.intersystems.com/post/studio-tip-running-cos-commands-...Hope that helps :)Ben
go to post Ben Spead · Nov 12, 2018 It's deprecated but still available. Swapping it out for $zf(-100) for %Studio.SourceControl.ISC is on the TODO list...