00:15:31  <Raynos>https://gist.github.com/3484582
00:15:40  <Raynos>What do you think of those events for a list object
00:16:13  * wiwilliaquit (Ping timeout: 244 seconds)
00:16:15  * thatguydanjoined
00:27:37  <substack>Raynos: splice is a superset of all of those though
00:28:00  <substack>perhaps if splice were always emitted
00:28:11  <substack>and the others were emitted for convenience
00:28:43  <Raynos>yes
00:28:44  <substack>that would rock since to mirror the state you could just call .splice() on an array with the args provided
00:28:45  <Raynos>thats the point
00:28:51  <substack>makes sense then
00:28:56  <Raynos>splice is for real men
00:29:00  <Raynos>the rest are for convenience
00:29:05  <substack>got it
00:29:11  <Raynos>ill implement the add / remove / move events later
00:29:15  <Raynos>splice and syncing first
00:29:21  <Raynos>well binding*
00:37:49  * thatguydanquit (Quit: thatguydan)
00:38:58  * thatguydanjoined
00:39:18  <Raynos>Man I want Object.observe
00:39:31  <Raynos>with Object.observe you can create deltastreams and splice streams from real objects & arrays (respectively)
00:39:46  <Raynos>None of this Delta or List abstraction
00:50:05  <substack>couldn't that be polyfilled with node-proxy?
00:50:06  <Raynos>substack: https://github.com/Raynos/splice-stream#example
00:50:22  <Raynos>Still need to implement the sugar add / remove / move events
00:50:36  <Raynos>substack: yes it can be polyfilled with ES6 proxies but we don't have those in browsers
00:53:48  * thatguydanquit (Quit: thatguydan)
00:54:43  * thatguydanjoined
00:55:38  <Raynos>hmm there is no notion of move, there is just remove followed by insert
01:04:18  <Raynos>substack: https://github.com/Raynos/splice-stream#example now with add & remove events
01:06:07  <Raynos>substack: If you don't implement element list I will
01:14:10  <substack>hooray!
01:14:19  <substack>planning on abstracting sorta into element list
01:15:30  <substack>move could be handy for doing list element animations
01:15:43  <substack>but it's not completely necessary
01:25:21  <maxogden>substack: wanna boat hack a) tonight b) tomorrow
01:26:16  <substack>plywood materials are available?
01:27:35  <maxogden>substack: we gotta get em from johnnys but yea. also im not sure if that powder adhesive stuff i got is correct for what we need
01:28:21  <substack>ok
01:28:26  <substack>what time should I stop by?
01:28:55  <maxogden>im goin to johnnys at 745
01:30:02  <substack>what's the street name?
01:30:15  <substack>I remember the basic route along embarcadero
01:30:34  <maxogden>6th ave
01:30:45  <substack>ok sweet, I can meet you down there
01:30:56  <maxogden>cool
01:33:34  <substack>Raynos: the splice-stream api looks rad
01:37:29  <substack>isaacs: npm-www should tell you how to reset your ~/.npmrc password when you use the webapp
01:37:36  <substack>...to reset your password
01:39:14  * thatguydanquit (Quit: thatguydan)
01:39:44  <substack> To reset your password, go to http://admin.npmjs.org/
01:39:53  <substack>except for how do I update my .npmrc now
01:40:01  <substack>because now they are out of sync
01:42:17  <substack>ok deleted some lines from .npmrc did the trick
01:53:06  * thatguydanjoined
01:56:52  * ryan_stevensjoined
02:07:22  <Raynos>mikeal: routes vs mapleTree
02:07:26  <Raynos>Why favour one over the other?
02:07:59  <mikeal>mapleTree is faster
02:08:05  <mikeal>and its built as a tree
02:08:22  <mikeal>and i don't think routes is maintained
02:08:43  <Raynos>routes isn't maintained
02:09:02  <Raynos>I should switch over to mapleTree
02:12:36  <Raynos>substack: The name widget is taken on npm. What's a better name?
02:14:46  <substack>what's the lib do?
02:18:29  <Raynos>substack: https://gist.github.com/3485064
02:21:19  <Raynos>substack: https://gist.github.com/3485064#file_0readme.md see updated demo
02:23:03  <substack>I see what the pieces are, but what's the problem scope?
02:23:26  <Raynos>updated again
02:23:35  <Raynos>The problem scope is having a documented Widget interface
02:24:00  <Raynos>so that we can say "the sorta createWidget callback function should return a [Widget][link to widget module] thing"
02:24:14  <Raynos>that way if we need more control over widgets then just appendTo
02:24:19  <Raynos>we can add that into the widget module
02:24:27  <Raynos>and we dont force users of sorta to implement all that dom stuff
02:24:31  <Raynos>they just use Widget
02:24:41  <Raynos>also writing that appendTo function over and over is annoying me :P
02:25:02  <Raynos>We basically need a standard dom widget interface so we can compose third party view style libraries / modules
02:25:39  <substack>I don't like that
02:25:47  <substack>just use dom elements
02:26:09  <substack>we don't need a lib for it because we already have dom nodes that do everything you would want to do
02:26:18  <Raynos>true
02:26:23  <substack>if there is a widget thing it will just grow until it reaches feature parity with the dom api
02:26:32  <Raynos>in that case sorta should accept a dom element in the callback return value
02:26:42  <Raynos>and if I want widget purity I can create my own wrapper div then and there
02:26:58  <substack>that seems better
02:27:00  <Raynos>in that case sorta doesn't need inner property anymore
02:27:07  <Raynos>it just needs wrapper which defaults to div (outer)
02:27:34  <substack>sorta already accepts a dom element in the callback :p
02:27:44  <substack>sorta(function (row) { return element })
02:27:48  <Raynos>i know. I wanted to force it to be a widget :P
02:28:11  <Raynos>I still want this widget module because appendTo is annoying me. I just need to think of a better name
02:28:16  <substack>sorta(function (row, element) {}) could also work
02:28:28  <substack>and you append your junk into element yo self
02:28:36  <Raynos>yeah
02:28:40  <Raynos>that's probably cleaner
02:28:45  <Raynos>because then there is no return value
02:28:46  <substack>agreed
02:28:51  <Raynos>which means it can be crazy async
02:28:54  <substack>yeps
02:29:11  <Raynos>cool
02:29:45  <substack>sorta({ list : l, item : i }, function (row, element) {}) as the long-form
02:29:48  <substack>seems legit
02:30:43  <Raynos>https://gist.github.com/3485064#L32
02:33:10  <substack>the stream could also be a row
02:33:31  <substack>that has a .value and emits events on state changes
02:33:54  <Raynos>I think it should be
02:33:58  <Raynos>whatever you add to the list
02:34:05  <Raynos>in this case the delta stream I added to the list
02:34:26  <Raynos>write a row module if you want and add that to the lists
02:34:30  <substack>but how do I get at the current value
02:34:53  <Raynos>stream.createDelta().toJSON()
02:35:00  <substack>:/
02:35:02  <Raynos>:D
02:35:06  <substack>too indirect
02:35:12  <Raynos>if you want to pass something in
02:35:14  <substack>why can't it just update an object in-place?
02:35:16  <Raynos>then pass in anything you want
02:35:23  <substack>that ref should exist someplace anyhow
02:35:39  * ryan_stevensquit (*.net *.split)
02:35:51  <substack>anyways boat hacking &
02:35:56  <Raynos>sorta.write([[0, 0, RowObject()], Date.now()])
02:36:19  <Raynos>just add anything you want into sorta. It should forward any object you add to it directly to the callback
02:36:21  <substack>and then straight back home and waking up early
02:36:26  <Raynos>good luck!
02:36:35  <Raynos>I'll have written a element list by the morning :P
02:36:42  <substack>go for it
02:38:34  * mikealquit (Quit: Leaving.)
02:47:39  * joshwnjjoined
03:24:14  * mikealjoined
03:38:08  * ryan_stevensjoined
03:41:47  * st_luke_joined
03:42:41  * st_lukequit (Disconnected by services)
03:42:44  * st_luke_changed nick to st_lue
03:42:47  * st_luechanged nick to st_luke
03:43:15  * st_luke_joined
03:59:03  * st_lukequit (Remote host closed the connection)
04:02:43  * st_lukejoined
04:32:27  * st_lukequit (Remote host closed the connection)
04:37:06  * mikealquit (Quit: Leaving.)
04:55:29  * ryan_stevensquit (Quit: Leaving.)
05:30:58  * timoxleyjoined
05:35:24  <Raynos>substack: https://github.com/Raynos/element-list
06:08:17  * simcop2387quit (Excess Flood)
06:09:21  * simcop2387joined
06:10:28  * mikealjoined
06:15:00  * sveisveiquit (Quit: Connection closed for inactivity)
06:29:29  <substack>Raynos: I don't like the function signature
06:29:31  <substack>(item, element, remove)
06:29:38  <substack>item is just element.parentNode
06:29:49  <Raynos>substak: item is the thing you pass in
06:29:56  <Raynos>its your row
06:30:15  <Raynos>list.push(item) -> (item, element, remove)
06:30:26  <substack>oh then element and remove are
06:30:36  <substack>shouldn't remove come from the splice stream?
06:30:52  <Raynos>yes it should
06:31:06  <substack>I guess I can just always ignore the other 2 parameters
06:31:09  <Raynos>but I have no idea how to get the remove back up
06:31:19  <Raynos>element is LI
06:31:30  <Raynos>remove is a temporary hack
06:31:39  <Raynos>as I dont know how I can cleanly mutate the list from within that callback
06:32:17  <substack>list.remove() instead?
06:32:20  <Raynos>but the signature is sorta({ list : l, item : i }, function (row, element, extraRemoveFunction) {})
06:33:01  <Raynos>yeah list.remove() would make sense
06:33:12  <Raynos>but passing in the list object to that callback feels dirty
06:33:15  <substack>handle it in splice-stream
06:33:21  <substack>no don't pass it at all
06:33:28  <substack>why does the callback need to even know about the list
06:33:37  <Raynos>it doesnt
06:33:55  <Raynos>substack: https://github.com/Raynos/element-list/blob/master/example/widget.js#L17
06:34:07  <substack>also how do I listen for updates to values
06:34:28  <Raynos>list.push(thingThatemitsUpdateEvents)
06:34:34  <substack>like in sorta I would do row.on('update', function () { elem.querySelector('.foo').textContent = row.value.foo })
06:34:44  <Raynos>I do list.push(deltaStream)
06:34:56  <substack>but what if I don't want to push!
06:35:02  <substack>what if I want to update elements in-place?
06:35:13  <Raynos>then update them in plae
06:35:20  <Raynos>substack: https://github.com/Raynos/element-list/blob/master/example/widget.js#L15
06:35:25  <Raynos>I'm updating the element in place there.
06:36:31  <Raynos>the only thing I havn't done yet is moving dom nodes in place
06:36:44  <Raynos>I destroy and create dom nodes which is inefficient
06:36:58  <substack>yes don't do that
06:37:20  <substack>so updating things in place is basically the thing that I would expect a library like this to do
06:37:28  <substack>but this library doesn't do that >_<
06:37:32  <Raynos>>_<
06:37:46  <Raynos>it updates the content of the li in plae
06:37:46  <substack>and updating things in place will greatly influence how the api works
06:37:50  <Raynos>it just doesnt move the li in place
06:37:54  <substack>because what you have now will destroy and create nodes
06:38:05  <Raynos>if you splice an item of the list
06:38:07  <substack>instead of emitting update events that I can hook onto to update the elements
06:38:08  <Raynos>and then splice it back on
06:38:11  <Raynos>it calls the callback again
06:39:00  <Raynos>The problem is
06:39:12  * sveisveijoined
06:39:15  <Raynos>how do i distinquish someone removing an item through the splice-stream and putting a new item in
06:39:18  <Raynos>or someone moving an item
06:39:24  <Raynos>I guess I dont
06:39:43  <substack>I thought crdt handled all that?
06:40:32  <Raynos>it does but splice-stream isnt integrated with crdt yet
06:40:57  <Raynos>https://github.com/Raynos/element-list/blob/master/index.js#L17 currently it creates a new LI for every item
06:41:09  <Raynos>It needs some work to see how to handle the move event as it doesnt exist yet
06:41:34  <substack>ah
06:41:41  <Raynos>because you can't move an item from one pos in the array to another in a single splice
06:41:48  <Raynos>so you need to maintain state across multiple splices
06:42:01  <Raynos>and then its a pain in the ass to distinquish between a real move and a real remove + add
06:42:22  <substack>real remove + add == move
06:42:52  <Raynos>that simplifies things
06:42:58  <substack>if the refs are the same and it happened on the same tick
06:43:09  <Raynos>oh same tick
06:43:10  <Raynos>interesting
06:43:31  <Raynos>meh the same tickc thing feels like a hack
06:43:37  <Raynos>if the ref is the same then the ref is the same
06:43:45  <Raynos>if you want a real remove + add, make a new reference
06:44:28  <substack>yes
06:45:16  <substack>I can't think of any case where using the same ref to remove + add and getting a move would not be what you actually want
06:45:31  <Raynos>substack: btw the update in place of LI content is done my FormStream and TextNode stream ( https://github.com/Raynos/element-list/blob/master/example/widget.js#L15 ). FormStream emits deltas from <input> field which are piped into the textnode stream which reads deltas and writes to text nodes in the DOM
06:45:44  <substack>same tick is not a hack, that's a standard trick for batching up a bunch of ops
06:45:54  <substack>especially if you're going to sent them out via io anyways
06:45:55  <Raynos>I meant
06:46:06  <Raynos>iff the add / remove comes in a different tick, consider it a real add + remove
06:46:10  <Raynos>that feels like a hack
06:46:12  * sveisveiquit (Changing host)
06:46:13  * sveisveijoined
06:46:35  <substack>why?
06:46:40  <substack>sounds legit to me
06:47:10  <substack>then you can deref things when you remove them on the remote side
06:47:23  <substack>and not need to worry about keeping elements you might need later in memory
06:47:38  <Raynos>Im confused, I wont worry about the tick thing
06:48:55  <Raynos>list.remove(item). list.splice(index, 0, item) // doesn't create a new dom node. Just moves it around
06:49:12  <substack>oh item is *value*
06:49:15  <Raynos>list.remove(item). process.nextTick(function () { list.splice(index, 0, item) // creates a new dom node })
06:49:20  <Raynos>Yes item is the value
06:49:32  <Raynos>I should add a list.remove method
06:50:24  <substack>you should just have item.value, item.element, and item should emit events when its state changes
06:51:01  <substack>and yes a list.remove()
06:51:08  <substack>could be written in terms of splice()
06:51:17  <substack>actually just use splice
06:51:27  <Raynos>well remove(item) is easy
06:51:29  <substack>keep the api the same as Array
06:51:48  <Raynos>because otherwise you need splice(list.indexOf(item), 1)
06:52:03  <substack>just like for regular arrays
06:52:14  <substack>or
06:52:29  <Raynos>well but thats annoying when we have a list
06:52:32  <substack>item.value is the value, item.element is the dom node, item.index is the index
06:52:41  <substack>then you can just list.splice(item.index, 1)
06:52:48  <Raynos>that will break
06:52:53  <Raynos>if the node is moved around on your behalf
06:53:14  <Raynos>and item is the value
06:53:21  <substack>then don't let people move things around at all
06:53:27  <substack>make it go through the stream from the server
06:53:41  <Raynos>but it will still break
06:53:47  <Raynos>because the function doesnt get called with the new index
06:53:55  * dominictarrjoined
06:53:58  <Raynos>you need to do list.indexOf to get the correct index
06:54:09  * joshwnjquit (Ping timeout: 260 seconds)
06:55:36  <substack>that's why you emit events on item!
06:55:53  <substack>item.on('update', function () { /* called when there's a new index or value */ })
06:56:12  <substack>and you can have listeners in the same scope as you create the inner span
06:56:16  <substack>in your example
06:56:27  <substack>and you can update the elements all in the same place
06:58:06  <substack>otherwise you'd have to expose span to the outside scope or query it through the container element
06:59:02  <Raynos>...
06:59:19  <Raynos>Oh interesting
06:59:26  <Raynos>you actually want to get an event when there is a new index
06:59:34  <Raynos>you can trivially get events when the value changes
06:59:47  <substack>yes you get a new event when the index changes in sorta
07:00:01  <substack>it's useful if you want to show the rank in the element
07:00:07  <substack>which is really common for lists of things
07:00:09  <Raynos>agreed
07:00:33  <Raynos>(value, element, index)
07:00:48  <Raynos>and if the value is an event emitter the element-list will emit index events when the index changes
07:01:11  <Raynos>or wait
07:01:18  <Raynos>maybe the list widget should do this
07:01:27  <Raynos>Ugh
07:01:31  <Raynos>I need to think about it more
07:01:43  <substack>or item.value, item.element, item.index
07:01:54  <Raynos>meh uncessary object :P
07:01:56  <substack>then you can just emit item in the list elements too and inspect the pieces
07:03:21  <substack>anyhow working on ci a little here before getting some sleep
07:05:44  <dools>i emit timely items "i" times
07:07:05  <Raynos>ill work on it some more tomorrow night
07:07:45  <Raynos>dominictarr: Feedback on splice-stream & delta-stream appreciated, I want to find a way to make those compatible with crdt
07:08:02  <dominictarr>Raynos, just writing a reply now
07:08:35  <Raynos>o/
07:09:01  <substack>basically need browser badges on all of npm
07:09:17  <Raynos>yes we do :P
07:09:25  * substackbuilds that
07:09:25  <Raynos>especially node-tap
07:10:32  <substack>and an `npm star` bot that stars and de-stars based on browser compat
07:11:21  <dominictarr>Raynos, check your inbox!
07:15:11  <Raynos>this presentations file explains
07:15:19  <Raynos>why my crdt doesnt work like I expected it to
07:15:37  <Raynos>I cant change prop A on row X in node Y and prop B on row X in node Z
07:15:43  <Raynos>and then merge those two changes
07:16:01  <Raynos>because crdt docs update entire rows at once
07:16:30  <Raynos>dominictarr: how should I do partial updates to a row like that?
07:17:02  * timoxleyquit (Quit: Computer has gone to sleep.)
07:17:55  <substack>if you have a single data source it isn't a problem
07:17:58  <substack>and you're not merging
07:18:22  <substack>like if splice stream data only ever flows one way, from the server to clients
07:19:05  <Raynos>nope this is meant for peer to peer
07:19:12  <Raynos>where any peer can flow changes to any other peer
07:19:17  <Raynos>in arbitary orders
07:26:25  <Raynos>dominictarr: https://github.com/dominictarr/presentations/blob/master/crdt.md this is super awesome, thanks.
07:41:09  <dominictarr>Raynos, It's A talk I gave the other day is Krakow
07:41:20  <dominictarr>s/is/in
07:42:08  <dominictarr>Raynos, you should be able to "update prop A on row X in node Y and prop B on row X in node Z"
07:42:41  <dominictarr>because Y will have {A: 1} and Z will have {B: 2} and that merges fine.
07:43:13  <dominictarr>you'll just have to wait for the messages to arrive. what are you seeing?
07:45:28  <Raynos>The talk implies that the [key, value] updates are whole value updates
07:45:38  <Raynos>I think im just mis interpreting things
07:45:48  <Raynos>I'll try to reproduce it
07:47:48  <dominictarr>I think that is a bug.
07:48:17  <dominictarr>I explained in the issue
07:49:58  <Raynos>Oh interesting
07:50:04  <Raynos>sources get their own timers
07:50:58  <dominictarr>yeah, so that should work
08:01:58  <Raynos>dominictarr: should I make a PR for turning a set into a splice-stream or should I re-implement the splice stream interface to work cleanly with non-local changes?
08:05:58  <dominictarr>Raynos, I don't want to add any extra streaming interfaces to crdt.
08:06:21  <Raynos>dominictarr: Then I'll push it into splice stream
08:06:23  <dominictarr>if you want to do that, make something that takes a set as an argument.
08:06:27  <dominictarr>yeah.
08:07:02  <Raynos>dominictarr: What do you use to synchronize crdt Rows / Sets with UI components? Manual event glueing?
08:07:18  * thatguydanquit (Ping timeout: 256 seconds)
08:07:25  <dominictarr>yeah, so far. it's pretty easy.
08:07:44  <dominictarr>I use http://vanilla-js.com/
08:07:53  <dominictarr>Vanilla JS
08:08:26  <Raynos>pretty easy :P
08:08:34  <Raynos>you use all kinds of jquery UI wizardry
08:08:36  <Raynos>I've seen you
08:09:01  <Raynos>I think the streaming approach is a lot cleaner
08:15:57  <dominictarr>yeah, I was looking for something that let me drag and drop to reorder the list.
08:16:32  <dominictarr>jquery came out pretty ugly, I was even too embarrased to make it a seperate module.
08:16:34  <Raynos>Ill going to write that tomorrow
08:16:40  <Raynos>depends on how diffficult it is
08:16:52  <dominictarr>would prefer a vanilla js thing.
08:17:03  <Raynos>._.
08:17:10  <Raynos>Who wouldn't
08:17:19  <dominictarr>the jquery UI draggable is like 1.5k lines
08:17:27  <dominictarr>so I figured it's pretty hard
08:17:39  <dominictarr>or maybe it's 3000 can't remember.
08:17:54  <dominictarr>keyboard controls would be cool too.
08:18:24  <dominictarr>I have some stuff here: https://github.com/dominictarr/vu
08:18:36  <dominictarr>that I was experimenting with back in the summer.
08:18:50  <dominictarr>it has reordering, but only keys, not mouse.
08:19:30  <Raynos>I doubt its hard
08:19:46  <Raynos>its just using the html5 drag & drop API
08:20:37  <Raynos>First I need to fix splice-stream & element-list to be less stupid
08:20:38  <dominictarr>doesn't work in chrome, when I tested.
08:22:39  <dominictarr>false alarm. it does work
08:23:03  <dominictarr>yeah, that approach should be way easier.
08:23:43  <Raynos>yeah I write a lot of modern browsers only code
08:23:46  <Raynos>its a lot easier
08:23:56  <Raynos>I can always go back and make demos work in other browsers later
08:25:48  <dominictarr>no body cool uses those old browsers anyway
08:26:07  <dominictarr>who wants to code for uncool people?
08:26:23  <Raynos>thats my philosophy
08:26:42  <Raynos>There are enough cool people that I can make good money just coding for them
08:26:51  <Raynos>other people can code for the uncool people
08:28:20  <Raynos>Btw, SVG is awesome
08:28:29  <Raynos>Why do people use so much HTML and so little SVG
08:31:47  <dominictarr>who do you work for?
08:31:52  <dominictarr>you do consulting?
08:32:07  <dominictarr>or contracting?
08:34:39  <Raynos>I work for a startup in San fran
08:34:56  <Raynos>We build english learning web apps
08:35:02  <Raynos>backend is entirely node of course.
08:37:48  <dominictarr>oh, interesting. I've been thinking about english learning webapps, from travelling in Cambodia
08:38:04  <dominictarr>substack, maxogden check this out https://www.airbnb.com/rooms/542031
08:38:40  <Raynos>thats crazy
08:38:42  <substack>saw it!
08:38:43  <dominictarr>^ is pretty cool, but I can think of one significant improvement: what if it was also a boat
08:38:49  <Raynos>dominictarr: your going to be at summer camp right?
08:39:28  <dominictarr>no, I'm in Europe. don't have the budget for trip to US at the moment.
08:40:04  <substack>every city should have hundreds of those things
08:40:15  * thatguydanjoined
08:41:15  <Raynos>oh :(
08:41:33  <dominictarr>come to nodedublin!
08:41:42  <Raynos>Maybe I should
08:41:57  <Raynos>If I can convince one of these conferences to let me speak do they pay my ticket?
08:43:11  <dominictarr>to the conference? of course.
08:43:52  <dominictarr>or do you mean air ticket?
08:44:41  <Raynos>I meant the conference ticket
08:44:48  <Raynos>I can do the air ticket myself
08:44:55  <Raynos>I need to speak at a conference
08:45:22  <Raynos>Preferably a front end JS thing and speak about how streams everywhere is the best idea ever
08:46:27  <substack>trying to remember how I fell into speaking at conferences
08:46:53  <substack>hundreds of modules plus blogging, but lots of folks have a crazy amount of modules now
08:47:03  <Raynos>well yeah
08:47:12  <Raynos>I have managed to rise high enough on npmtop
08:47:15  <Raynos>I just need more blogging
08:47:19  <Raynos>I dont talk about anything i write
08:47:21  <substack>I haven't even built anything especially impressive
08:47:23  <Raynos>too much code to still write
08:47:25  <substack>I've just built a lot of things
08:47:37  <Raynos>Meh browserify is non trivial
08:47:47  <dominictarr>Raynos, start speaking at meetups.
08:47:52  <substack>browserify is also crazy hackneyed crap >_<
08:47:54  <Raynos>I should do that more
08:48:01  <substack>I mean it's hackneyed crap that works really well
08:48:05  <substack>and has crazy test coverage
08:48:07  <substack>but still
08:48:33  <dominictarr>substack, it's a messy problem.
08:49:17  <substack>there are no messy problems, only messy solutions
08:49:32  <substack>and it's often far easier at first to write a messy solution than a clean one
08:50:26  <dominictarr>there _are_ messy problems. well, it depends on where you mark out the bounds of the problem.
08:52:07  <substack>most of browserify's mess is that it has a lot of legacy api
08:52:43  <substack>because the implementation emphasis completely shifted 3 times
08:52:58  <dominictarr>I gotta go catch a train - talk to you guys when I'm in Berlin!
08:53:10  <substack>see you there!
08:56:19  <substack>blarg I'm thinking that testling should just let the test harnesses write to process.stdout
08:56:31  <substack>then I can just browserify them and submit minor changes
08:56:45  <substack>and stop having to mess around with every little thing
08:57:49  * dominictarrquit (Ping timeout: 246 seconds)
08:58:41  <substack>and then everything will just work
08:58:49  <substack>because browserify will MAKE IT WORK
09:01:30  <Raynos>testling should let the test harness output TAP to stdout
09:01:41  <Raynos>or down some channel that goes out of the browser and in happy land
09:03:29  <substack>yes
09:03:43  <substack>I can just process.stdout = shoe('/stdout')
09:03:51  <substack>process.stderr = shoe('/stderr')
09:04:59  <Raynos>Better yet
09:05:02  <Raynos>do it cross domain
09:05:15  <substack>sockjs is already cross-domain
09:05:20  <Raynos>yeah exactly
09:05:28  <Raynos>shoe("http://testling.com/stdout")
09:05:35  <substack>hah
09:05:38  <substack>yes
09:05:39  <Raynos>that way you dont need that damned proxy server
09:05:40  <Raynos>in testling
09:06:07  <substack>still do
09:06:13  <Raynos>oh for schoolbus >_<
09:06:18  <Raynos>schoolbus is such a hack :D
09:06:31  <Raynos>I tried using it
09:06:43  <Raynos>at some point it tried sending the window object to the iframe over the dnode protocol
09:06:52  <Raynos>man that blows up hard when dnode tries to serialize window
09:07:12  <Raynos>something should have a if (thing === window) { bail early }
09:07:18  <substack>because the dom has infinite non-circular recursion via getters
09:07:28  <substack>all dom nodes have this property, not just window
09:07:40  <substack>needs to just have a depth limit
09:09:55  <substack>writing seemily unrelated libraries opens up crazy shit like process.stdout = shoe('/stdout')
09:10:02  <substack>pretty excellent
09:11:54  <substack>I'll just have the /stdout and /stderr go to the ci server to start
09:44:28  <substack>ok I'm not running vanilla tap tests in browsers
09:44:41  <substack>with 15 lines of boiler plate at the top
09:44:50  <substack>just sets up shoe and a few others
09:50:24  * sorensenquit (Quit: ZNC - http://znc.sourceforge.net)
09:52:16  * sorensenjoined
09:55:21  <substack>Raynos: so the other issue with browsers and ci is that you'll probably want to run tests against a specific version of an app
09:55:41  <Raynos>well I want to run unit tests
09:55:44  <Raynos>againts my code
09:55:55  <substack>yes it's probably good to focus this on unit tests first
09:56:04  <Raynos>integration tests are a pain
09:56:09  <Raynos>as schoolbus is unstable
09:56:18  <substack>but later spin up real apps in sandboxes
09:56:24  <Raynos>doing integration testing in selenium is easy
09:56:31  <Raynos>doing unit tests in selenium is epic pain in the ass
09:56:32  <substack>nodejitsu already figured all the sandboxing, can probably just work with them
09:56:43  <substack>ah true
09:56:48  <Raynos>so focus on the unit tests
09:57:01  <Raynos>the way I run unit tests
09:57:03  <substack>step 1 getting a ton of testling badges on github for unit tests
09:57:15  <Raynos>is I have a list of files to browserify and then be included in a browser
09:57:34  <Raynos>so all you really need to do is accept a bundle.js from me and somehow return the TAP output back to me
09:57:59  <substack>yep that's what this thing does right now
09:58:13  <substack>exactly what you say
09:58:37  <Raynos>yeah thats what I want
09:58:43  <Raynos>because i have a super sweet test runner
09:58:47  <Raynos>that takes TAP on stdin
09:58:50  <Raynos>and does custom reporting
10:04:30  <Raynos>id be nice it if works with just node-tap
10:04:35  <substack>it does
10:04:35  <Raynos>and not with the testling wrapper
10:04:37  <substack>that's the plan
10:04:41  <Raynos>:D
10:04:48  <substack>here I'll show you my test thing
10:05:39  <substack>https://gist.github.com/3487083
10:06:28  <substack>I'll make browserify have an empty global Buffer and global=window
10:06:46  <substack>but just module scoped, not real globals
10:06:58  <substack>that will fix the issues with tap
10:07:03  <substack>and also the process.on() thing
10:07:20  <Raynos>fantastic
10:07:30  <Raynos>now I just need a way to parse out TAP output from console.log
10:07:31  <substack>then it will all just work™
10:07:36  <Raynos>The only other thing is reducing latency
10:07:39  <substack>oh and I had a shim for child_process that will land
10:07:45  <Raynos>so I get my test results back in <1s
10:08:03  <substack>this is more like travis
10:08:12  <substack>for github badges
10:08:38  <Raynos>I see
10:08:42  <Raynos>that works too tbh
10:12:20  * substackzzz &
11:37:55  * wiwilliajoined
12:09:23  * AvianFluquit (Quit: AvianFlu)
12:59:49  * wiwilliaquit (Read error: Connection reset by peer)
13:18:16  * mikealquit (Quit: Leaving.)
14:53:59  * st_luke_changed nick to st_luke
15:08:50  * AvianFlujoined
15:18:05  * AvianFluquit (Ping timeout: 248 seconds)
20:26:45  * SubStacktopic: http://browserling.com | http://testling.com | We put a browser in your browser!
20:31:30  <st_luke>this looks like a good deal: http://newyork.craigslist.org/mnh/bik/3209146609.html
20:34:04  <Raynos>st_luke: Do you want a bike? I have one for sale
20:34:13  <Raynos>if your small it would fit you
20:34:39  <st_luke>Raynos: in nyc?
20:34:48  <Raynos>st_luke: y u no in bay area
20:35:07  <st_luke>I haven't migrated yet
20:36:02  <st_luke>maybe next year
21:38:20  * idletomjoined
21:39:14  * ircretary1joined
21:39:43  * ircretary1quit (Remote host closed the connection)
21:40:02  * ircretary1joined
21:41:07  * ircretary1quit (Remote host closed the connection)
21:47:35  * AvianFluquit (Quit: AvianFlu)
22:10:25  <Raynos>does anyone have a streaming testing library?
22:17:47  <maxogden>dominic has a stream api compliance test lib
22:41:09  * timoxleyjoined
22:52:48  * timoxleyquit (Quit: Computer has gone to sleep.)
23:13:05  * joshwnjjoined
23:22:03  * thatguydanquit (Quit: thatguydan)
23:25:10  * maksimlinjoined
23:49:30  * substackback from crazy waiting in line adventure at the chinese consulate