New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

This ORM is amazing. Period. #69

Closed
DiegoMax opened this Issue Sep 25, 2013 · 34 comments

Comments

Projects
None yet
@DiegoMax

DiegoMax commented Sep 25, 2013

Sorry that i write this here, but i couldn't find any other place where to rant about this.

After trying 3 other ORM's for node, finally i somehow arrived here (even if google refuses to show this page when you search for "nodejs ORM"), and after playing with it for a while i can only say that this is the most flexible ORM so far.

I am in the process of moving a currently working API made in rails into a node app. The only one ORM that allowed me to format the objects the way i want, build relations any way i want and a lot other stuff without having to deal with incredible annoying "assumptions" has been this one.

Since im not a Backbone user, it took me a little while to realize how to do some stuff, but after some investigation and reading of your incredibly documented sources i am now up and running.

Thanks for such an amazing piece of software, you rock.

// Diego

@DiegoMax

This comment has been minimized.

Show comment
Hide comment
@DiegoMax

DiegoMax Sep 25, 2013

Follow up for anyone reading this:

The following kind of flexibility just shows how far away this ORM is from the others.

.fetch({
    withRelated: [
        'Profile',
        {'ActiveBooking': function(qb) {
            qb.whereIn('status', ['STBookingInTransit'])
        }},
        'ActiveBooking.Driver',
        'ActiveBooking.User'
    ]
})

DiegoMax commented Sep 25, 2013

Follow up for anyone reading this:

The following kind of flexibility just shows how far away this ORM is from the others.

.fetch({
    withRelated: [
        'Profile',
        {'ActiveBooking': function(qb) {
            qb.whereIn('status', ['STBookingInTransit'])
        }},
        'ActiveBooking.Driver',
        'ActiveBooking.User'
    ]
})
@tgriesser

This comment has been minimized.

Show comment
Hide comment
@tgriesser

tgriesser Sep 25, 2013

Member

Thanks for all of the kind words @DiegoMax! Glad to hear you're enjoying the simplicity I've been aiming for in the library!

I think I'll keep this ticket open for awhile. Anyone reading can feel free to chime in with any success stories, cool things you've built, or things you've discovered in the library here.

Member

tgriesser commented Sep 25, 2013

Thanks for all of the kind words @DiegoMax! Glad to hear you're enjoying the simplicity I've been aiming for in the library!

I think I'll keep this ticket open for awhile. Anyone reading can feel free to chime in with any success stories, cool things you've built, or things you've discovered in the library here.

@shanehyde

This comment has been minimized.

Show comment
Hide comment
@shanehyde

shanehyde Sep 25, 2013

I have to agree, I had tried most of the others and this one fits the bill very well. fast, works well.

Could use a bit more examples of updating/inserting data with the various associations, but easy enough to read the source/test cases to figure most of it out.

shanehyde commented Sep 25, 2013

I have to agree, I had tried most of the others and this one fits the bill very well. fast, works well.

Could use a bit more examples of updating/inserting data with the various associations, but easy enough to read the source/test cases to figure most of it out.

@DiegoMax

This comment has been minimized.

Show comment
Hide comment
@DiegoMax

DiegoMax Sep 25, 2013

@shanehyde it should be US the ones updating the docs (leave @tgriesser making the foundation better 😃) , i will contribute with that after i get to know the ORM 100%, that's for sure, but to be honest, at least for me, there is a lot of common sense development in here, most things are just really natural!
Im also in love with Knex, not only because i have been a long time knex ball machine fan, but because that query builder is just beautiful. I really can't believe i wasted months with other ORM's.

DiegoMax commented Sep 25, 2013

@shanehyde it should be US the ones updating the docs (leave @tgriesser making the foundation better 😃) , i will contribute with that after i get to know the ORM 100%, that's for sure, but to be honest, at least for me, there is a lot of common sense development in here, most things are just really natural!
Im also in love with Knex, not only because i have been a long time knex ball machine fan, but because that query builder is just beautiful. I really can't believe i wasted months with other ORM's.

@brianjmiller

This comment has been minimized.

Show comment
Hide comment
@brianjmiller

brianjmiller Oct 3, 2013

