-
Notifications
You must be signed in to change notification settings - Fork 211
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
table.createLoadJob has mutually exclusive polymorphic return #640
Comments
I would guess that all the implementor wanted was an early return from the function, and all of the annotations suggesting stream support was done to get the linter off their back. Here's a diff of all I believe we want: https://gist.github.com/stephenplusplus/c20d164ff46aefe0fc0a7165667534a9 |
Thanks @stephenplusplus, that would be breaking API change, and wouldn't reveal the Stream whatsoever. Are we ok with that? |
It's currently not possible to actually get the stream back, right? Would it only break TypeScript compilers if a user was under the impression they'd get a stream back? |
In the current implementation, there are two scenarios that return the Writable stream, but considering it also invokes the supplied callback upon completion, i don't really see the point of returning the Writable. So yes, it is possible to get the stream back (the
Additionally, since it returns the |
@stephenplusplus @JustinBeckwith @shollyman I've not seen a breaking change handled in this library, so I'm curious if you can give @zamnuts and myself more feedback on this |
We are going to be doing a semver major release here in the next or so. If you want to make a breaking change, now would be a good time. |
I tested this out, but it wouldn't actually return a stream to me: 'use strict'
const bigQuery = new (require('@google-cloud/bigquery')).BigQuery()
const dataset = bigQuery.dataset('stephen_has_a_new_dataset')
const table = dataset.table('stephen_has_a_new_table')
const schema = [{"type":"STRING","name":"Name"},{"type":"INTEGER","name":"Age"},{"type":"FLOAT","name":"Weight"},{"type":"BOOLEAN","name":"IsMagic"}]
;(async() => {
await dataset.create()
await table.create(schema)
table.createLoadJob('./location-test-data.json')
.on('error', console.error)
.on('finish', console.log)
})()
I think we just need to move the |
@JustinBeckwith in the next "what" or so? :) i pushed up a draft, still have some testing to do...
@stephenplusplus IIRC |
Ah, I'm caught up now. This will return a stream, like your test case shows (sorry): table.createLoadJob('./location-test-data.json', (err, job, apiResponse) => {
// These are the expected arguments. No stream.
console.log({err, job, apiResponse})
})
.on('data', console.log) // doesn't error
It actually resolves the normally-expected arguments, the Job instance and the POJO apiResponse: table.createLoadJob('./location-test-data.json')
.then(([job, apiResponse]) => {}) I don't believe there's a way to actually get the stream back where a We never meant to allow a stream to be returned, or advertised it (outside of the TypeScript params, right?). So this is the gray area of breaking changes IMO, when an undocumented side-effect will break a user's code. (Documentation being these docs: https://googleapis.dev/nodejs/bigquery/latest/Table.html#createLoadJob, and not TypeScript IDE helpers) But to be safe, and since we have one coming up anyway, sure, it's a breaking change. However, I don't think we need to do too much to fix this. Just not putting the |
* fix!(table): createLoadJobStream sync returns a stream, createLoadJob always returns a job #640 * chore(table): remove createLoadJobStream, createLoadJob test refactor for promises #640 * chore(table): remove never encountered callback noop in createLoadJob given promisifyAll * test(biqquery): add tests to increase codecov as a result of #647 refactor Co-authored-by: Benjamin E. Coe <[email protected]> Co-authored-by: Steffany Brown <[email protected]>
8e26fb5 commit 8e26fb5 Author: Andrew Zammit <[email protected]> Date: Mon Mar 30 21:58:06 2020 -0700 refactor!: don't return Stream from createLoadJob (#647) * fix!(table): createLoadJobStream sync returns a stream, createLoadJob always returns a job #640 * chore(table): remove createLoadJobStream, createLoadJob test refactor for promises #640 * chore(table): remove never encountered callback noop in createLoadJob given promisifyAll * test(biqquery): add tests to increase codecov as a result of #647 refactor Co-authored-by: Benjamin E. Coe <[email protected]> Co-authored-by: Steffany Brown <[email protected]>
* Change triggered by none of the following: This git repo (https://github.com/googleapis/nodejs-bigquery.git) Git repo https://github.com/googleapis/synthtool.git * feat!: drop Node 8 from engines field (#662) 712b029 commit 712b029 Author: Steffany Brown <[email protected]> Date: Mon Mar 30 12:59:52 2020 -0700 feat!: drop Node 8 from engines field (#662) Drops Node 8 from the engines field. * refactor!: don't return Stream from createLoadJob (#647) 8e26fb5 commit 8e26fb5 Author: Andrew Zammit <[email protected]> Date: Mon Mar 30 21:58:06 2020 -0700 refactor!: don't return Stream from createLoadJob (#647) * fix!(table): createLoadJobStream sync returns a stream, createLoadJob always returns a job #640 * chore(table): remove createLoadJobStream, createLoadJob test refactor for promises #640 * chore(table): remove never encountered callback noop in createLoadJob given promisifyAll * test(biqquery): add tests to increase codecov as a result of #647 refactor Co-authored-by: Benjamin E. Coe <[email protected]> Co-authored-by: Steffany Brown <[email protected]> * chore: update dependency @google-cloud/common to v3 (#661) c61407e commit c61407e Author: WhiteSource Renovate <[email protected]> Date: Tue Mar 31 19:27:51 2020 +0200 chore: update dependency @google-cloud/common to v3 (#661) * fix(deps): update dependency @google-cloud/paginator to v3 (#658) a09c493 commit a09c493 Author: WhiteSource Renovate <[email protected]> Date: Tue Mar 31 19:38:07 2020 +0200 fix(deps): update dependency @google-cloud/paginator to v3 (#658) This PR contains the following updates: | Package | Type | Update | Change | |---|---|---|---| | [@google-cloud/paginator](https://togithub.com/googleapis/nodejs-paginator) | dependencies | major | [`^2.0.0` -> `^3.0.0`](https://renovatebot.com/diffs/npm/@google-cloud%2fpaginator/2.0.3/3.0.0) | --- ### Release Notes <details> <summary>googleapis/nodejs-paginator</summary> ### [`v3.0.0`](https://togithub.com/googleapis/nodejs-paginator/blob/master/CHANGELOG.md#​300-httpswwwgithubcomgoogleapisnodejs-paginatorcomparev203v300-2020-03-25) [Compare Source](https://togithub.com/googleapis/nodejs-paginator/compare/v2.0.3...v3.0.0) ##### ⚠ BREAKING CHANGES - **dep:** upgrade gts 2.0.0 ([#​194](https://togithub.com/googleapis/nodejs-paginator/issues/194)) - **deps:** deprecated node 8 to 10; upgrade typescript ##### Miscellaneous Chores - **dep:** upgrade gts 2.0.0 ([#​194](https://www.github.com/googleapis/nodejs-paginator/issues/194)) ([4eaf9be](https://www.github.com/googleapis/nodejs-paginator/commit/4eaf9bed1fcfd0f10e877ff15c1d0e968e3356c8)) - **deps:** deprecated node 8 to 10; upgrade typescript ([f6434ab](https://www.github.com/googleapis/nodejs-paginator/commit/f6434ab9cacb6ab804c070f19c38b6072ca326b5)) ##### [2.0.3](https://www.github.com/googleapis/nodejs-paginator/compare/v2.0.2...v2.0.3) (2019-12-05) ##### Bug Fixes - **deps:** pin TypeScript below 3.7.0 ([e06e1b0](https://www.github.com/googleapis/nodejs-paginator/commit/e06e1b0a2e2bb1cf56fc806c1703b8b5e468b954)) ##### [2.0.2](https://www.github.com/googleapis/nodejs-paginator/compare/v2.0.1...v2.0.2) (2019-11-13) ##### Bug Fixes - **docs:** add jsdoc-region-tag plugin ([#​155](https://www.github.com/googleapis/nodejs-paginator/issues/155)) ([b983799](https://www.github.com/googleapis/nodejs-paginator/commit/b98379905848fd179c6268aff3e1cfaf2bf76663)) ##### [2.0.1](https://www.github.com/googleapis/nodejs-paginator/compare/v2.0.0...v2.0.1) (2019-08-25) ##### Bug Fixes - **deps:** use the latest extend ([#​141](https://www.github.com/googleapis/nodejs-paginator/issues/141)) ([61b383e](https://www.github.com/googleapis/nodejs-paginator/commit/61b383e)) </details> --- ### Renovate configuration 📅 **Schedule**: "after 9am and before 3pm" (UTC). 🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied. ♻️ **Rebasing**: Whenever PR is behind base branch, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box --- This PR has been generated by [WhiteSource Renovate](https://renovate.whitesourcesoftware.com). View repository job log [here](https://app.renovatebot.com/dashboard#googleapis/nodejs-bigquery). * fix(deps): update dependency @google-cloud/promisify to v2 (#657) 5d8112c commit 5d8112c Author: WhiteSource Renovate <[email protected]> Date: Tue Mar 31 19:48:07 2020 +0200 fix(deps): update dependency @google-cloud/promisify to v2 (#657) This PR contains the following updates: | Package | Type | Update | Change | |---|---|---|---| | [@google-cloud/promisify](https://togithub.com/googleapis/nodejs-promisify) | dependencies | major | [`^1.0.0` -> `^2.0.0`](https://renovatebot.com/diffs/npm/@google-cloud%2fpromisify/1.0.4/2.0.0) | --- ### Release Notes <details> <summary>googleapis/nodejs-promisify</summary> ### [`v2.0.0`](https://togithub.com/googleapis/nodejs-promisify/blob/master/CHANGELOG.md#​200-httpswwwgithubcomgoogleapisnodejs-promisifycomparev104v200-2020-03-23) [Compare Source](https://togithub.com/googleapis/nodejs-promisify/compare/v1.0.4...v2.0.0) ##### ⚠ BREAKING CHANGES - update to latest version of gts/typescript ([#​183](https://togithub.com/googleapis/nodejs-promisify/issues/183)) - drop Node 8 from engines field ([#​184](https://togithub.com/googleapis/nodejs-promisify/issues/184)) ##### Features - drop Node 8 from engines field ([#​184](https://www.github.com/googleapis/nodejs-promisify/issues/184)) ([7e6d3c5](https://www.github.com/googleapis/nodejs-promisify/commit/7e6d3c54066d89530ed25c7f9722efd252f43fb8)) ##### Build System - update to latest version of gts/typescript ([#​183](https://www.github.com/googleapis/nodejs-promisify/issues/183)) ([9c3ed12](https://www.github.com/googleapis/nodejs-promisify/commit/9c3ed12c12f4bb1e17af7440c6371c4cefddcd59)) ##### [1.0.4](https://www.github.com/googleapis/nodejs-promisify/compare/v1.0.3...v1.0.4) (2019-12-05) ##### Bug Fixes - **deps:** pin TypeScript below 3.7.0 ([e48750e](https://www.github.com/googleapis/nodejs-promisify/commit/e48750ef96aa20eb3a2b73fe2f062d04430468a7)) ##### [1.0.3](https://www.github.com/googleapis/nodejs-promisify/compare/v1.0.2...v1.0.3) (2019-11-13) ##### Bug Fixes - **docs:** add jsdoc-region-tag plugin ([#​146](https://www.github.com/googleapis/nodejs-promisify/issues/146)) ([ff0ee74](https://www.github.com/googleapis/nodejs-promisify/commit/ff0ee7408f50e8f7147b8ccf7e10337aa5920076)) ##### [1.0.2](https://www.github.com/googleapis/nodejs-promisify/compare/v1.0.1...v1.0.2) (2019-06-26) ##### Bug Fixes - **docs:** link to reference docs section on googleapis.dev ([#​128](https://www.github.com/googleapis/nodejs-promisify/issues/128)) ([5a8bd90](https://www.github.com/googleapis/nodejs-promisify/commit/5a8bd90)) ##### [1.0.1](https://www.github.com/googleapis/nodejs-promisify/compare/v1.0.0...v1.0.1) (2019-06-14) ##### Bug Fixes - **docs:** move to new client docs URL ([#​124](https://www.github.com/googleapis/nodejs-promisify/issues/124)) ([34d18cd](https://www.github.com/googleapis/nodejs-promisify/commit/34d18cd)) </details> --- ### Renovate configuration 📅 **Schedule**: "after 9am and before 3pm" (UTC). 🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied. ♻️ **Rebasing**: Whenever PR is behind base branch, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box --- This PR has been generated by [WhiteSource Renovate](https://renovate.whitesourcesoftware.com). View repository job log [here](https://app.renovatebot.com/dashboard#googleapis/nodejs-bigquery). * fix(deps): update dependency google-auth-library to v6 (#660) 3ea642e commit 3ea642e Author: WhiteSource Renovate <[email protected]> Date: Tue Mar 31 19:58:07 2020 +0200 fix(deps): update dependency google-auth-library to v6 (#660) This PR contains the following updates: | Package | Type | Update | Change | |---|---|---|---| | [google-auth-library](https://togithub.com/googleapis/google-auth-library-nodejs) | dependencies | major | [`^5.8.0` -> `^6.0.0`](https://renovatebot.com/diffs/npm/google-auth-library/5.10.1/6.0.0) | --- ### Release Notes <details> <summary>googleapis/google-auth-library-nodejs</summary> ### [`v6.0.0`](https://togithub.com/googleapis/google-auth-library-nodejs/blob/master/CHANGELOG.md#​600-httpswwwgithubcomgoogleapisgoogle-auth-library-nodejscomparev5101v600-2020-03-26) [Compare Source](https://togithub.com/googleapis/google-auth-library-nodejs/compare/v5.10.1...v6.0.0) ##### ⚠ BREAKING CHANGES - [email protected] introduced some breaking changes in generated code. - require node 10 in engines field ([#​926](https://togithub.com/googleapis/google-auth-library-nodejs/issues/926)) - remove deprecated methods ([#​906](https://togithub.com/googleapis/google-auth-library-nodejs/issues/906)) ##### Features - require node 10 in engines field ([#​926](https://www.github.com/googleapis/google-auth-library-nodejs/issues/926)) ([d89c59a](https://www.github.com/googleapis/google-auth-library-nodejs/commit/d89c59a316e9ca5b8c351128ee3e2d91e9729d5c)) ##### Bug Fixes - do not warn for SDK creds ([#​905](https://www.github.com/googleapis/google-auth-library-nodejs/issues/905)) ([9536840](https://www.github.com/googleapis/google-auth-library-nodejs/commit/9536840f88e77f747bbbc2c1b5b4289018fc23c9)) - use iamcredentials API to sign blobs ([#​908](https://www.github.com/googleapis/google-auth-library-nodejs/issues/908)) ([7b8e4c5](https://www.github.com/googleapis/google-auth-library-nodejs/commit/7b8e4c52e31bb3d448c3ff8c05002188900eaa04)) - **deps:** update dependency gaxios to v3 ([#​917](https://www.github.com/googleapis/google-auth-library-nodejs/issues/917)) ([1f4bf61](https://www.github.com/googleapis/google-auth-library-nodejs/commit/1f4bf6128a0dcf22cfe1ec492b2192f513836cb2)) - **deps:** update dependency gcp-metadata to v4 ([#​918](https://www.github.com/googleapis/google-auth-library-nodejs/issues/918)) ([d337131](https://www.github.com/googleapis/google-auth-library-nodejs/commit/d337131d009cc1f8182f7a1f8a9034433ee3fbf7)) - **types:** add additional fields to TokenInfo ([#​907](https://www.github.com/googleapis/google-auth-library-nodejs/issues/907)) ([5b48eb8](https://www.github.com/googleapis/google-auth-library-nodejs/commit/5b48eb86c108c47d317a0eb96b47c0cae86f98cb)) ##### Build System - update to latest gts and TypeScript ([#​927](https://www.github.com/googleapis/google-auth-library-nodejs/issues/927)) ([e11e18c](https://www.github.com/googleapis/google-auth-library-nodejs/commit/e11e18cb33eb60a666980d061c54bb8891cdd242)) ##### Miscellaneous Chores - remove deprecated methods ([#​906](https://www.github.com/googleapis/google-auth-library-nodejs/issues/906)) ([f453fb7](https://www.github.com/googleapis/google-auth-library-nodejs/commit/f453fb7d8355e6dc74800b18d6f43c4e91d4acc9)) ##### [5.10.1](https://www.github.com/googleapis/google-auth-library-nodejs/compare/v5.10.0...v5.10.1) (2020-02-25) ##### Bug Fixes - if GCF environment detected, increase library timeout ([#​899](https://www.github.com/googleapis/google-auth-library-nodejs/issues/899)) ([2577ff2](https://www.github.com/googleapis/google-auth-library-nodejs/commit/2577ff28bf22dfc58bd09e7365471c16f359f109)) </details> --- ### Renovate configuration 📅 **Schedule**: "after 9am and before 3pm" (UTC). 🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied. ♻️ **Rebasing**: Whenever PR is behind base branch, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box --- This PR has been generated by [WhiteSource Renovate](https://renovate.whitesourcesoftware.com). View repository job log [here](https://app.renovatebot.com/dashboard#googleapis/nodejs-bigquery). * build: set AUTOSYNTH_MULTIPLE_COMMITS=true for context aware commits (#665) 3f78914 commit 3f78914 Author: Benjamin E. Coe <[email protected]> Date: Tue Mar 31 18:35:04 2020 -0700 build: set AUTOSYNTH_MULTIPLE_COMMITS=true for context aware commits (#665) * docs: document the release schedule we follow (#454) googleapis/synthtool@6a17abc commit 6a17abc7652e2fe563e1288c6e8c23fc260dda97 Author: Benjamin E. Coe <[email protected]> Date: Mon Mar 23 19:22:34 2020 -0700 docs: document the release schedule we follow (#454) * fix: do not run node 8 CI (#456) googleapis/synthtool@1b4cc80 commit 1b4cc80a7aaf164f6241937dd87f3bd1f4149e0c Author: Alexander Fenster <[email protected]> Date: Wed Mar 25 08:01:31 2020 -0700 fix: do not run node 8 CI (#456) * fix: update template files for Node.js libraries (#463) googleapis/synthtool@9982024 commit 99820243d348191bc9c634f2b48ddf65096285ed Author: Alexander Fenster <[email protected]> Date: Tue Mar 31 11:56:27 2020 -0700 fix: update template files for Node.js libraries (#463)
Affects
@google-cloud/[email protected]
The
table.createLoadJob
is a callback-first method that has been promisified viapromisifyAll
, i.e. it doesn't meet the requirements of a non-promise method (Stream
/constructor
/etc). However, when thesource
argument is astring
, the current implementation attempts a synchronous return type ofStream.Writable
(EventEmitter
). See https://github.com/googleapis/nodejs-bigquery/blob/v4.7.0/src/table.ts#L1226-L1248This polymorphic return is problematic:
The corresponding overloads are available:
One of the tests expects a
Writable
without a supplied callback, but, upon promisifyAll refactor in the unit tests to actually be applied, it fails due to the method assuming to be used like a promise, which corresponds to scenario 3 in previous: https://github.com/googleapis/nodejs-bigquery/blob/v4.7.0/test/table.ts#L58-L64In the current unit tests, this issue is not presented due to the promisifyAll stub, which removes the promisification functionality. See https://github.com/googleapis/nodejs-bigquery/blob/v4.7.0/test/table.ts#L58-L64
Example test cases (all succeed):
Typically, combining promises, callbacks, and streams in a single function signature is mutually exclusive.
If a
Writable
result is really desired that coincides with thecreateLoadJob(source: string): Writable;
signature, I recommend implementing acreateLoadJobStream(source: string): Writable;
method which will not be promisified.The text was updated successfully, but these errors were encountered: