fluid-work IRC Logs-2012-09-20
[08:11:57 CDT(-0500)] <colinclark> hey Justin_o
[08:14:11 CDT(-0500)] <Justin_o> colinclark: hello, good morning
[08:14:44 CDT(-0500)] <colinclark> I'm sorry our chat about persisting JSON in Python trickled off there yesterday
[08:14:54 CDT(-0500)] <colinclark> but I wanted to see if I could help at all with your design
[08:15:46 CDT(-0500)] <Justin_o> colinclark: yah.. the community meeting pretty much ate up all the time..
[08:16:12 CDT(-0500)] <colinclark> What do you think of the idea of rolling a super-mini ChangeApplier?
[08:16:21 CDT(-0500)] <Justin_o> colinclark: the good news is that i couldn't sleep last night so i spent an hour or so in the early morning working on it
[08:16:25 CDT(-0500)] <colinclark> lol
[08:16:28 CDT(-0500)] <colinclark> sorry to hear it
[08:16:30 CDT(-0500)] <Justin_o> but i was at home so i didn't have my setup to test it on
[08:16:45 CDT(-0500)] <Justin_o> i'll try to put something in a pastie one second
[08:17:58 CDT(-0500)] <colinclark> cool
[08:18:18 CDT(-0500)] <Justin_o> colinclark: here's the simple event system http://pastie.org/4759927
[08:19:01 CDT(-0500)] <colinclark> you don't go with the fancy operator overloading
[08:19:06 CDT(-0500)] <colinclark> fair enough
[08:19:24 CDT(-0500)] <Justin_o> colinclark: i'm not really sure it made sense to do +=
[08:19:30 CDT(-0500)] <Justin_o> and -=
[08:19:42 CDT(-0500)] <Justin_o> i figured having more specific control would be easier.
[08:19:43 CDT(-0500)] <colinclark> It might seem more idiomatic if you were a C++ programmer
[08:19:51 CDT(-0500)] <colinclark> I agree, though
[08:21:18 CDT(-0500)] <colinclark> So from the event system, will you roll a little ChangeApplier with a requestChange() method that takes a dictionary?
[08:21:30 CDT(-0500)] <Justin_o> colinclark: this is the start of the changeApplier.. although i realized as i tried to go back to sleep that it wasn't quite right
[08:21:30 CDT(-0500)] <Justin_o> http://pastie.org/4759945
[08:21:32 CDT(-0500)] <colinclark> and fire an modelChanged event from there to a listener that will take care of persistence?
[08:22:25 CDT(-0500)] <colinclark> How is it not quite right, Justin_o, do you think?
[08:23:20 CDT(-0500)] <Justin_o> colinclark: i think i finally understood what Bosmon was saying.. which has to do with ELPaths.. so i'll change this to take in an ELpath instead and method (i.e. add, delete)
[08:23:36 CDT(-0500)] <colinclark> ah, right
[08:23:41 CDT(-0500)] <Justin_o> so in the end, it may only have one actual method on it
[08:23:49 CDT(-0500)] <Justin_o> requestChange
[08:23:51 CDT(-0500)] <colinclark> right
[08:24:05 CDT(-0500)] <colinclark> I'm sorry that you end up having to roll bits of existing infrastructure
[08:24:13 CDT(-0500)] <colinclark> but it's probably a reasonably fun exercise, anyway
[08:24:27 CDT(-0500)] <colinclark> I'd love to chat more about your designs, too...
[08:24:44 CDT(-0500)] <colinclark> I was really impressed to hear you evaluating the goals of your design in the channel yesterday
[08:25:18 CDT(-0500)] <colinclark> that "self-persistent model object" design is one I used to encounter a lot in Java, with more interesting consequences
[08:25:35 CDT(-0500)] <colinclark> the fact that you're already a JSONist helped to deflect most of the pain you would have felt...
[08:25:57 CDT(-0500)] <colinclark> if you were thinking more traditionally in Object Oriented terms, you would have, long ago, modelled all your data as typed object
[08:26:03 CDT(-0500)] <colinclark> probably with lots of getters and setters
[08:26:22 CDT(-0500)] <colinclark> and then you'd be inserting this self-persistence logic as a base class for all your model types
[08:26:41 CDT(-0500)] <colinclark> shoe-horning in the save() functionality into each of your setters or whatever
[08:27:44 CDT(-0500)] <Justin_o> colinclark: yah.. i wouldn't want to do that..
[08:28:15 CDT(-0500)] <colinclark> If you look at how persistence is done in most frameworks, there are sort of two categories
[08:28:33 CDT(-0500)] <colinclark> the object/relational mappers I encountered in Java typically had a separate object that was the central point for persistence
[08:28:48 CDT(-0500)] <colinclark> like Hibernate's Session or, back in the old days, WebObjects had the "EOEditingContext"
[08:29:01 CDT(-0500)] <colinclark> which implemented methods for saving and the like
[08:29:24 CDT(-0500)] <colinclark> and then you'd probably roll your own "Data Access Object" layer to accompany it
[08:29:47 CDT(-0500)] <colinclark> michelled can probably remember the kinds of DataManagers and the like that would take the responsibility for persisting different types of data
[08:30:02 CDT(-0500)] <colinclark> again, much of it mitigated in your distinctly less typeful view of the world, Justin_o
[08:30:20 CDT(-0500)] <colinclark> In "client-side" APIs, you typically see an event system of some kind
[08:30:47 CDT(-0500)] <colinclark> some kind of observation of changes on objects to deal with state changes and the "side-effect" of the need to persist them
[08:31:20 CDT(-0500)] <colinclark> Cocoa and iOS have key/value coding, which has some analogs to our system
[08:31:36 CDT(-0500)] <colinclark> in that it's path-based, allowing you to traverse a graph of related objects using "key paths"
[08:32:01 CDT(-0500)] <colinclark> but then, if I remember, persistence ends up in the older pattern of having a CoreDataContext or something similar
[08:32:06 CDT(-0500)] <colinclark> been a while
[08:34:08 CDT(-0500)] <colinclark> I guess it's called the ManagedObjectContext in CoreData
[08:34:17 CDT(-0500)] <colinclark> which tells you a lot about the philosophy of its designm
[09:58:10 CDT(-0500)] <Justin_o> yura1, anastasiac: do you remember what fluid.get returns of the elpath doesn't exist?
[09:58:27 CDT(-0500)] <anastasiac> hm
[09:58:48 CDT(-0500)] <yura1> undefined
[09:58:58 CDT(-0500)] <anastasiac> good question, no, and the docs don't say. I'll have to fix that. Thanks for pointing it out
[09:59:43 CDT(-0500)] <Justin_o> anastasiac, yura1: thanks
[10:25:24 CDT(-0500)] <Justin_o> yura1: do you know if i'm reading this correctly, if i want to perform a deletion of part of the model with the changeApplier, i still need to pass in a value?
[10:27:24 CDT(-0500)] <yura1> not sure you do, but i would have a "DELETE" directive
[10:27:28 CDT(-0500)] <yura1> otherwise i would pass undefined
[10:28:01 CDT(-0500)] <Justin_o> yura1: thanks
[11:41:54 CDT(-0500)] <colinclark> Justin_o: Remind me again what the standard bug workflow is...
[11:42:03 CDT(-0500)] <colinclark> if I review and push a fix, do I resolve and close it?
[11:52:46 CDT(-0500)] <Justin_o> colinclark: yes
[11:54:36 CDT(-0500)] <colinclark> ok, great
[12:55:12 CDT(-0500)] <jessm> idrc, you've gone dark on IM
[12:55:22 CDT(-0500)] <jessm> except the jabber server
[12:55:30 CDT(-0500)] <jessm> oh, maybe just jameswy
[12:55:32 CDT(-0500)] <jessm> nevermind
[13:13:41 CDT(-0500)] <alexn> colinclark michelled: I'm looking into FLUID-4793 and it happens that I found 2 other issues along the way. I created 2 separate JIRAs for them to tackle separately. FLUID-4796 and FLUID-4797 respectively. FLUID-4793 has some explanations how I stumbled upon them. In the meantime colinclark I submitted a fix for FLUID-4796 here https://github.com/fluid-project/videoPlayer/pull/60
[13:14:30 CDT(-0500)] <colinclark> cool, yes
[13:14:59 CDT(-0500)] <colinclark> alexn: I wonder if you have some time this afternoon to think through the "setupEnvironment" thing with me here in the channel?
[13:15:33 CDT(-0500)] <alexn> yes sure we can chat about it any time
[13:16:37 CDT(-0500)] <colinclark> cool
[13:16:40 CDT(-0500)] <colinclark> i'm just eating some late lunch
[13:16:49 CDT(-0500)] <colinclark> i hear i missed indian buffet today
[13:16:56 CDT(-0500)] <colinclark> yura1 must have that special glow
[13:17:01 CDT(-0500)] <alexn> oh no worries I'm still looking into this evil FLUID-4793
[13:17:10 CDT(-0500)] <alexn> oh yes indian lunch was great
[13:17:33 CDT(-0500)] <yura1> colinclark: wasn't my idea
[13:17:37 CDT(-0500)] <alexn> yura1 has a special "butter chicken" glow
[13:18:17 CDT(-0500)] <Bosmon> colinclark - nice discussion of persistence methodologies
[13:18:27 CDT(-0500)] <colinclark> oh hey
[13:18:30 CDT(-0500)] <colinclark> "morning"
[13:18:39 CDT(-0500)] <Bosmon> Such a relief we can put these evil days of Hibernatism behind us
[13:18:40 CDT(-0500)] <colinclark> glad you enjoyed it in the logs
[13:18:48 CDT(-0500)] <Bosmon> And the mysterious idea of "objects that save themselves" : P
[13:19:11 CDT(-0500)] <colinclark> I never really spent very much time with Hibernate
[13:19:23 CDT(-0500)] <colinclark> but I guess it, like EnterpriseObjects, raised some interesting quetsions about "lifecycle"
[13:19:36 CDT(-0500)] <colinclark> about what the relationship was between a model object and its "context"
[13:19:41 CDT(-0500)] <colinclark> how many of these things you'd have around
[13:19:42 CDT(-0500)] <Bosmon> It was one of those ideas that invariably appeared attractive to everyone when they first heard about it
[13:19:45 CDT(-0500)] <colinclark> when they would live and die
[13:19:54 CDT(-0500)] <Bosmon> But when investigated in any detailed way, invariably proved Dreadful
[13:19:57 CDT(-0500)] <colinclark> what kind of independence a "model" object could have from their context
[13:20:36 CDT(-0500)] <Bosmon> It also started off the big debate about "Long Sessions or DTOs" : P
[13:20:42 CDT(-0500)] <colinclark> right
[13:20:46 CDT(-0500)] <Bosmon> What nonsense we all lived with...
[13:21:07 CDT(-0500)] <Bosmon> All, as it turns out, because of "object-orientation"..
[13:22:53 CDT(-0500)] <colinclark> so what are you working on today, Bosmon?
[13:23:03 CDT(-0500)] <Bosmon> I am rewriting fluid.merge
[13:23:17 CDT(-0500)] <Bosmon> Which it seems can actually happen in two stages
[13:23:35 CDT(-0500)] <Bosmon> Firstly it can be rewritten basically, to use the new idiom of "segs", and "compiled mergePolicies"
[13:23:45 CDT(-0500)] <Bosmon> After that it can have the new "strategy API" retrofitted into it
[13:24:23 CDT(-0500)] <colinclark> Cool
[13:24:32 CDT(-0500)] <colinclark> This is all part of the larger "ginger" project?
[13:24:48 CDT(-0500)] <Bosmon> Yes, it is
[13:25:07 CDT(-0500)] <Bosmon> Once we have "ginger expansion" (now working) and "ginger merging", the two of them can then be bolted together
[13:27:01 CDT(-0500)] <colinclark> Can you summarize, in a sentence or two, the core value that the ginger project will have on users of the framework, Bosmon?
[13:28:00 CDT(-0500)] <Bosmon> I guess it's not completely easy to summarise, but I'll do my best
[13:28:25 CDT(-0500)] <Bosmon> Right now the limitations in the framework can cause a lot of "design problems", where there are things that you believe you SHOULD be able to refer to in IoC configuration, but you can't
[13:28:27 CDT(-0500)] <colinclark> fair enough
[13:28:41 CDT(-0500)] <colinclark> Can you give a concrete example?
[13:28:52 CDT(-0500)] <colinclark> I'm thinking, maybe, your sibling components?
[13:29:28 CDT(-0500)] <Bosmon> And a lot of these limitations relate to references made from a component back to THE SAME COMPONENT - in fact, people very naturally want to write, say, references from one value in a component's options, or even more usefully, a reference from the "listeners" block of a component onto its own invokers
[13:29:50 CDT(-0500)] <colinclark> ahh
[13:29:53 CDT(-0500)] <Bosmon> Right now, references made "against the grain" will fail - that is, a reference made to a part of a component which is not definitely part of an earlier workflow step in the framework will fail
[13:29:54 CDT(-0500)] <colinclark> that makes quite a bit of sense
[13:30:10 CDT(-0500)] <Bosmon> This is particularly annoying since it puts the burden on framework users of knowing what this workflow actually IS
[13:30:35 CDT(-0500)] <colinclark> the pre/post/final init workflow, specifically?
[13:30:39 CDT(-0500)] <Bosmon> And, for example, memorising the set of workflow steps, and the name of the particular "initFunction" which is associated with the start or end of it, or looking it up in a table (the way I always do)
[13:30:43 CDT(-0500)] <Bosmon> Yes, those
[13:32:58 CDT(-0500)] <Bosmon> So working around these framework limitations often causes people to have to pervert their designs - either they find a way to make a component work without the reference, or they make some kind of "lifecycle hack" (of which we have a few in UIOptions), or they create a whole new level of component containment so that they can get a fresh set of lifecycle points
[13:36:22 CDT(-0500)] <colinclark> So it sounds like those lifecycle points won't really be relevant in the next version of Infusion?
[13:36:37 CDT(-0500)] <Bosmon> Their relevance should be greatly reduced, yes
[13:36:45 CDT(-0500)] <Bosmon> And in a future version of Infusion we would like to remove them completely
[13:42:16 CDT(-0500)] <colinclark> Anything else noteworthy, Bosmon?
[13:42:39 CDT(-0500)] <Bosmon> I've been working with yura1 on our "asynchronous request grade architecture"
[13:42:50 CDT(-0500)] <Bosmon> Well, he's been doing the work, and I've been making silly suggestions : P
[13:45:06 CDT(-0500)] <yura1> Bosmon: i m still not sure what's the best way to proceed with fixing tests for matchmaker
[13:45:18 CDT(-0500)] <Bosmon> yura1 - because of the issue with loading "when"?
[13:47:18 CDT(-0500)] <yura1> Bosmon: yes
[13:47:22 CDT(-0500)] <Bosmon> I think we should operate a "dual loading system" right now.... which is pretty much what we always did
[13:47:45 CDT(-0500)] <Bosmon> That is, leave the "require" statements in, but continue to stub out the browser version of require
[13:47:53 CDT(-0500)] <Bosmon> Well
[13:48:47 CDT(-0500)] <colinclark> Bosmon, yura1: Do you guys mind bouncing over to fluid-tech while I chat through some pull requests here with alexn?
[13:49:00 CDT(-0500)] <Bosmon> cool, colinclark
[13:49:13 CDT(-0500)] <yura1> colinclark: sure
[13:49:17 CDT(-0500)] <colinclark> cool
[13:49:26 CDT(-0500)] <colinclark> i'll keep an eye out there as well
[13:49:31 CDT(-0500)] <colinclark> So, alexn, got a sec?
[13:50:00 CDT(-0500)] <alexn> yeah, also getting closer and closer for that bug resolution I mentioned earlier
[13:50:13 CDT(-0500)] <alexn> so setupEnviornment
[13:50:15 CDT(-0500)] <colinclark> cool
[13:50:17 CDT(-0500)] <colinclark> Yes
[13:50:21 CDT(-0500)] <colinclark> It's been bugging me
[13:50:38 CDT(-0500)] <alexn> tell me more
[13:50:39 CDT(-0500)] <colinclark> And I think, if we talk through it a bit, we'll probably find that your current solution, while admirable, doesn't quite work
[13:51:22 CDT(-0500)] <alexn> ok let's split it into parts - why it does not work and what could be a possible solution
[13:51:52 CDT(-0500)] <colinclark> I like that you've tried to factor it out as a utility you can use in several places
[13:51:54 CDT(-0500)] <alexn> *opening the file with the code
[13:52:06 CDT(-0500)] <colinclark> https://github.com/fluid-project/videoPlayer/pull/58/files#L6R56
[13:52:17 CDT(-0500)] <colinclark> I guess the first issue is that it's not quite as generic as it sounds
[13:52:37 CDT(-0500)] <colinclark> In that the function is called "setupTestEnvironmentFeature"
[13:52:43 CDT(-0500)] <colinclark> I guess the word "Feature" is really important here
[13:53:11 CDT(-0500)] <alexn> yes, because we are considering the fact that the user/developer may potentially add more "features"
[13:53:14 CDT(-0500)] <colinclark> since it assumes that the only kind of component you'd want to put into the static environment for a test is one that starts with the prefix "fluid.browser/
[13:53:23 CDT(-0500)] <colinclark> Sorry, "fluid.browser."
[13:53:48 CDT(-0500)] <alexn> right
[13:54:42 CDT(-0500)] <Bosmon> Also, morally, this utility should ensure that the environment is cleaned up probably as soon as the test ends - not reserving this task to the next time it is called
[13:55:00 CDT(-0500)] <colinclark> That was where I was going to get to, Bosmon
[13:55:04 CDT(-0500)] <colinclark> though you're jumping the gun a bit
[13:55:07 CDT(-0500)] <Bosmon> Sorry
[13:55:31 CDT(-0500)] <alexn> well it should be a separate function for cleanup I assume
[13:55:48 CDT(-0500)] <colinclark> I think that's probably true, yes
[13:56:00 CDT(-0500)] <colinclark> and so that starts to point to this kind of a function's collapse
[13:56:08 CDT(-0500)] <colinclark> It's interesting… let's go back and look at how it used to look
[13:56:50 CDT(-0500)] <colinclark> https://github.com/colinbdclark/videoPlayer/blob/demo/tests/js/VideoPlayerTests.js#L85-91
[13:57:16 CDT(-0500)] <colinclark> And so, alexn, your refactoring seems like a natural trajectory for a function like this
[13:57:19 CDT(-0500)] <colinclark> You generalized it a bit
[13:57:24 CDT(-0500)] <colinclark> but not TOO much
[13:57:29 CDT(-0500)] <colinclark> and I think you did that for a specific reason
[13:57:44 CDT(-0500)] <colinclark> because if you supported a full component name as the first argument, then it's getting a bit more verbose
[13:57:48 CDT(-0500)] <Bosmon> I think the following set of code would be very useful for comparison
[13:57:49 CDT(-0500)] <Bosmon> https://github.com/fluid-project/infusion/blob/master/src/webapp/tests/component-tests/uploader/js/UploaderTests.js#L525-578
[13:58:03 CDT(-0500)] <Bosmon> This looks like a great opportunity to me to generalise and unify both of these pieces of code
[13:58:09 CDT(-0500)] <Bosmon> And perhaps gain a new piece of testing framework
[13:58:21 CDT(-0500)] <colinclark> and, the next step-that we should separate the lifecycle of cleaning up after the test runs from the work of adding a component to the static environment-would further "verbosity" the process
[13:58:29 CDT(-0500)] <colinclark> leading us to this function's ultimate collapse
[13:58:36 CDT(-0500)] <colinclark> i.e. it doesn't quite do what we want
[13:58:49 CDT(-0500)] <colinclark> Before we get to the Uploader, does that make sense, alexn?
[13:59:39 CDT(-0500)] <alexn> yes. I guess especially when the test cases are defined declaratively it would be fairly easy to force clean up after each execution
[14:00:11 CDT(-0500)] <alexn> after each test function execution I mean
[14:02:39 CDT(-0500)] <colinclark> yeah
[14:03:01 CDT(-0500)] <colinclark> So Mike Lam, a year or two ago, spent some time working with Bosmon to make the Uploader tests quite nice
[14:03:07 CDT(-0500)] <colinclark> for very similar kinds of situations
[14:03:19 CDT(-0500)] <colinclark> Let's have a look through them--I haven't cast an eye on them in a LOOONG time
[14:03:24 CDT(-0500)] <colinclark> so we'll look at them together
[14:03:38 CDT(-0500)] <colinclark> ah, yes, it's very similar
[14:04:22 CDT(-0500)] <Bosmon> This work was sort of "half finished"
[14:04:26 CDT(-0500)] <Bosmon> But it is sort of "suggestive" : P
[14:04:59 CDT(-0500)] <colinclark> right
[14:05:47 CDT(-0500)] <alexn> I'm just trying to understand how this "fluid.browser." or similar case is hidden in those functions
[14:05:56 CDT(-0500)] <colinclark> It's not
[14:05:59 CDT(-0500)] <alexn> because if user one day decides to extend the list of available features
[14:06:07 CDT(-0500)] <colinclark> this only shows you another example of the problem, not quite the solution
[14:06:29 CDT(-0500)] <colinclark> We can, if you'd like, back up a bit and try to enumerate what we think are the features a test developer would like from us
[14:06:39 CDT(-0500)] <colinclark> Do you want to give that a stab, alexn?
[14:06:46 CDT(-0500)] <colinclark> Since you are, yourself, a test writer
[14:08:21 CDT(-0500)] <alexn> well it depends on the problem - I mean, do we want tests for the components we have, do we want to have flexible tests which would handle all our components or we want to write a test framework which would handle anything and just general.
[14:08:40 CDT(-0500)] <alexn> sorry my 1 and 2 probably look similar
[14:09:08 CDT(-0500)] <alexn> I guess the 2nd case is when we try to generalize given tests to create functions for them to avoid copy paste
[14:09:35 CDT(-0500)] <colinclark> My question was a bit more specific
[14:09:46 CDT(-0500)] <colinclark> Let's see if we can unpack the nature of the problem
[14:09:57 CDT(-0500)] <colinclark> We want to be able to run tests in different "contexts"
[14:10:42 CDT(-0500)] <alexn> I guess there should be a mapping between a context and available solutions/test settings
[14:10:42 CDT(-0500)] <colinclark> Or, put another way, to "simulate" a particular context in a unit test, and then verify that the component responds to the context appropriately
[14:10:50 CDT(-0500)] <colinclark> Right
[14:11:06 CDT(-0500)] <colinclark> So a test should have some way to declare what context it was to set up for the test
[14:11:36 CDT(-0500)] <colinclark> The second core requirement is that we need to be able to clean up after the test runs
[14:11:45 CDT(-0500)] <colinclark> to erase that context we were testing in
[14:12:43 CDT(-0500)] <alexn> Actually it would be good to have a component for testing since you can easily configure contexts through demands
[14:12:50 CDT(-0500)] <colinclark> Is that about all your particular Video Player tests need, alexn?
[14:13:06 CDT(-0500)] <colinclark> (those two things I listed, I mean)
[14:13:21 CDT(-0500)] <alexn> not all of them but some of them yes
[14:13:37 CDT(-0500)] <colinclark> Some of the features or some of the tests?
[14:13:42 CDT(-0500)] <colinclark> I'm confused
[14:13:57 CDT(-0500)] <alexn> some of the tests need some of the features
[14:14:07 CDT(-0500)] <alexn> if we look at the word "need"
[14:14:43 CDT(-0500)] <alexn> but there are some tests which just rely only on their internal functionality
[14:14:47 CDT(-0500)] <colinclark> Okay, so the features we've outlined:
[14:15:23 CDT(-0500)] <colinclark> 1. The ability to set up a "context" by placing one or more components into the IoC resolution tree
[14:15:31 CDT(-0500)] <colinclark> 2. The ability to clean up these components once the test is done
[14:15:56 CDT(-0500)] <colinclark> So first, do your tests need these two features?
[14:16:11 CDT(-0500)] <colinclark> and second, do your tests need any other features I haven't listed?
[14:16:31 CDT(-0500)] <alexn> should be it
[14:16:48 CDT(-0500)] <alexn> what is IoC resolution tree in the context of tests ?
[14:17:09 CDT(-0500)] <alexn> are we talking about fluid.typeTag() ?
[14:17:11 CDT(-0500)] <colinclark> There is probably some documentation about how IoC works in the wiki
[14:17:22 CDT(-0500)] <alexn> I know I read it
[14:17:28 CDT(-0500)] <alexn> but not sure in the given example
[14:17:54 CDT(-0500)] <colinclark> I don't know that I want to assume the given implementation
[14:17:56 CDT(-0500)] <alexn> because right now we create fuild.staticEnvironment.feature = fluid.typeTag
[14:18:03 CDT(-0500)] <colinclark> but, last I looked, there were three places you could define a component
[14:18:08 CDT(-0500)] <colinclark> 1. The static environment
[14:18:13 CDT(-0500)] <colinclark> 2. The dynamic environment
[14:18:28 CDT(-0500)] <colinclark> 3. A component's configuration
[14:18:50 CDT(-0500)] <colinclark> And those three sources become the tree by which "types" are resolved in the IoC system
[14:19:06 CDT(-0500)] <colinclark> Bosmon might want to correct me here if I'm out of date or a little awkward with my terminology
[14:19:39 CDT(-0500)] <colinclark> alexn: Right, our current approach is to place components (using fluid.typeTag()) into the static environment
[14:19:59 CDT(-0500)] <colinclark> but it need not be the only way
[14:20:36 CDT(-0500)] <alexn> can I ask a question? Why we did not think about this before when we started writing tests for videoPlayer and defined features because it sounds like a pretty general thing to have
[14:21:15 CDT(-0500)] <alexn> I guess we came to the idea with the introduction of more features.
[14:21:17 CDT(-0500)] <colinclark> Well, I think this is one of the core points I'm trying to express in general, alexn
[14:21:27 CDT(-0500)] <alexn> one of the good points
[14:21:33 CDT(-0500)] <alexn> I will take a look into it
[14:21:34 CDT(-0500)] <colinclark> It's all of our responsibility to produce code that doesn't just fix our own problems
[14:21:45 CDT(-0500)] <colinclark> but rather solves other people's problems as well
[14:22:16 CDT(-0500)] <colinclark> I tried my best, years ago when I first wrote the VideoPlayer in "43 minutes" to provide some of the basic infrastructure for growth of the component
[14:22:24 CDT(-0500)] <colinclark> this was prior even to IoC, if I remember correctly
[14:22:41 CDT(-0500)] <colinclark> After that, we had a student work on the code, and he added a lot of features but didn't necessarily factor things to help you
[14:22:45 CDT(-0500)] <colinclark> and then you came along
[14:23:15 CDT(-0500)] <colinclark> So, I guess a JFK quote might be appropriate in this kind of case
[14:23:19 CDT(-0500)] <colinclark> THE JFK quote
[14:23:21 CDT(-0500)] <colinclark> right jessm?
[14:23:24 CDT(-0500)] <alexn> well it looks factored pretty well for what it has but we will make it better and more flexible
[14:23:28 CDT(-0500)] <alexn>
[14:24:07 CDT(-0500)] <colinclark> michelled: Curiously, do you concur with alexn on that point? ^
[14:24:28 CDT(-0500)] <alexn> I will definitely take a look into it colinclark. Thanks for example Bosmon I will take a look into it and will use as my lighthouse
[14:24:55 CDT(-0500)] <alexn> colinclark michelled: I just meant that it is was a pretty decent code for those 43 minutes
[14:24:56 CDT(-0500)] <jessm> colinclark: what JFK quote are you talking about?
[14:25:14 CDT(-0500)] <colinclark> "Ask not what your country can do for you…?"
[14:25:15 CDT(-0500)] <Bosmon> "Can't Think of Everything"? : P
[14:25:19 CDT(-0500)] <Bosmon> hahaha
[14:25:26 CDT(-0500)] <Bosmon> The following code written by yura may also be relevant
[14:25:27 CDT(-0500)] <Bosmon> https://github.com/yzen/universal/blob/5c98a3c31d76827464c075b90e38ecbe3716b339/tests/gpiiTests.js#L39-65
[14:25:29 CDT(-0500)] * michelled needs to catch up
[14:25:36 CDT(-0500)] <Bosmon> He produced a thing called "addToEnvironment" for use in GPII recently
[14:25:42 CDT(-0500)] <colinclark> "Ask not what your code base can do for you…"
[14:25:48 CDT(-0500)] <Bosmon> That I somewhat questioned at the time but let in for the time being.....
[14:26:04 CDT(-0500)] <jessm> colinclark: oh, yes! My father does a version, in a Fidel Castro voice, in Spanish, and there's a sandwich at the end. I've no idea what it means but I'm sure it's offensive
[14:26:10 CDT(-0500)] <alexn> thx Bosmon !
[14:26:10 CDT(-0500)] <jessm> don't use his version
[14:26:11 CDT(-0500)] <colinclark> lol
[14:26:18 CDT(-0500)] <colinclark> I suppose JFK was talking about a notion of "citizenship"
[14:26:23 CDT(-0500)] <colinclark> which I guess is very current
[14:26:58 CDT(-0500)] <Bosmon> Actually perhaps all I should have questioned was the NAME.... since it looks like what he has implemented here is what I had been talking about for a very long time, an "IoC Test case"
[14:26:59 CDT(-0500)] <colinclark> If it doesn't sound too pretentious and idealistic...
[14:27:09 CDT(-0500)] <Bosmon> That is, an IoC component which REPRESENTS the test case
[14:27:21 CDT(-0500)] <Bosmon> This follows colinclark point 3. above of "where you can put things"
[14:27:29 CDT(-0500)] <Bosmon> This has the advantage that it is much easier to throw away afterwards
[14:27:40 CDT(-0500)] <colinclark> that seems about like what we want, Bosmon
[14:27:43 CDT(-0500)] <Bosmon> Since putting things in the static environment creates the issue of deleting them afterwards
[14:28:00 CDT(-0500)] <colinclark> yura: ALL YOUR TEST ARE BELONG TO US
[14:28:07 CDT(-0500)] <alexn>
[14:28:08 CDT(-0500)] <colinclark> eek, now I'm using dated memes
[14:28:15 CDT(-0500)] <jessm> colinclark: citizenship in open source – very relevant
[14:28:20 CDT(-0500)] <Bosmon> colinclark - it is generally what we want, but I should mention some points of caution resulting from the continuing weakness in the framework
[14:28:20 CDT(-0500)] <alexn> well I'm sure most of us know this meme
[14:28:34 CDT(-0500)] <Bosmon> For example, some of our components, most notably UIOptions, behave badly if they are embedded at other points in an IoC tree
[14:28:49 CDT(-0500)] <alexn> this test component would be a great addition to cspace or videoPlayer
[14:28:55 CDT(-0500)] <Bosmon> So although this route is attractive, don't necessarily expect the road to be bump-free : P
[14:29:05 CDT(-0500)] <colinclark> jessm: I hope so. The point I'm trying to get at is that even writing a single line of code involves this idea of citizenship. That you don't just fix a bug or make something work, but leave a tool for the next guy/gal to not have to do the same thing all over again
[14:29:17 CDT(-0500)] <Bosmon> I believe that UIOptions is our only "dangerous" component in this sense
[14:29:47 CDT(-0500)] <jessm> colinclark: yes!
[14:29:58 CDT(-0500)] <jessm> it matters
[14:31:34 CDT(-0500)] <alexn> colinclark: should it be a separate JIRA for creating this test component and converting some of the test cases to use it or should I use that JIRA-4787
[14:34:24 CDT(-0500)] <colinclark> sorry, phone cal
[14:34:26 CDT(-0500)] <colinclark> one sec
[14:40:57 CDT(-0500)] <colinclark> alexn: I'd file a new JIRA, sure
[14:41:15 CDT(-0500)] <colinclark> I guess the question is what to do with this particular code
[14:41:29 CDT(-0500)] <colinclark> since once again, we want to keep moving forward, but at least leave things a bit better than they were before
[14:42:12 CDT(-0500)] <alexn> colinclark: once you create a JIRA could you please send it my way so I can start looking into it
[14:42:22 CDT(-0500)] <colinclark> yup
[14:42:30 CDT(-0500)] <colinclark> if you want to file the JIRA, please go ahead
[14:42:31 CDT(-0500)] <colinclark> up to you
[14:42:44 CDT(-0500)] <alexn> ok I will do it then, you have enough on your plate
[14:42:49 CDT(-0500)] <colinclark> yura: Got a sec?
[14:42:53 CDT(-0500)] <alexn> not including 6 pull requests from me
[14:42:58 CDT(-0500)] <colinclark>
[14:43:59 CDT(-0500)] <colinclark> Bosmon: What are the caution points you were going to highlight?
[14:45:39 CDT(-0500)] <alexn> maybe it would be easier for us if 4787 gets in. I'm a bit worried that I will have to do this new JIRA and refactor some of the tests even though some refactoring already present in 4787. But it is your call colinclark
[14:46:08 CDT(-0500)] <colinclark> alexn: I'm thinking we can perhaps find an incremental step along the way
[14:47:24 CDT(-0500)] <alexn> colinclark: I can revert the part related to setupTestEnvironmentFeature
[14:47:47 CDT(-0500)] <colinclark> Before you do that, let's think about what that interim step might look like
[14:48:02 CDT(-0500)] <colinclark> Going back to those two requirements I listed above
[14:48:21 CDT(-0500)] <colinclark> 1. The ability to set up a "context" by placing one or more components into the IoC resolution tree
[14:48:22 CDT(-0500)] <colinclark> 2. The ability to clean up these components once the test is done
[14:48:51 CDT(-0500)] <colinclark> Remind me, alexn, does QUnit support some kind of tear down function?