Was thinking of opening this as a separate feature request or at least some place to capture what I found. I was trying to use a cloned model as a basis for a new one with resetting only the unique keys but ran into trouble with getting the "id" included in the insert for a not null PK in Postgres. Perhaps it is obvious and I was tired, but ultimately I had to do:

instance = model.clone();
delete instance.id;
delete instance.attributes.id;
// set other instance unique keys
instance.save().then(....);

I wonder if either a "clonseAsNew" (or similar) method would make sense, or some way to clear the "id" without hard deleting the properties. Either way I've achieved posterity for the comment.

Really liking the ORM so far, and the fact that transaction support has been introduced so early makes me hopeful, ORMs that ignore transactions I just can't trust.

brianjmiller commented Oct 3, 2013

Was thinking of opening this as a separate feature request or at least some place to capture what I found. I was trying to use a cloned model as a basis for a new one with resetting only the unique keys but ran into trouble with getting the "id" included in the insert for a not null PK in Postgres. Perhaps it is obvious and I was tired, but ultimately I had to do:

instance = model.clone();
delete instance.id;
delete instance.attributes.id;
// set other instance unique keys
instance.save().then(....);

I wonder if either a "clonseAsNew" (or similar) method would make sense, or some way to clear the "id" without hard deleting the properties. Either way I've achieved posterity for the comment.

Really liking the ORM so far, and the fact that transaction support has been introduced so early makes me hopeful, ORMs that ignore transactions I just can't trust.

@DiegoMax

This comment has been minimized.

Show comment
Hide comment
@DiegoMax

DiegoMax Oct 3, 2013

How about something like model.forge(oldModel.toJSON()), that should give u a cloned instance without ID.

DiegoMax commented Oct 3, 2013

How about something like model.forge(oldModel.toJSON()), that should give u a cloned instance without ID.

@DiegoMax

This comment has been minimized.

Show comment
Hide comment
@DiegoMax

DiegoMax Oct 3, 2013

sorry, forgot to remove the id prop, this should work: model.forge(_.omit(oldModel.toJSON(), 'id'))

DiegoMax commented Oct 3, 2013

sorry, forgot to remove the id prop, this should work: model.forge(_.omit(oldModel.toJSON(), 'id'))

@DiegoMax

This comment has been minimized.

Show comment
Hide comment
@DiegoMax

DiegoMax Oct 3, 2013

and of course, you could also implement the method on your model, something like:

clone: function() {
    return yourBaseModelInstance.forge(_.omit(this.toJSON(), 'id'));
}

I have not tested this code, but it should give you the idea.

DiegoMax commented Oct 3, 2013

and of course, you could also implement the method on your model, something like:

clone: function() {
    return yourBaseModelInstance.forge(_.omit(this.toJSON(), 'id'));
}

I have not tested this code, but it should give you the idea.

@tgriesser

This comment has been minimized.

Show comment
Hide comment
@tgriesser

tgriesser Oct 3, 2013

Member

Hey @brianjmiller... as @DiegoMax sort of mentioned, I would probably just create a custom method on your base Model's prototype for this:

bookshelf.Model.prototype.cloneAsNew = function() {
  return new this.constructor(_.omit(this.attributes, 'id'));
}

I didn't use the this.toJSON because unless you pass {shallow: true} it includes all of the items in the relations hash.

Not saying this wouldn't be useful, I think it might be something I'll consider for the active-record branch/features I'm working on, which will give some nice interfaces to the core functionality provided by Bookshelf.

My idea is that eventually you'll use require('bookshelf/active-record') to get that interface (which will be a superset of the Bookshelf interface).

Member

tgriesser commented Oct 3, 2013

Hey @brianjmiller... as @DiegoMax sort of mentioned, I would probably just create a custom method on your base Model's prototype for this:

bookshelf.Model.prototype.cloneAsNew = function() {
  return new this.constructor(_.omit(this.attributes, 'id'));
}

I didn't use the this.toJSON because unless you pass {shallow: true} it includes all of the items in the relations hash.

Not saying this wouldn't be useful, I think it might be something I'll consider for the active-record branch/features I'm working on, which will give some nice interfaces to the core functionality provided by Bookshelf.

My idea is that eventually you'll use require('bookshelf/active-record') to get that interface (which will be a superset of the Bookshelf interface).

@DiegoMax

This comment has been minimized.

Show comment
Hide comment
@DiegoMax

DiegoMax Oct 3, 2013

I can't get my head over the "javascript way" of things yet hehe, a "clone" method as a "class" method is completely amazing for a C/Objective-C person like me, but now that i see it, as usual, it makes sense.

DiegoMax commented Oct 3, 2013

I can't get my head over the "javascript way" of things yet hehe, a "clone" method as a "class" method is completely amazing for a C/Objective-C person like me, but now that i see it, as usual, it makes sense.

@darethas

This comment has been minimized.

Show comment
Hide comment
@darethas

darethas Nov 25, 2013

Just as a general inquiry -- Is the use of this ORM possible with AngularJS?

darethas commented Nov 25, 2013

Just as a general inquiry -- Is the use of this ORM possible with AngularJS?

@tgriesser

This comment has been minimized.

Show comment
Hide comment
@tgriesser

tgriesser Nov 25, 2013

Member

AngularJS is client side, this is currently only for node.js for interacting with server-side databases... though I do eventually plan on making this and other related things I'm working on for it available on the client side, that's a bit down the road.

Member

tgriesser commented Nov 25, 2013

AngularJS is client side, this is currently only for node.js for interacting with server-side databases... though I do eventually plan on making this and other related things I'm working on for it available on the client side, that's a bit down the road.

@darethas

This comment has been minimized.

Show comment
Hide comment
@darethas

darethas Nov 25, 2013

Oh great. I am looking to drop this in, instead of Mongoose. I ran into headaches with Mongoose (albeit probably mainly due to my lack of knowledge) with populations and trying to do relationships. This has more of an active-recordish feel to it, and just plain looks easier.

darethas commented Nov 25, 2013

Oh great. I am looking to drop this in, instead of Mongoose. I ran into headaches with Mongoose (albeit probably mainly due to my lack of knowledge) with populations and trying to do relationships. This has more of an active-recordish feel to it, and just plain looks easier.

@tgriesser

This comment has been minimized.

Show comment
Hide comment
@tgriesser

tgriesser Nov 25, 2013

Member

Great to hear! Actually, next on my todo list is giving it even more of an Active Record feel (static finder methods, etc), but in the meantime everything in the library so-far should work really well, feel free to open a ticket if you see otherwise!

Member

tgriesser commented Nov 25, 2013

Great to hear! Actually, next on my todo list is giving it even more of an Active Record feel (static finder methods, etc), but in the meantime everything in the library so-far should work really well, feel free to open a ticket if you see otherwise!

@mistakia

This comment has been minimized.

Show comment
Hide comment
@mistakia

mistakia Nov 25, 2013

I have bookshelf/knex powering a nodejs API that angularjs taps into and
it's a lot of fun. Relations are a breeze.

On Monday, November 25, 2013, Tim Griesser wrote:

Great to hear! Actually, next on my todo list is giving it even more of an
Active Record feel (static finder methods, etc), but in the meantime
everything in the library so-far should work really well, feel free to open
a ticket if you see otherwise!


Reply to this email directly or view it on GitHubhttps://github.com/tgriesser/bookshelf/issues/69#issuecomment-29234222
.

Kia Rahimian
@vacaywave https://twitter.com/vacaywave
fb.com/VacayWave https://www.facebook.com/VacayWave

mistakia commented Nov 25, 2013

I have bookshelf/knex powering a nodejs API that angularjs taps into and
it's a lot of fun. Relations are a breeze.

On Monday, November 25, 2013, Tim Griesser wrote:

Great to hear! Actually, next on my todo list is giving it even more of an
Active Record feel (static finder methods, etc), but in the meantime
everything in the library so-far should work really well, feel free to open
a ticket if you see otherwise!


Reply to this email directly or view it on GitHubhttps://github.com/tgriesser/bookshelf/issues/69#issuecomment-29234222
.

Kia Rahimian
@vacaywave https://twitter.com/vacaywave
fb.com/VacayWave https://www.facebook.com/VacayWave

@darethas

This comment has been minimized.

Show comment
Hide comment
@darethas

darethas Nov 26, 2013

@vacay care to share your experience?

darethas commented Nov 26, 2013

@vacay care to share your experience?

@mistakia

This comment has been minimized.

Show comment
Hide comment
@mistakia

mistakia Nov 26, 2013

Sure - I recently undertook a rewrite of a project I'm working on with the
primary goal of improving the manageability of the code base.

I decided to migrate from sequelize to bookshelf/knex and couldn't be
happier. My controllers are much slimmer because of better relation
handling/eager-loading and support for polymorphic associations and
'through' - not supported in sequelize. But I think the best part of the
transition has been having access to the underlying query builder knex. So
far the grass has truly been greener and the only problems I've had are
with node-mysql - for some reason I'm not getting any packet responses from
mysql and therefore it's not emitting a callback for 'LOAD DATA' queries.
Also, if your still residing in callback hell, like me, both knex &
bookshelf expose the method exec().

Although I've never considered mongo for anything more than dumping logs in
and I've only been using bookshelf/knex for a week, I can confidently say
that the bookshelf/knex combo is at the top when it comes to relational
database libraries in nodejs.

p.s. both sources are small and easy to read in case you ever need to dig
in.
p.s.s these class property CRUD wrappers are a nice touch i.e.
findAll/browse, findOne/read, edit/update, add/create, destroy/delete -
https://github.com/TryGhost/Ghost/blob/master/core/server/models/base.js
p.s.s.s if your set on using a doc store with angular, take a look at
couchdb with pouchdb (http://pouchdb.com/) - ive always been interested in
testing it out

On Tuesday, November 26, 2013, Dimitrios Arethas wrote:

@vacay https://github.com/vacay care to share your experience?


Reply to this email directly or view it on GitHubhttps://github.com/tgriesser/bookshelf/issues/69#issuecomment-29268402
.

mistakia commented Nov 26, 2013

Sure - I recently undertook a rewrite of a project I'm working on with the
primary goal of improving the manageability of the code base.

I decided to migrate from sequelize to bookshelf/knex and couldn't be
happier. My controllers are much slimmer because of better relation
handling/eager-loading and support for polymorphic associations and
'through' - not supported in sequelize. But I think the best part of the
transition has been having access to the underlying query builder knex. So
far the grass has truly been greener and the only problems I've had are
with node-mysql - for some reason I'm not getting any packet responses from
mysql and therefore it's not emitting a callback for 'LOAD DATA' queries.
Also, if your still residing in callback hell, like me, both knex &
bookshelf expose the method exec().

Although I've never considered mongo for anything more than dumping logs in
and I've only been using bookshelf/knex for a week, I can confidently say
that the bookshelf/knex combo is at the top when it comes to relational
database libraries in nodejs.

p.s. both sources are small and easy to read in case you ever need to dig
in.
p.s.s these class property CRUD wrappers are a nice touch i.e.
findAll/browse, findOne/read, edit/update, add/create, destroy/delete -
https://github.com/TryGhost/Ghost/blob/master/core/server/models/base.js
p.s.s.s if your set on using a doc store with angular, take a look at
couchdb with pouchdb (http://pouchdb.com/) - ive always been interested in
testing it out

On Tuesday, November 26, 2013, Dimitrios Arethas wrote:

@vacay https://github.com/vacay care to share your experience?


Reply to this email directly or view it on GitHubhttps://github.com/tgriesser/bookshelf/issues/69#issuecomment-29268402
.

@demisx

This comment has been minimized.

Show comment
Hide comment
@demisx

demisx Dec 29, 2014

A year later, do you guys still feel strong Bookshelf.js is a better ORM than Sequelize? I am in the process of choosing one and would prefer something that's more like ActiveRecord like. Thank you in advance for sharing your experience and Happy New 2015 Year!

demisx commented Dec 29, 2014

A year later, do you guys still feel strong Bookshelf.js is a better ORM than Sequelize? I am in the process of choosing one and would prefer something that's more like ActiveRecord like. Thank you in advance for sharing your experience and Happy New 2015 Year!

@marcoschicote

This comment has been minimized.

Show comment
Hide comment
@marcoschicote

marcoschicote Jan 15, 2015

Hi @demisx, I quite new to bookshelf and I only used it for one small example. My requirements are to be able to save a record, fetch a lot of records and save some of them back with a few minor modifications (one by one). I tried bookshelf and asked a couple of questions in Github. I had a really nice experience and the project maintainers answered gently and fast.
However, I will be moving away from bookshelf for now as there's no support for pagination. One can bypass this and query using knex but the resulting collection will not be a collection of models. For me, for now, that's a deal breaker. But I will definitely keep track of this project as it sounds quite interesting.

marcoschicote commented Jan 15, 2015

Hi @demisx, I quite new to bookshelf and I only used it for one small example. My requirements are to be able to save a record, fetch a lot of records and save some of them back with a few minor modifications (one by one). I tried bookshelf and asked a couple of questions in Github. I had a really nice experience and the project maintainers answered gently and fast.
However, I will be moving away from bookshelf for now as there's no support for pagination. One can bypass this and query using knex but the resulting collection will not be a collection of models. For me, for now, that's a deal breaker. But I will definitely keep track of this project as it sounds quite interesting.

@demisx

This comment has been minimized.

Show comment
Hide comment
@demisx

demisx Jan 15, 2015

@mchicote Thank you very much for your feedback. I didn't know about the pagination issue with the Bookshelf.

demisx commented Jan 15, 2015

@mchicote Thank you very much for your feedback. I didn't know about the pagination issue with the Bookshelf.

@tgriesser

This comment has been minimized.

Show comment
Hide comment
@tgriesser

tgriesser Jan 15, 2015

Member

@mchicote yep - keep an eye out, there will be lots of big developments coming soon.

As for pagination, you can actually tap into the query chain by calling query with arguments as opposed to with no arguments:

user.query({limit: 10, offset: 30}).fetchAll() // result will be a collection of models
user.query().limit(10).offset(30).select() // result will be an array of vanilla objects

So while there isn't anything "baked in" it's actually possible to paginate / modify any queries while maintaining models quite easily.

Member

tgriesser commented Jan 15, 2015

@mchicote yep - keep an eye out, there will be lots of big developments coming soon.

As for pagination, you can actually tap into the query chain by calling query with arguments as opposed to with no arguments:

user.query({limit: 10, offset: 30}).fetchAll() // result will be a collection of models
user.query().limit(10).offset(30).select() // result will be an array of vanilla objects

So while there isn't anything "baked in" it's actually possible to paginate / modify any queries while maintaining models quite easily.

@demisx

This comment has been minimized.

Show comment
Hide comment
@demisx

demisx Jan 15, 2015

@tgriesser 👍 So great to hear it.

demisx commented Jan 15, 2015

@tgriesser 👍 So great to hear it.

@marcoschicote

This comment has been minimized.

Show comment
Hide comment
@marcoschicote

marcoschicote Jan 15, 2015

@tgriesser this is what I mean, really fast at answering questions or complaints.
The thing is that if I do that and add

.then(function(collection){ collection.at(0).product_id })

it returns undefined. Am I missing something else? If I inspect the collection and go models[0].attributes.product_id I get the correct value, that's why I thought the model was not being built.

marcoschicote commented Jan 15, 2015

@tgriesser this is what I mean, really fast at answering questions or complaints.
The thing is that if I do that and add

.then(function(collection){ collection.at(0).product_id })

it returns undefined. Am I missing something else? If I inspect the collection and go models[0].attributes.product_id I get the correct value, that's why I thought the model was not being built.

@bendrucker

This comment has been minimized.

Show comment
Hide comment
@bendrucker

bendrucker Jan 15, 2015

Member

collection.at(0).get('product_id')

Member

bendrucker commented Jan 15, 2015

collection.at(0).get('product_id')

@marcoschicote

This comment has been minimized.

Show comment
Hide comment
@marcoschicote

marcoschicote Jan 15, 2015

Thanks @bendrucker. Is there a way I can access the attributes using the dot notation? I thought about virtuals but if the attribute and the virtual are named the same, I get a loop.

marcoschicote commented Jan 15, 2015

Thanks @bendrucker. Is there a way I can access the attributes using the dot notation? I thought about virtuals but if the attribute and the virtual are named the same, I get a loop.

@bendrucker

This comment has been minimized.

Show comment
Hide comment
@bendrucker

bendrucker Jan 15, 2015

Member

No. Bookshelf is currently based on Backbone and the only public interface is via get.

#552 (comment)

Member

bendrucker commented Jan 15, 2015

No. Bookshelf is currently based on Backbone and the only public interface is via get.

#552 (comment)

@marcoschicote

This comment has been minimized.

Show comment
Hide comment
@marcoschicote

marcoschicote Jan 15, 2015

Thanks for all the help @bendrucker

marcoschicote commented Jan 15, 2015

Thanks for all the help @bendrucker

@SusanthCom

This comment has been minimized.

Show comment
Hide comment
@SusanthCom

SusanthCom Oct 8, 2015

@DiegoMax are you still using BookShelf ? How is your experience so far ?

Am yet to make a selection between BookShelfJS / SequelizeJS. Landed this page from a google search. Nice to see many Participants here.

@tgriesser your tips / comments / suggestions gives confidence on this ORM.
Nice to see this Open even after 2 years 👍

The popular Ghost 😃 is depending on "bookshelf": "0.7.9" 👍

Special thanks to @tgriesser and all team members for making such a beautiful Software.
❤️ Keep Rocking ❤️

Update :
for Dependent Repositories and other detailed info, scroll down to bottom of this link.

SusanthCom commented Oct 8, 2015

@DiegoMax are you still using BookShelf ? How is your experience so far ?

Am yet to make a selection between BookShelfJS / SequelizeJS. Landed this page from a google search. Nice to see many Participants here.

@tgriesser your tips / comments / suggestions gives confidence on this ORM.
Nice to see this Open even after 2 years 👍

The popular Ghost 😃 is depending on "bookshelf": "0.7.9" 👍

Special thanks to @tgriesser and all team members for making such a beautiful Software.
❤️ Keep Rocking ❤️

Update :
for Dependent Repositories and other detailed info, scroll down to bottom of this link.

@demisx

This comment has been minimized.

Show comment
Hide comment
@demisx

demisx Oct 8, 2015

We are using Bookshelf 0.8 on multiple projects and it's great. The support from @bendrucker has been amazing while going through initial hoops. Highly recommend this library.

demisx commented Oct 8, 2015

We are using Bookshelf 0.8 on multiple projects and it's great. The support from @bendrucker has been amazing while going through initial hoops. Highly recommend this library.

@SusanthCom

This comment has been minimized.

Show comment
Hide comment
@SusanthCom

SusanthCom Oct 8, 2015

@demisx Thanks for fast response 👍 This looks like the right choice 😄

SusanthCom commented Oct 8, 2015

@demisx Thanks for fast response 👍 This looks like the right choice 😄

@daslicht

This comment has been minimized.

Show comment
Hide comment
@daslicht

daslicht Nov 19, 2015

Is there somewhere a comparison between BookShelfJS / SequelizeJS. ?

daslicht commented Nov 19, 2015

Is there somewhere a comparison between BookShelfJS / SequelizeJS. ?

@daslicht

This comment has been minimized.

Show comment
Hide comment
@daslicht

daslicht Nov 19, 2015

Can you do queries like this (psudocode)

var friend =  find( 'friend', 'name = john');  // find friend john

and later in the code or even in the template get related objects like this:

output:   friend.name ?

or even :

var friends =  findAll( 'friend''); 

iterate over friends object, maybe even in template:
for each friends as friend{
        output:  friend.name;
}


daslicht commented Nov 19, 2015

Can you do queries like this (psudocode)

var friend =  find( 'friend', 'name = john');  // find friend john

and later in the code or even in the template get related objects like this:

output:   friend.name ?

or even :

var friends =  findAll( 'friend''); 

iterate over friends object, maybe even in template:
for each friends as friend{
        output:  friend.name;
}


@ricardograca

This comment has been minimized.

Show comment
Hide comment
@ricardograca

ricardograca Nov 19, 2015

Member

It would be a pretty crappy ORM if you couldn't do any of those things ;) You should check the documentation: http://bookshelfjs.org/

Member

ricardograca commented Nov 19, 2015

It would be a pretty crappy ORM if you couldn't do any of those things ;) You should check the documentation: http://bookshelfjs.org/

@rhys-vdw rhys-vdw closed this Mar 16, 2016

@CodisRedding

This comment has been minimized.

Show comment
Hide comment
@CodisRedding

CodisRedding May 20, 2016

How about now, what does the comparison look like these days?

CodisRedding commented May 20, 2016

How about now, what does the comparison look like these days?

@ricardograca ricardograca removed the events label Jan 2, 2018

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment