From d2c704884eed8569cb7a71a13282aaeeb951a119 Mon Sep 17 00:00:00 2001 From: Connor McArthur Date: Fri, 7 Dec 2018 14:10:57 -0500 Subject: [PATCH 01/16] =?UTF-8?q?Bump=20version:=200.12.2a1=20=E2=86=92=20?= =?UTF-8?q?0.12.2rc1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .bumpversion.cfg | 2 +- dbt/version.py | 2 +- setup.py | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.bumpversion.cfg b/.bumpversion.cfg index 62b0bf0a062..f04d1e92cfa 100644 --- a/.bumpversion.cfg +++ b/.bumpversion.cfg @@ -1,5 +1,5 @@ [bumpversion] -current_version = 0.12.2a1 +current_version = 0.12.2rc1 parse = (?P\d+) \.(?P\d+) \.(?P\d+) diff --git a/dbt/version.py b/dbt/version.py index a5d44a95980..a990b6614f3 100644 --- a/dbt/version.py +++ b/dbt/version.py @@ -57,5 +57,5 @@ def get_version_information(): .format(version_msg)) -__version__ = '0.12.2a1' +__version__ = '0.12.2rc1' installed = get_installed_version() diff --git a/setup.py b/setup.py index ab763c0965f..c01d4038e84 100644 --- a/setup.py +++ b/setup.py @@ -7,7 +7,7 @@ def read(fname): return open(os.path.join(os.path.dirname(__file__), fname)).read() package_name = "dbt" -package_version = "0.12.2a1" +package_version = "0.12.2rc1" description = """dbt (data build tool) is a command line tool that helps \ analysts and engineers transform data in their warehouse more effectively""" From 808ed75858a8678415e8f104abbe3083f38d9dff Mon Sep 17 00:00:00 2001 From: Jacob Beck Date: Wed, 12 Dec 2018 15:33:48 -0700 Subject: [PATCH 02/16] make tracking use the profile directory, and suppress errors --- dbt/config.py | 16 ------ dbt/main.py | 37 +++++++++----- dbt/tracking.py | 31 ++++++----- test/unit/test_config.py | 54 -------------------- test/unit/test_main.py | 108 +++++++++++++++++++++++++++++++++++++++ 5 files changed, 152 insertions(+), 94 deletions(-) create mode 100644 test/unit/test_main.py diff --git a/dbt/config.py b/dbt/config.py index af6e471167f..a87722f2819 100644 --- a/dbt/config.py +++ b/dbt/config.py @@ -86,22 +86,6 @@ def read_profiles(profiles_dir=None): return profiles -def read_config(profiles_dir): - profile = read_profile(profiles_dir) - if profile is None: - return {} - else: - return profile.get('config', {}) - - -def send_anonymous_usage_stats(config): - return config.get('send_anonymous_usage_stats', True) - - -def colorize_output(config): - return config.get('use_colors', True) - - class ConfigRenderer(object): """A renderer provides configuration rendering for a given set of cli variables and a render type. diff --git a/dbt/main.py b/dbt/main.py index 03435a340c8..1c358ef21d5 100644 --- a/dbt/main.py +++ b/dbt/main.py @@ -28,9 +28,8 @@ import dbt.profiler from dbt.utils import ExitCodes -from dbt.config import Project, RuntimeConfig, DbtProjectError, \ - DbtProfileError, PROFILES_DIR, read_config, \ - send_anonymous_usage_stats, colorize_output, read_profiles +from dbt.config import Project, Profile, RuntimeConfig, PROFILES_DIR, \ + read_profiles from dbt.exceptions import DbtProfileError, DbtProfileError, RuntimeException @@ -111,6 +110,27 @@ def handle(args): return res +def initialize_config_values(parsed): + """Given the parsed args, initialize the dbt tracking code. + + It would be nice to re-use this profile later on instead of parsing it + twice, but dbt's intialization is not structured in a way that makes that + easy. + """ + try: + profile = Profile.from_args(parsed) + except RuntimeException: + profile = None + + if profile is None or profile.send_anonymous_usage_stats: + dbt.tracking.initialize_tracking(parsed.profiles_dir) + else: + dbt.tracking.do_not_track() + + if profile is None or profile.use_colors: + dbt.ui.printer.use_colors() + + def handle_and_check(args): parsed = parse_args(args) profiler_enabled = False @@ -122,16 +142,8 @@ def handle_and_check(args): enable=profiler_enabled, outfile=parsed.record_timing_info ): - # this needs to happen after args are parsed so we can determine the - # correct profiles.yml file - profile_config = read_config(parsed.profiles_dir) - if not send_anonymous_usage_stats(profile_config): - dbt.tracking.do_not_track() - else: - dbt.tracking.initialize_tracking() - if colorize_output(profile_config): - dbt.ui.printer.use_colors() + initialize_config_values(parsed) reset_adapters() @@ -598,6 +610,7 @@ def parse_args(args): sys.exit(1) parsed = p.parse_args(args) + parsed.profiles_dir = os.path.expanduser(parsed.profiles_dir) if not hasattr(parsed, 'which'): # the user did not provide a valid subcommand. trigger the help message diff --git a/dbt/tracking.py b/dbt/tracking.py index 85834ad5e99..ce565aa95f5 100644 --- a/dbt/tracking.py +++ b/dbt/tracking.py @@ -17,8 +17,6 @@ COLLECTOR_URL = "fishtownanalytics.sinter-collect.com" COLLECTOR_PROTOCOL = "https" -COOKIE_PATH = os.path.join(os.path.expanduser('~'), '.dbt/.user.yml') - INVOCATION_SPEC = 'iglu:com.dbt/invocation/jsonschema/1-0-0' PLATFORM_SPEC = 'iglu:com.dbt/platform/jsonschema/1-0-0' RUN_MODEL_SPEC = 'iglu:com.dbt/run_model/jsonschema/1-0-0' @@ -35,8 +33,9 @@ class User(object): - def __init__(self): + def __init__(self, cookie_dir): self.do_not_track = True + self.cookie_dir = cookie_dir self.id = None self.invocation_id = str(uuid.uuid4()) @@ -45,6 +44,10 @@ def __init__(self): def state(self): return "do not track" if self.do_not_track else "tracking" + @property + def cookie_path(self): + return os.path.join(self.cookie_dir, '.user.yml') + def initialize(self): self.do_not_track = False @@ -56,21 +59,20 @@ def initialize(self): tracker.set_subject(subject) def set_cookie(self): - cookie_dir = os.path.dirname(COOKIE_PATH) user = {"id": str(uuid.uuid4())} - dbt.clients.system.make_directory(cookie_dir) + dbt.clients.system.make_directory(self.cookie_dir) - with open(COOKIE_PATH, "w") as fh: + with open(self.cookie_path, "w") as fh: yaml.dump(user, fh) return user def get_cookie(self): - if not os.path.isfile(COOKIE_PATH): + if not os.path.isfile(self.cookie_path): user = self.set_cookie() else: - with open(COOKIE_PATH, "r") as fh: + with open(self.cookie_path, "r") as fh: try: user = yaml.safe_load(fh) if user is None: @@ -266,10 +268,15 @@ def flush(): def do_not_track(): global active_user - active_user = User() + active_user = User(None) -def initialize_tracking(): +def initialize_tracking(cookie_dir): global active_user - active_user = User() - active_user.initialize() + active_user = User(cookie_dir) + try: + active_user.initialize() + except Exception: + logger.debug('Got an exception trying to initialize tracking', + exc_info=True) + active_user = User(None) diff --git a/test/unit/test_config.py b/test/unit/test_config.py index bf36698de84..cd2cfa1e381 100644 --- a/test/unit/test_config.py +++ b/test/unit/test_config.py @@ -62,60 +62,6 @@ def temp_cd(path): )) -class ConfigTest(unittest.TestCase): - def setUp(self): - self.base_dir = tempfile.mkdtemp() - self.profiles_path = os.path.join(self.base_dir, 'profiles.yml') - - def set_up_empty_config(self): - with open(self.profiles_path, 'w') as f: - f.write(yaml.dump({})) - - def set_up_config_options(self, **kwargs): - config = { - 'config': kwargs - } - - with open(self.profiles_path, 'w') as f: - f.write(yaml.dump(config)) - - def tearDown(self): - try: - shutil.rmtree(self.base_dir) - except: - pass - - def test__implicit_opt_in(self): - self.set_up_empty_config() - config = dbt.config.read_config(self.base_dir) - self.assertTrue(dbt.config.send_anonymous_usage_stats(config)) - - def test__explicit_opt_out(self): - self.set_up_config_options(send_anonymous_usage_stats=False) - config = dbt.config.read_config(self.base_dir) - self.assertFalse(dbt.config.send_anonymous_usage_stats(config)) - - def test__explicit_opt_in(self): - self.set_up_config_options(send_anonymous_usage_stats=True) - config = dbt.config.read_config(self.base_dir) - self.assertTrue(dbt.config.send_anonymous_usage_stats(config)) - - def test__implicit_colors(self): - self.set_up_empty_config() - config = dbt.config.read_config(self.base_dir) - self.assertTrue(dbt.config.colorize_output(config)) - - def test__explicit_opt_out(self): - self.set_up_config_options(use_colors=False) - config = dbt.config.read_config(self.base_dir) - self.assertFalse(dbt.config.colorize_output(config)) - - def test__explicit_opt_in(self): - self.set_up_config_options(use_colors=True) - config = dbt.config.read_config(self.base_dir) - self.assertTrue(dbt.config.colorize_output(config)) - - class Args(object): def __init__(self, profiles_dir=None, threads=None, profile=None, cli_vars=None): self.profile = profile diff --git a/test/unit/test_main.py b/test/unit/test_main.py new file mode 100644 index 00000000000..b05443e9562 --- /dev/null +++ b/test/unit/test_main.py @@ -0,0 +1,108 @@ +import os +import tempfile +import unittest + +import mock +import yaml + +from dbt import main +import dbt.tracking +import dbt.ui.printer + + +class FakeArgs(object): + def __init__(self, profiles_dir): + self.profiles_dir = profiles_dir + self.profile = 'test' + + +@mock.patch('dbt.ui.printer.use_colors') +@mock.patch('dbt.tracking.do_not_track') +@mock.patch('dbt.tracking.initialize_tracking') +class TestInitializeConfig(unittest.TestCase): + def setUp(self): + self.base_dir = tempfile.mkdtemp() + self.profiles_path = os.path.join(self.base_dir, 'profiles.yml') + self.args = FakeArgs(self.base_dir) + + def _base_config(self): + return { + 'test': { + 'outputs': { + 'default': { + 'type': 'postgres', + 'host': 'test', + 'port': 5555, + 'user': 'db_user', + 'pass': 'db_pass', + 'dbname': 'dbname', + 'schema': 'schema', + }, + }, + 'target': 'default', + } + } + + def set_up_empty_config(self): + with open(self.profiles_path, 'w') as f: + f.write(yaml.dump(self._base_config())) + + def set_up_config_options(self, **kwargs): + config = self._base_config() + config.update(config=kwargs) + + with open(self.profiles_path, 'w') as f: + f.write(yaml.dump(config)) + + def tearDown(self): + try: + shutil.rmtree(self.base_dir) + except: + pass + + def test__implicit_missing(self, initialize_tracking, do_not_track, use_colors): + main.initialize_config_values(self.args) + + initialize_tracking.assert_called_once_with(self.base_dir) + do_not_track.assert_not_called() + use_colors.assert_called_once_with() + + def test__implicit_opt_in_colors(self, initialize_tracking, do_not_track, use_colors): + self.set_up_empty_config() + main.initialize_config_values(self.args) + + initialize_tracking.assert_called_once_with(self.base_dir) + do_not_track.assert_not_called() + use_colors.assert_called_once_with() + + def test__explicit_opt_out(self, initialize_tracking, do_not_track, use_colors): + self.set_up_config_options(send_anonymous_usage_stats=False) + main.initialize_config_values(self.args) + + initialize_tracking.assert_not_called() + do_not_track.assert_called_once_with() + use_colors.assert_called_once_with() + + def test__explicit_opt_in(self, initialize_tracking, do_not_track, use_colors): + self.set_up_config_options(send_anonymous_usage_stats=True) + main.initialize_config_values(self.args) + + initialize_tracking.assert_called_once_with(self.base_dir) + do_not_track.assert_not_called() + use_colors.assert_called_once_with() + + def test__explicit_no_colors(self, initialize_tracking, do_not_track, use_colors): + self.set_up_config_options(use_colors=False) + main.initialize_config_values(self.args) + + initialize_tracking.assert_called_once_with(self.base_dir) + do_not_track.assert_not_called() + use_colors.assert_not_called() + + def test__explicit_opt_in(self, initialize_tracking, do_not_track, use_colors): + self.set_up_config_options(use_colors=True) + main.initialize_config_values(self.args) + + initialize_tracking.assert_called_once_with(self.base_dir) + do_not_track.assert_not_called() + use_colors.assert_called_once_with() From ebd6d3ef19589b4c1c78ea652ebce0f31248902d Mon Sep 17 00:00:00 2001 From: Claire Carroll Date: Thu, 13 Dec 2018 09:43:38 -0500 Subject: [PATCH 03/16] Update readme and cleanup repo --- README.md | 71 ++++++++------- etc/dag.png | Bin 161481 -> 0 bytes etc/dbt-arch.png | Bin 0 -> 99557 bytes etc/dbt-dag.png | Bin 0 -> 141701 bytes etc/dbt-horizontal.png | Bin 0 -> 18063 bytes htmlcov/.keep | 0 mkdocs.yml | 26 ------ sample.dbt_project.yml | 194 ----------------------------------------- sample.packages.yml | 10 --- sample.profiles.yml | 182 -------------------------------------- sample.schema.yml | 74 ---------------- 11 files changed, 40 insertions(+), 517 deletions(-) delete mode 100644 etc/dag.png create mode 100644 etc/dbt-arch.png create mode 100644 etc/dbt-dag.png create mode 100644 etc/dbt-horizontal.png delete mode 100644 htmlcov/.keep delete mode 100644 mkdocs.yml delete mode 100644 sample.dbt_project.yml delete mode 100644 sample.packages.yml delete mode 100644 sample.profiles.yml delete mode 100644 sample.schema.yml diff --git a/README.md b/README.md index ba680c9e9d3..aefdfa7175e 100644 --- a/README.md +++ b/README.md @@ -1,49 +1,58 @@ -# dbt +

+ dbt logo +

+

+ + Code Climate + + + CircleCI + + + AppVeyor + + + Slack + +

-dbt (data build tool) helps analysts write reliable, modular code using a workflow that closely mirrors software development. +**[dbt](https://www.getdbt.com/)** (data build tool) enables data analysts and engineers to transform their data using the same practices that software engineers use to build applications. -A dbt project primarily consists of "models". These models are SQL `select` statements that filter, aggregate, and otherwise transform data to facilitate analytics. Analysts use dbt to [aggregate pageviews into sessions](https://github.com/fishtown-analytics/snowplow), calculate [ad spend ROI](https://github.com/fishtown-analytics/facebook-ads), or report on [email campaign performance](https://github.com/fishtown-analytics/mailchimp). +dbt is the T in ELT. Organize, cleanse, denormalize, filter, rename, and pre-aggregate the raw data in your warehouse so that it's ready for analysis. -These models frequently build on top of one another. Fortunately, dbt makes it easy to [manage relationships](https://docs.getdbt.com/reference#ref) between models, [test](https://docs.getdbt.com/docs/testing) your assumptions, and [visualize](https://graph.sinterdata.com/) your projects. +![dbt architecture](/etc/dbt-arch.png?raw=true) -Still reading? Check out the [docs](https://docs.getdbt.com/docs/overview) for more information. +dbt can be used to [aggregate pageviews into sessions](https://github.com/fishtown-analytics/snowplow), calculate [ad spend ROI](https://github.com/fishtown-analytics/facebook-ads), or report on [email campaign performance](https://github.com/fishtown-analytics/mailchimp). -![dbt dag](/etc/dag.png?raw=true) +## Understanding dbt ---- -### Getting Started +Analysts using dbt can transform their data by simply writing select statements, while dbt handles turning these statements into tables and views in a data warehouse. -- [What is dbt]? -- Read the [dbt viewpoint] -- [Installation] -- Join the [chat][slack-url] on Slack for live questions and support. +These select statements, or "models", form a dbt project. Models frequently build on top of one another – dbt makes it easy to [manage relationships](https://docs.getdbt.com/reference#ref) between models, and [visualize these relationships](https://docs.getdbt.com/docs/documentation), as well as assure the quality of your transformations through [testing](https://docs.getdbt.com/docs/testing). ---- -### The dbt ecosystem -- Visualize your dbt graph [here](https://graph.sinterdata.com/) -- Run your dbt projects on a schedule [here](http://sinterdata.com/) +![dbt dag](/etc/dbt-dag.png?raw=true) ---- +## Getting started -[![Code Climate](https://codeclimate.com/github/fishtown-analytics/dbt/badges/gpa.svg)](https://codeclimate.com/github/fishtown-analytics/dbt) [![Slack](https://slack.getdbt.com/badge.svg)](https://slack.getdbt.com) +- [Install dbt](https://docs.getdbt.com/docs/installation) +- Read the [documentation](https://docs.getdbt.com/). +- Productionize your dbt project with [Sinter](https://www.sinterdata.com) -### Testing +## Find out more -| service | development | master | -| --- | --- | --- | -| CircleCI| [![CircleCI](https://circleci.com/gh/fishtown-analytics/dbt/tree/development.svg?style=svg)](https://circleci.com/gh/fishtown-analytics/dbt/tree/development) | [![CircleCI](https://circleci.com/gh/fishtown-analytics/dbt/tree/master.svg?style=svg)](https://circleci.com/gh/fishtown-analytics/dbt/tree/master) | -| AppVeyor | [![AppVeyor](https://ci.appveyor.com/api/projects/status/v01rwd3q91jnwp9m/branch/development?svg=true)](https://ci.appveyor.com/project/DrewBanin/dbt/branch/development) | [![AppVeyor](https://ci.appveyor.com/api/projects/status/v01rwd3q91jnwp9m/branch/master?svg=true)](https://ci.appveyor.com/project/DrewBanin/dbt/branch/master) | +- Check out the [Introduction to dbt](https://dbt.readme.io/docs/introduction). +- Read the [dbt Viewpoint](https://dbt.readme.io/docs/viewpoint). -[Coverage](https://circleci.com/api/v1/project/fishtown-analytics/dbt/latest/artifacts/0/$CIRCLE_ARTIFACTS/htmlcov/index.html?branch=development) +## Join thousands of analysts in the dbt community -## Code of Conduct +- Join the [chat](http://slack.getdbt.com/) on Slack. +- Find community posts on [dbt Discourse](https://discourse.getdbt.com). -Everyone interacting in the dbt project's codebases, issue trackers, chat rooms, and mailing lists is expected to follow the [PyPA Code of Conduct]. +## Reporting bugs and contributing code +- Want to report a bug or request a feature? Let us know on [Slack](http://slack.getdbt.com/), or open [an issue](https://github.com/fishtown-analytics/dbt/issues/new). +- Want to help us build dbt? Check out the [Contributing Getting Started Guide](/CONTRIBUTING.md) +## Code of Conduct -[PyPA Code of Conduct]: https://www.pypa.io/en/latest/code-of-conduct/ -[slack-url]: https://slack.getdbt.com/ -[Installation]: https://docs.getdbt.com/docs/installation -[What is dbt]: https://docs.getdbt.com/docs/overview -[dbt viewpoint]: https://docs.getdbt.com/docs/viewpoint +Everyone interacting in the dbt project's codebases, issue trackers, chat rooms, and mailing lists is expected to follow the [PyPA Code of Conduct](https://www.pypa.io/en/latest/code-of-conduct/). diff --git a/etc/dag.png b/etc/dag.png deleted file mode 100644 index ad76924a43f78d4e64c2220fa53273ac08663c8f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 161481 zcmeFZcT`i`x;G4hh{&dhH0dDHK|q911r(Hy^xi>ggwRWnB1nxQy%z-xP3avJsi7$) zK!DIg54{DFFMIEM&OP^j``-7w|Gr~qjEv08wPt_H?so*PjBhh(!TfM+rgG8jXC`mK@jwFc_&6CXkCsc~+Wz_V|g zqtgs#ac?+9d)gUVZoN2Hiof+BH#q|UOsBMQ%RJNed4V+)*VX+nqOH5P-WLCMTVNp7 zevclT2ixyR$>3mWiIS%~(s#C&dIYs|HB6BgG5)snW23-M@OI)L+oHaS^*F<=>X4;g z`9pO#UvUjFax1as&sOGSp$Sqn?^e(1e=QE&BwfhX=Vz%D!OE~9u) zQ{noCU3LyDwXA%v>ie{T@3e9}>Q}U<=^1kKS+5nq71`r`o%^h|v{$4bg0JobcqZGn z-|IEg)k~s&G#{$+nlmqlsX$8dM$oq&sRXt=k1TmKzRFWwBkX*`+xMFJ-8HsLMPl1$ z1J6w#Txvy($o4CJ=H-@%-g>i>c~4kd@Jr^8y1IH#VutyMBFGtwlRc0lTVS~vp3ubQY>Gq^IR8m-hD}-aH&kd&r8Jg@bL}u&O3tN=$OB> z?cM}a5f@P1^n7rG_#Ih>G3wApwEVRaZ`AP@#sM3i?I?aJQq_EFt?wp{q(+M*vtg>E zH|6$jlPnOCbC4=2F_7N+`PiG9>&LaPPqV4~eo)?2{Qh3*9^rGvA8*M`;>(}JzQ6sE zdHRh$SM>YkK9d!(UtzM3o8N&~gbuEE7kDQpxD@rQ+mGKoR*Lxf%==MhxMM-UOTuP4 zA!UJ|L@$W~>DprF6=i;=t+P|SddPgEB)aAYU@`brL8HI9m{zP=tibn_C4SGkMn`j| zUAjt|Q?gS=?H@IJ=B?cGv}|u7-*4@ioP9czIP(goZ6^$64ZVeY!`2zf^MKTp_*VF> zFx9u*AF0-8$Zmd$Y>N#1e*HU(66GS%`)4aunr{<-Jho*PO=x`E7}c0#tm?+$OVtt+ zaqsr?2zx~@t~W_%ADLfpI16kLY>;o<{~Uc3qrtV6f`@vQdV##k`u8UyH&qfo7V8@6z)I`JZ;khk`#rp?nYX5q zrAYHLb!^~e^vkrD7PTYZ2F-xEX!$tdqN-2mqJ~knQKTpXxm^?wSMK{RV_2zUwwwTU?>O25TKDwPlx&23#_zhh%zef%ZH zjph*~r$^Y4&Ay@L#<>1Oap}`CA)PWEnNO4b-#p_1vRWigEGSZxFbYPzbJLP0>3(^x zj?Cg(BxI9jLT=*2c-;8bIJz|S=Yq?b^G8>=(U;@?g)#7l@azJB6)1Y``j8RLG>ruh z*?l@qS+V^BI;cY>ZDrjv*M>=n3PpF89Rl~56T=s09RUA$lXvuJ?Zz=PulLt+&V z+uT(ig2dD%5gxu>%n}Wf+7eX{Iy}NmrHtPS)|+{2aB6tv-pkboY~*s!{ep?Xt9z

iA0U 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

G}*@!sN6a% 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⪖Ar7jM_pu~iOk@_Chlb1wKx~yev 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 Yj=4sy6{;cXw+no3Dyd(~Rk;1&UnWwQng9R* diff --git a/etc/dbt-arch.png b/etc/dbt-arch.png new file mode 100644 index 0000000000000000000000000000000000000000..640c16b92a11bd5850e83acc6f78cd3ec14b7c85 GIT binary patch literal 99557 zcmeEuXH-*bw{FyJMMR`3O+i4UD$<*qDj*=e7wH{h=n#UkkshQ7NL8wI=^a!`q)YEX z2t7ayEf65NE27`o=l;86+#l!1S!0Bd#k<}*%QK%jL-;dwCGsn`u7E%wa^)xTS|HF> zJ`m_^)uju-9j`Cx#~{#ckh1*WIzDL|v%VH4cE0>SysI#YOVC=>gt}~+)ZKraH=3Kt zjXzLN$-0r{e&(Igs^N22HMaNXs(Nhv{(A+D3YXJ+axT@Ne>T9h5?&iVvHFu0HpWN7 z+4Znwo^3{DHpA@L+?7Ml3|zoUs=gp1F8eTWMb)Nq(ixb-e=h3B%H<6I`2_r8%lGB{ zzdpaW_>1meAA?>|n*8e{=!&BInSXu0NB_SM|IgVlE^e=L9RdQ$a1Rcu;CD}RhTlE0 zd)VQ6IjGXW(9l6A@vVZdptli2Fjl|0gr{22=-njr)gvd^;^;`*=QQ- z(b~wE+a;^yM$8T+sM^>~c9&!zTUIwVxxE-by%yEFZ#DI`O*e!s^lm-P&vp}FIwwOs zf8%td>zZbIw4*djnwn;O?I5dfwv~f}!wk@qa~-bdgKie)Ex}Tj_STRxZw7`(c z1ZV)xs+71eyk=Q@_A}2jEv*~Tot!rUSvueio#MCqZ>bAuwH1{->(16UXp6%>c9 zcX!|8=H~U{7TCO+CkXVwZQE6$0*WYZD&|=p8}Cnbt8Fl`CqiZ`?CCt-l8s}g|ND@#!Fh8EZHrFtQ_lQOoR~kD>5YwulDcXpOsI8 zED}?Ai64Us#zu$fW}#4^!_yA>9ruJrHMMmOH-z7R9D4V(s@j{jksM@OP%$)=ERx?c z;X*wVMZxFcg_GAHK3*t~*scJk9a*?t!L@ZI=-u7)uJ#`m;(iz7Fb8Ian#|Fj)!H*O zz0T>g&4a^pnd1|`+H-{u4GrDnzEQ3XG`zD%Uo1^FD9a*;$E%9We`$X_jJDF5f?$mVgAgP2~dtQTlV|)>fIGv>c+TR8&1C_cXocDn(OXN|wvEhb#s!gt^HC;6dj#O&ic(N*tD zKI9qMp9xad2Zn+;I%QQo!XeN6M!u(MZcL^7mPVHBbRxZu z`L1|fN^(!3!I5WlquIspx~*R?taj~lZCuL>%@JbC&1HX(U!(Y|Yh6Q1av`B`grYH> z5LNH$4_S`+zM`Vih=}cNR*!R^o!_YBX0E$XGl%W&?`eSbpE1f!I$J-K6Wgn(SahcVJxz@JM`%;<&(U zh-E=<9MYV^-Iq317Yd za+-&HLMA_Z`(}`=D&A0VDB9F6;^xV4^?nu1An9!)Jem3e$O5ly_i#|^>#Rv3_x&v4 z=RJ>3PvN!5$%kuvYb0s8!O zczT>=(pfm4qzu5(DXd;P?Z-Cpb;^3X!i#gkYpa_Y$eT={AVGaYGg_P6+?1~C)y(;KWJIOP0 zP*xt%(_J1Je)n`Y>SsL@2o!HsQ|y^ZLvp75e892n=3j)Y>n;J4%4k&MJ$=sI*0JzD z6ftEsVy zik6r0X>UPi3jtM+)4887{pORgIM6QiS3C7Ni!FX>?w)^sTf6t)yL)c8-ah5AP;aoE$#kiU5a!r6_nP|-J_C~SMjj$ zK6h4OmgFr*$E+$HI7ME3Y~Y%q(E{eT?VvVNzW-L60niy?))z6L!&|p*MZ}v*4T=a{ zmpaKGlb!1OD@ah&)bOT|?h}Nj zFnZtBFbp7035|8g<>Ymx!QUBho8_E)V@|XBN%L7&`Mh>A4I3kek%bNYt z)zz(VND^;&cf_`3ZM@agiRugcdkn_=8+1k>3l%0OOq3h~P6xF9ec6UBC+dAT56T;{ z@Vi&DDMdf&Tr*L!nC$f>B>kds#Ozs6r4BkA4s8BCz@`1Z(w5*E8)3k1{_=&6Fm$

}S^2?Ve`Jpe?m7R1z78Q?1#}(w%wrtOsUUu4zv;q1Nry61u@-hOw z|Ge&0$o5u+ya+(}s~L)1a)0{hzt(&%Sgcy-J`G?-6;>|+Z_?(0xk7O5l501XZ(V;-REl$7s!pD|)KB2ek3Dr zN6!8>?tpo(4`p_PvvI2bLaHwlQJh&W+IEsV$B^urhV`iB`(p9&7cUHBQK8HH#>N(@PuWJ{>MP;w6clI2I!>w|A9$ zBs8L=rn>|Hug_0o`>hvzl=K8bF>)0oX{u|Zz+?KIT9xim$CqrEa+?7{+JhJtNuIhtqkfL6!Tl_6$A>uS zk!(p`9RtWV3&8ybqTcE}X%d`zd>Jg>G7W5Yy;eupI^ulQG&Q9O^s-&@DeLQ-s>PYL zFW!AW3p!u!{H4jD(HX4XTvRJkG3iVxeu^eRprEfkK=d>@4j8&-pO>Vz0AS_d6Svb{ zDDOwkWGWvfKXd;eai{Lnd$2msI~i|THPB<}e$yJ!ZWWc#Q6M;2U01#~@<%*BPnI^; z@&k9DS69RhO?-M`7%P6(LfGIT%oT_yS4KD+Y$38=Lf~67oJEE7L@x@EfZ1D`dYQjC zQ;@&I9Z=9(so=cr@aSbHd%&a#jf^dhi0417`#zj>WKFXacHh;2#i6JZcV)E+8@FLf&VrD{h5%9%U%Cua0Y;&`^3NMLUU)4^o>cQ5_?( z@|jeAq5urLJkM=KvIG%LvG>ZSx095s*NSHLyNM zv~M=W6iciWuI5Q!{hd~^Y1oZ|^nshuXKUwUXMaW?)2%S$b#jc5kJjJlkZ$?t6Cy)! zFwv~N^y~q{ouROu*4ViKN=k`9iL9N60uK&rVkE#4Xt>PB;nLN+& zv-Sv?Z)J#=iBDXhf6LpVzd;n`iwR!sO{v?dl}_62``n5wl`^ctGnu$oM*(Hobw7>{ z`NjF$Jx7l7DP3T~_++e^(zKcMx<4}|WwcwQ!BMTRT2h~fq9a<3@|+A4_~|+@%%Oby zkjV15RmS+BPm6c&I@+EX%C@(IQ7Q-vi$JrjyG3nejbC~I?5XlYp~T%^Q|iQl|NvJBhU*sy@Bb%tX+ zJ!$F$^G3Ezu`g-37nm424@kUc@}SD8lr`q4&m_*(v1Rta`U5&`YnD%DC@BX6odO|n zkBhr^t^T29T^L!wmZ|~E*qnXfWq*ei*uvPpMckRdLL9c7?vv6Yu3B<_qA#0I7^XEX zN;|c3WX60LfYe_0XX+?V-N_J~BJh@pAv~F)X^g_?iJl1q{(;-szI}9*`5FER-@nEi z$z%}Ie9e?lhe%4q_CW(ekZ*2<1p_ohCrqXg{WI30>?Jn+5uY{KrU)B4pNjXm4{<;U z|LiXW9>0)IA;VbayYb*dh{FaMCmaDqOm8#82CyhuGQsZ}{{E=MHl=N5;?FLx4o+hg&)OXQ0G6 z#(J!~77sr-H~7H#J0VORk5vO9c{>5KJD01dwUFbQ8K^7l1LItC<5F+eZbAD`%EBkG z(;X*)K>q@-1~!mPJzI5B(q2{76D4m#Pnw&3W14HBjI9g{#T6y_5}5KBPufGAFLiJ5 zxpUx8`S}wrz=H~RNhbYiNy^?~bWx)?QEZ1XwS);FJQ7{j>ox-jy^LL-YA3UH!<~vz z^mc05Rz=tlxm8S2op6?=vYB>X;Z6W--8^ZoE-dUd_YQ-8^8=z7dM6FiPqvd;nLIu? z!?2SHi7U%?-fK{9g=Y~Wjyr`2W`QWyPB4>cGBGWBAae$c@+AbcW`rG^=LeYMBG|3W zmC`e#M?S#1-K2pXz7a8*5EHLiC*C|NX8wEml$Y%cDN|Zub55_YfYk+(XJ`xLK^6ihHp;VnqfW^?L0?Nw*Uff~B=shc67(vHl(mazC z_GhM9Jr^O_QT5^#k!JD4wDWcFi~vGc3tVMIe%Do*`R5K!67%?RdyctM!4Q7IL}`>x z(Q6G8g%*z(wQ5=kse>;!AFrUc<4y4rz)Bc)#3LGdwlg7n=JM;`ySrN9@Do}2=_J+* zTThq;hjxIaQ+GAiMiGcydQx$2H}Ee*n%nFxy{O z@PV(p$NIu^p4nz7fF(tW^)$_BA!u~O2xWFx4e_p)L?&eYZ@|o&?ognNM#vvyZAdnn zXs+lH7wYd$R30i&Bc&)0vUry=uXv#Wzp?hZ_ z{bw5JO-$GEO`V5^YQR2LYB&xUXZXFD6hD3dvJ27K!-wr_Nd%^Cs>fdCg6)q?f6?G4r`<@Ndnyn6*=yqC9XJ~dPnUP=c& zyF`&8YPJE)EQrej@taox<&{{SI}xkKKVF*tozvmuMRwO}EtmB0Rc5Ipg zS>!D6*t6S#see!=5LYzDu*3jm9YnvSIZZB1f(RgSelDoT94iA=K-o z8F;`ToL)f=eQ!NZkhQNECM&ib~=Y=FsjG~dV5-|Ajw^j~C=z7E6`jC;pG76)R! z|9bTnJtMf+%?#!lupfhbXv?qPilsnhG+%tNK1bZ~?%XMBvhUqFVVIjY)zMHXyCbZ6*O4HqYbEI+_nd)hdpd-_(RD$aln9dY|uoQ6kk0 zMkj8PUX+yOcrx=Ciq^ww>^8dW{tG+1{KD>tI?JW)x>{dYe|cXc4t~?5&U?C4Q;v+1 z5{H=(vSk7CHQ+fyu-G0zJq$FspCqrG`|JVPYw`uVczA9ILILQgAQ<6F*6H!0e=rjraG zOnxgP(G!ba?JzN$_H6r$5qeAk+LbW~RR=0iEg+W@cYkC`&H=fO#IBLbuPSknn9&eND(=8ohkQHpw_-bO* zbnRAHFq5gq7!mxXDQj1dImyj{3XG0{tW#j7M3(ElB`c)LR)GEM_d(LoMf(H{?=PC( zENwkFZd$$=w6?0tt=Czk7uDkbYp;frNGAz;{KbZC2)B|rj9|0e(-9GDSWc4MTj?DO zlX8ohI6!4ppL;r!QXdUQMzFUzu6c04y}ddH;iaPAC*J`;k+X@wmI=3$vV!uY&*`k{ zK_u%S8Uaf@6Q*~%Y|!!ECUyRZEzJQ{yNB3d-k7C5##FBjW}!NF;{M`FgID&i834+_ z`05wWoHq3K(-WT``Py?A1-JsS-H|BF905-mLyk_ z5k;P$`T4C=1^Yvs^c8gt9d>gC+txXcE@ss)Jt;P;xQA^DWpRU-zWnmMx_W21bD{I~ z!DMN3+d43do7JKIR9+@ea<#yHo#clBmr17taOUc#sb~w@`~2LI=Du4(;6uC+cofsj zKjnAyqBDSF;Kx_gMI*~$`0U`!(5=`$MPY`)fCGC*>A;72d?_p|Jf`%(i&5Y76CbUR z5J&%mguc%7)LOuPWXOe5AvVN3M7MnIdh5Tch>NSkf87gT0k}ZycT^vkxNkZ*ILbsx zd9vo=JPWza$~p#g=9I`6;n|beUQL%yw`60t@3aH(>!ov_gb7E3OkxOO3{u3BAwNFk zPc4A^yj?1!wUl_+t7_R7cV6sEh(zrsBla+++Pi%}+eK`TVXP#4YQ2zhz~6c9i;p`Z zW5RoJH6Alxnm8uvRl!DDgi{h<1SF9+qA0UmdU?Qs9-I*th9tc7`B7!clGyJQ1^g{= z8~aR{fkLu|+pCr_JXmSk(p`W_m995(&S#K3yZ`80e>3(+|7^K~5`(eVw(h8&3=g+ zed?(SeCDa~I*dC&&jso>5il~D5a*S0D)8zA)t8b|Q)86b#`ylb?Q zi`$Ni^Xbq{>TEPSiAxKaLr93D8oZ$vBReu4I}{6YBE;MIgkm9XRKJF#=N3R4VfSNT z(o^CRD7zRDC3Ep~eOTnW<3g>OyId1$lpmh=x}m9G`9;TT$c-X9m?~Tc;%E7(x|H29yjCuncpN zGK7V3h*z$tDWJ(sOLQ4jumcAE7{H(H;8WCbxftRjZ0@*?&2I>SP zQ{ZCeKnA)68{deMGp`rhn)Y|^#nSPbQe&W-{0ROzch4NfOSk3ao95**qtq@My;z5e z5LI>b5;!wr)omt7@mO>?zy7m(h5i)mMC@pM9tL*(0k zc+1e)*yQ@g{DLYLmZ#_iIQ))1G=I~bB-B2%K&aqZs#0j{EZF>6}ue|)#YvdiR zvwM#viL)$G%ZY4l@bpzi-`E2KK667-y;C0p6$q?zu|s|c2@7L0mBJ>?HL(Y7 z4#?aBpzGHYlbYu)me8G2X!za-XJJ=W;2dGtL-64x?|m4c^X>R^)86c3Wz7e#(xzJH z0yP5McC1iFi?f+s?R2iKBCY|5Or@T3D&I^Tim4Ix*vZ(#WAE;3TEz;7qpiB-J{Y6h z(Mnm=O{1`|RaLu%wz-qPO^#oCcOVnTnvVRx(z%@|ALB!1q#S{eccGEOEt;-%rHnP5 z8G45Zo%ZU?EraPFcbmgl%f18jJR6`c+{ASj)Ku-UGNXOptd!M#l4l+W*kM7~!CrU+ zYbO3^JOeEsYT>*@uM1G=5?!r{`O7!5~0psRYcns_$5uCnL%`$hhm59sik*NAqa%f?4 za)cT1|3VyQ+E|ScfgWUbdiKL+tGUc@-o!NA!L+w9qIGV+k}}54Nt#}y87EhM_&t^q z5w+Yud$b@z+{O&tlZWJ)9nrDGoNT7Y3!8hpnVaCoWTG*WyQ_5ro2vOJ5h9*y5IQyY zHY_X#dLn~LRH{)^jQnMMsGk^~R&6EI+%l&g^wgL4)0UUdS#G_PRaN>;?TqA7lWq^| zR+CJA;LlZT)5^!9dog=tD@sM&_$aAV_1cv* zS7lR|V&e({AalFn;KHz1imyfPSV-cwqp8;IM&m-tKjn!V`TK>AdRM21!AmpjKNj88 zBTg>QoF5l4@gT&*S}bQ%(mF7yHJle!wp1p-^HbGDSziAz390Lw8&WdR@`eFf_zC|i zUN07wO{p1bmH?E~c8Un=0*<&;cEDG!*re({e~8kIf`%G*}`0wsdIxIPmz^sNbWDk9BVVK-8$JK zuJESOvByS~lpt=z5Z$Ny52j);5&F_ADPWve9`j_qNMIA2$R#Su@{gq)8I9OugH}th zbtR<>kn|{SX4_|RiM*(IIpz3pr6sYh=W9m~Eh5$Y_?4*J==SOwCWZysDki<1DHHbL z!~D3Js=oIz?t}u-Q`+cgaFRV&CxksD8CL}W0-%%lqhB|yiy{Y^5K|Hh?$cd9pL}8J z7Qf09g1-JDOF4K>SxU-x@GyK2+xnE}z=0U@(h5J-?l zkd5)MfM>RXLs5G~Ogz~5t0hrse}iSmR}nHRIEEO<_>1NT68C4ZGd-agSMbX6X8nr! zv5x!v(4Nx^+R?dppWYt>vA5Xs@USp6p9<1tUeFCD$CENmpHym01sK|JD|IhV#KqR1 z)d%1EWWI^j02;FjLzoJnrNW$yq)k&t_x;)3Lt?dZcdS1I@iY?gPKr~F6zYLiHBQ*Hz?PM|~ zxrvGZu!#<`?uf#kgf5KvGe;0{EOXHSS{GY+#Nw)!hVJK;P&C;kW+XM=GXu9(T8_q@ ze*jaLlb4@q+{5}T9TEBVtGySahzH|tTq^F*hc7ky1?=v%-g1L>5E*d+C7e?zxw%73 z8oqj^6wY!oON<68R-`NNAw_)Akz=J%;~X17*c1QIi*(njYS>#``CE2xVoNAmB(w_B zU?i%U#Q2e5_UHDiRRAeW#`@4$LyE8Yb_GKVWx@Jh$0nJDc#*-4@}K$Ru z3>+}rJ0P)L{;>eu3tr(dW@Pc7c0+WE5Hpv*Gv0pnD9lZgs{H+A>A*QxZ0E5YFw+7VSYw>xz(wTa_I za>0P&0U&!cnY<$}ZvyG>K3Kkpq#;}BzX{o}YdLC5GrIpa!n=7nHykxbC`<)_4N%I^ zQ&bxkHV0iJLnXP@`5Cyhb=#CbU#hTA(PnAI#%ipj4f{Rx{t_VH4x90^vphLz_0w*` zh(L(EKYPi>I=rQSmewuekg1hz9h(xVq#(O6ka;`#K0*Q#e2bEDpx(n$A~s;ZH87zv z81QVC0C~JGL$*v(j893+3$T6ym;tHf@HU z_wNr#uXS`-SXka~5kzlp?>SMSfw)j&13M;lapAiISv&tPX9d0Q1MYY|LrRP1A#hh= z#|B$W+u8*qpRTvd=V%p7)QO9w0a-LgXXOf8>{r0i0zn^P=L@gcUbHH0XJH4~jRC`Y z`@n^xx}DFlO-BrUWTkcY%8?SH$p*ydvP4}Q8!X%$+7&iHLeLAoE9t2|8%P(4oz)jF z*h4O}vJ#G3E^RNnoR@Y%otBMw3S8b`@;>eg73EL9T{JHCmRu$~nL}fImJ-`(>3!z&%?kf(z3S=B&Eb21nqTf42g=Hf zQz_cF64}aeKL^_%to45XXF20)D4Z#V>B!h}{7d3T9^UAdVOmj&yaDIG7X>rR`N|33 z`;-8|=kQc`$?sFNsT4~WIQYz~oqJm~082(AGqLZZ-hAlpWWv%VVMpEF9kN4( z#vIIyFC+rSg@NB!v1to7L(i>9kMjUZyJngJU24v2k|f1C?wwrkKFnY!Iq`U_d#TZJ znHP1(cnp($w)!ZfZzU1-8y8@bJ8?dTd-@%f!mjj{8W#9&#dZefI++%q1$h7`=d?%@ z?Au<~<$ztm3?wS-w%cid4w6^$e&PNcJiO}tjiuWbRlXdI{kF9XXtKFvg_F7SEbN|F zb^1N|RMgnC%ykMGBqPPv3>8po$r1xZZhc1-OFZtG&Oil8Ik@ZV#LSR*am(6c)!lsx zc~2V!z!cW|`uEq5vv0g{KWq>JBG-#vlGSap;_2ayUP3Er-X{uH{9XfB$vXgv&hVq~ z#zeXR`E0-$S!Ebs3Wal;OL%WM!_mmSm*Bopi8n;}^=#!_Elp!H=JXS*f!duP^X>T8 zG^z+m@6m-tg@bgdE|?72T1xbaf|{@I?%j?1*ftjlR49N?k6KuhAS1%c+Cu!1Eruu~#cwr%YR5Y+-q(s|t1Az?BnD(EoZJ?^{$6K<8mC72hZKp{cbAVa`YKz17T9mI?L?K=QBuXkN zP6Zsj_(HO?Fhi}&98Il@3{6%67k><{b(tLt*Kf6+s3ZLIv&|Zho;%s|`6E-XCoF?PA;U3Ql@U zBY>u%e2FV3*g+zGu<9!B@#;%nZ1Efn7J!>CQ6K~2CX<%=w08XRtUnv8B~Z-){#fZW zQ68DZtKMXF!j68ivcAC*=F)e>#=1br-)#BmF>aE~Xd?RJ*xH0RhU?&jxgS+s;gwID zl3H*U7EM+!&exiJFwkckk9ZVy-Tq#cNb{}&Hd=--_ke$(<3uVr7~4Mp<0TLnfY5>t zFV*aEl2Ui#Mszc&cJxKA1gzQN5N^jEh$|B`B*O*Lush|WgA7YcngzEeoB8w2%(QL* z97nu1Y|gIbM(VYyt3|vYOTy<4Ll_q7lU$;Jy5F!cphPz!+DX52T82=6Fu_|(lXo}_ z)ZzQIh04%C*XAP;Wk%JKW;@4Ds0wnY%wpd3ae#s{W+a0hMuV#w?S}m87aRumJSZ@d zG$wUUJwO$lh)F`@G~fYj(0WSB%J*Nte$DSZS7oIkY1P*~u{*Jq2Fa+lwdrM==Obbc z7n2ss$7-He+mL%=jrp6T`^}qK6Zw+&&K>R8N%Vk+Lb6MjvMxX@I&8R>l5>i=T15fv4!G3telh`ou-2My`9l*mj zwb#P|7LIP~8~L5%Idhm{(|ia2Q%O#mf_A?;`=(Q>DXav!^)eN8rc}dy)1hn z0IE_e&aAZ7L=MQj>5{j(d+|I+VN1h(vw+RF*afGus2Cd5zKAan_s2K7Yg=8|7`E6AK8UR!x9or8tAEd&F>NAygumv%k zWP|B%`twQx^=XDtxBgMBUV78FD?r7K(_CyecEy~aw@_{lMGA>km-t_kAOCEje)4LR zo3pug7)YBvKsc)ye9lzK&6BJG%n{|D&`NQ4!5rY9uG&;$vqNi^85;xtA)ybOmF2BK z>}L|`IhX$Fucy zk*#EI*;)s_R9mXPe_%ngLwEh)p9&Znzj|ZDM*E= zmg4;`0Mzu~qViG(I13W1mxi}?aQqlaO4igJQL#j6G%r<$Tfs9Jp}5m>Z;oH}%K{H} zTq6t)J^&eF8Q3u=DY4bDc^MSc#3VII3B!$I+R5FHhDFDQlOO?0X|H{{s`ZygrW+fn zR(h_gAzy6|>1@xQP%MKH`2A9(GTQ2)N%?aZ^%DN{@LJe0qqBIm@L@WzVdXn9=Im)g3{UvmA3Ina1T=+qM=#(#2XWMUbdWbBaoPli52AXv-Ftj z`lcjR=@-uj?HT$)GaWi@ZR4ff02?i8@Hw>P#RzIP6qLx-zgtsUkCf(TyoNsXG~OL! z-wDlad1>$v60zG3(cB~+Wv*mT>2*%rng2Nalp`=y_W8+I>xabcE}L$34M8T(PVJ9& z z$@>PLgtm?yVO}TMc$o7?kN$Yos<%CUKTXo~b$VC8XP@e_Tp>pVSdp|x{|o4kEXdQC zx3r5XHN^F`q>;(Z(cX&7h$%nWJ0-|+{Q>7mvG?dCy5-awec{^ms8qK|N8*pkd^EBQ zrWmI~o85vV{?NxCOzYj}orD&b^r1#~(6y`XQB0R!x5eEYl;CTBvHz72Oh%Tcp3rA| zkNOIN$;l>amiBIeq|89oNob68NnVY*T88^E7I!h&&jsx&RqNtC<8%!eA`tH2e&_m? zwf)e{kxdF2uGGHoL)%(Qw!7*cxWjXW#ZKP|WBXPoP$FUY<7hxuDqrg}?{|OEIZ8-1 z5a@7ETI-a0IFqG*tXWyqE7N97-JLiATJ=#GBRky7hJnBfMX#Kf@cLl7qs^eeX+ z(n7?BIhtC=>6?eByTIv4L%LISJSCMB0Qus_om0(RvdC3U71RAG6@P``4!Wess z(6)w^T#+oiMt}bZIbDWT1NUQ|{DF+Tgq*vc=g%hMlNOmMxSKY26&jXWLbLHB-d?0F zk8*6?FV4O4y3NSg)T+MaWwKbg!5Uw_cmSaeIuK4};@+5MBwViJwk2`hyO`!As@ffY z_pMDH`mwQ+y#GDwF-)evP$4nxl_d0_sdhDn1EJWR>t4a>u^%W&EFD+yw^v`a+FMSsC9E zjTuM4pqXFi59X7yjhdvTs%`Qg1%ZaD?f8@0Tx0CHy9P#arO^B}+)8+j$RkI8Ijdfj zb_CheX}J%d%w|lvl>JusJQLT`;^K2@$SgwxeyI@fqYaU``n%#(J@9#fos|bfV|q1d zD8~I0%E12bIO-WbCcN^(m9qkcCSHw!KC`-hyBBNkcMTF#M9k~(Oo@o&ah%&|bdvd_ z_eNSXd{E3eOw~-QsLatsE8Wx7kE(S2UJATGQq+_3n5z@#TEzY-uX5bf`oB-IJq>wd-tjsbzSXxIp3(gXh>tc(63g z4?HNKC+IFywy?A z^1}w4ya?W$`9u~Jl>*36x`b6kpx;SjHL)dgZOo}GVV0KYf}$`F$S9R^a+nE>2}DCu zL~@@(IFcNfwQTb9_oi30_05XC+b8G0*b44uVxWfF zDiKuyTOMz%cV(8{dwP1mSIV3uwh&4qg#=|p2$wmN%}qX1m{>!#h)+IEJL9qWGC3

4t+Fijivh|* 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 RoPcwk44$rjF6*2UngHf2r_2BV literal 0 HcmV?d00001 diff --git a/etc/dbt-horizontal.png b/etc/dbt-horizontal.png new file mode 100644 index 0000000000000000000000000000000000000000..03dce6d02bacdca4c5eb5198a0bafbb89f0ef869 GIT binary patch literal 18063 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 (select max(created_at) from {{ this }})" - unique_key: "id" - sort: "timestamp" - dist: "user_id" - - # This is the configuration for the "quickbooks" open source package - # These configs override those defined within the quickbooks package - quickbooks: - base: - materialized: ephemeral - transform: - materialized: view - - - -# -# Run Start & Complete Hooks -# - -# Like the pre- and post- hooks above, the on-run-start and on-run-end configs -# make it possible to run SQL at the very beginning, and very end of a dbt run. -on-run-start: - - "create table if not exists audit (model text, state text, time timestamp)" - -on-run-end: - - 'grant usage on schema "{{ target.schema }}" to db_reader' - - 'grant select on all tables in schema "{{ target.schema }}" to db_reader' - - - -# -# Package configurations -# - -# More info here: https://docs.getdbt.com/docs/package-management - - - -# -# Archival -# - -# dbt's archival process records snapshots of specified tables so that -# you can analyze how these tables change over time. In the example below, -# the public.users table is configured for archival. When the `updated_at` -# value changes for a given user record (identified by the `id` field), dbt -# will record a new record in `users_archived` table which reflects the -# changed state of that row. For more information on this command, consult -# the dbt documentation: https://docs.getdbt.com/reference#archive -archive: - - source_schema: public - target_schema: public - tables: - - source_table: users - target_table: users_archived - updated_at: updated_at - unique_key: id diff --git a/sample.packages.yml b/sample.packages.yml deleted file mode 100644 index 69288c9ff2d..00000000000 --- a/sample.packages.yml +++ /dev/null @@ -1,10 +0,0 @@ - - -packages: - - local: /opt/dbt/snowplow - - - git: https://github.com/fishtown-analytics/redshift.git - revision: master - - - git: https://github.com/fishtown-analytics/dbt-utils.git - revision: 0.1.0 diff --git a/sample.profiles.yml b/sample.profiles.yml deleted file mode 100644 index cd898ed5a59..00000000000 --- a/sample.profiles.yml +++ /dev/null @@ -1,182 +0,0 @@ - -# This configuration file specifies information about connections to -# your data warehouse(s). The file contains a series of "profiles." -# Profiles specify database credentials and connection information -# -# By default, dbt looks for this file in ~/.dbt/profiles.yml. That option -# can be configured when dbt is invoked with the --profiles-dir option: -# -# $ dbt run --profiles-dir /opt/dbt/ - -# Top-level configs that apply to all profiles are set here -config: - send_anonymous_usage_stats: True - use_colors: True - -# Profiles configurations should adhere to the structure defined below: -# -# Postgres / Redshift -# ------------------- -# -# [profile-name]: -# outputs: -# [target-name]: -# type: {redshift, postgres} -# threads: [1 - 8] -# host: [host ip or fully qualified domain name] -# port: [port] -# user: [user] -# pass: [password] -# dbname: [dbname] -# schema: [schema name] -# target: [target-name] -# -# -# Snowflake -# ------------------- -# -# [profile-name]: -# outputs: -# [target-name]: -# type: snowflake -# threads: [1 - 8] -# account: [url prefix for your snowflake connection] -# -# user: [user] -# password: [password] -# role: [optional, the snowflake role you want to use] -# -# database: [db name] -# warehouse: [warehouse] -# schema: [schema name] -# target: [target-name] -# -# -# BigQuery -# ------------------- -# [profile-name]: -# target: [target-name] -# -# outputs: -# # 1. Use oauth flow -# [target-name-1]: -# type: bigquery -# method: oauth -# project: [GCP project id] -# schema: [dbt schema] -# threads: [between 1 and 8] -# timeout_seconds: 300 -# -# # 2. use a service account keyfile -# [target-name-2]: -# type: bigquery -# method: service-account -# project: [GCP project id] -# schema: [dbt schema] -# threads: [between 1 and 8] -# keyfile: [/path/to/bigquery/keyfile.json] -# -# # 3. Use the contents of the service account keyfile (advanced) -# [target-name-3]: -# type: bigquery -# method: service-account-json -# project: [GCP project id] -# schema: [dbt schema] -# threads: [between 1 and 8] -# -# # These fields come from the service account json keyfile -# keyfile_json: -# type: xxx -# project_id: xxx -# private_key_id: xxx -# private_key: xxx -# client_email: xxx -# client_id: xxx -# auth_uri: xxx -# token_uri: xxx -# auth_provider_x509_cert_url: xxx -# client_x509_cert_url: xxx -# -# -# Commonly, it's helpful to define multiple targets for a profile. For example, -# these targets might be `dev` and `prod`. Whereas the `dev` target points to -# a development schema (eg. dbt_dev), the `prod` schema should point to the -# prod schema (eg. analytics). Analytical/BI tools should point to the -# prod schema so that local development does not interfere with analysis. -# -# The following are some examples of well-formatted profile configurations - -evil-corp: - outputs: - dev: # specify the dev connection - type: redshift - threads: 1 - host: 12.34.56.78 - port: 5439 - user: elliot - pass: pa55word - dbname: warehouse - schema: dbt_elliot # use the dev schema - prod: # specify the prod connection - type: redshift - threads: 1 - host: 12.34.56.78 - port: 5439 - user: elliot - pass: pa55word - dbname: warehouse - schema: analytics # use the prod schema instead - snowflake: # specify the snowflake connection - type: snowflake - threads: 1 - account: evilcorp # the url prefix for your snowflake connection, - # i.e. evilcorp.snowflakecomputing.com - user: elliot - password: pa55word - role: SYSADMIN # optional, the snowflake role you want to use - # when connecting - database: db - warehouse: warehouse - schema: analytics # use the prod schema instead - - bigquery: - type: bigquery - method: oauth - project: evil-corp - schema: analytics - threads: 1 - - target: dev # default target is dev unless changed at run time - -mr-robot: - outputs: - dev: # specify the dev connection - type: postgres - threads: 2 - host: 87.65.43.21 - port: 5439 - user: mr_robot - pass: password1 - dbname: warehouse - schema: dbt_mr_robot # use the dev schema - prod: # specify the prod connection - type: postgres - threads: 1 - host: 87.65.43.21 - port: 5439 - user: mr_robot - pass: password1 - dbname: warehouse - schema: analytics # use the prod schema instead - target: dev # default target is dev unless changed at run time - -# You can switch between profiles and targets on the command line. All of the -# following are valid ways to invoke dbt run/test/compile/etc -# -# $ dbt run --profile evil-corp -# $ dbt run --profile evil-corp --target dev -# $ dbt run --profile evil-corp --target prod -# -# $ dbt run --profile mr-robot -# $ dbt run --profile mr-robot --target dev -# $ dbt run --profile mr-robot --target prod diff --git a/sample.schema.yml b/sample.schema.yml deleted file mode 100644 index 217c25313f8..00000000000 --- a/sample.schema.yml +++ /dev/null @@ -1,74 +0,0 @@ - -# This configuration file specifies constraints that should (ideally) -# be true about your data models. The constraints can be tested using -# the `dbt test --schema` command. When that command is executed, dbt -# will compile this schema.yml file to a series of SQL statements and -# validate that the specified constraints hold against your data. - -# A dbt project can contain any number of schema.yml files. Moreover, -# schema.yml files can be placed anywhere within the `models` directory -# of your dbt project. - -# There are four types of schema validations: -# - Not null -# - Unique -# - Referential integrity -# - Field in list of accepted values - -# A schema.yml file should specify constraints for one or more models. -# These constraints should adhere to the following structure: - -# [model-name]: -# constraints: -# not_null: -# - [field or expression] -# - [field or expression] -# ... -# -# unique: -# - [field or expression] -# - [field or expression] -# ... -# -# relationships: -# - {from: [field], to: [other-model], field: [other-field]} -# ... -# -# accepted_values: -# - {field: [field or expression], values: ['valid', 'values', 'here']} -# ... -# -# Below is an example of some schema constraints defined for fictitious models. -# - -people: - constraints: - # check number of times these fields are null (should be 0) - not_null: - - id - - account_id - - name - - # count number of non-unique `id` fields (should be 0) - unique: - - id - - # count number of rows where `people.account_id` points to a nonexistent `accounts.id` (should be 0) - # Note: the 'accounts' model needs to be `ref`d here - relationships: - - {from: account_id, to: ref('accounts'), field: id} - -accounts: - constraints: - # count number of rows where a value is not in the given accepted values - accepted_values: - - {field: tier, values: ['paid', 'free']} - - not_null: - - id - - domain - - unique: - - id - - From 15c047077abd6b5317a0ab8729ce3eb692fa71ce Mon Sep 17 00:00:00 2001 From: Jacob Beck Date: Thu, 13 Dec 2018 10:28:39 -0700 Subject: [PATCH 04/16] Add ipdb to dev requirements so it shows up in test docker containers for debugging --- dev_requirements.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/dev_requirements.txt b/dev_requirements.txt index d205dbd8f9d..cc33b84fbb1 100644 --- a/dev_requirements.txt +++ b/dev_requirements.txt @@ -6,3 +6,4 @@ pytz==2017.2 bumpversion==0.5.3 coverage==4.2 tox==2.5.0 +ipdb From 5deb7e8c2de361d834599dbf4d5ffba7117984ff Mon Sep 17 00:00:00 2001 From: Jacob Beck Date: Thu, 13 Dec 2018 08:54:31 -0700 Subject: [PATCH 05/16] everything about tracking is hard --- dbt/config.py | 75 +++++++++++++++++++++++++--------------- dbt/contracts/project.py | 24 ++++++++----- dbt/main.py | 12 +++---- test/integration/base.py | 1 + test/unit/test_config.py | 38 ++++++++++---------- 5 files changed, 89 insertions(+), 61 deletions(-) diff --git a/dbt/config.py b/dbt/config.py index a87722f2819..71a913c0849 100644 --- a/dbt/config.py +++ b/dbt/config.py @@ -460,13 +460,48 @@ def warn_for_unused_resource_config_paths(self, resource_fqns, disabled): logger.info(dbt.ui.printer.yellow(msg)) +class UserConfig(object): + def __init__(self, send_anonymous_usage_stats, use_colors): + self.send_anonymous_usage_stats = send_anonymous_usage_stats + self.use_colors = use_colors + + @classmethod + def from_dict(cls, cfg=None): + if cfg is None: + cfg = {} + send_anonymous_usage_stats = cfg.get( + 'send_anonymous_usage_stats', + DEFAULT_SEND_ANONYMOUS_USAGE_STATS + ) + use_colors = cfg.get( + 'use_colors', + DEFAULT_USE_COLORS + ) + return cls(send_anonymous_usage_stats, use_colors) + + def to_dict(self): + return { + 'send_anonymous_usage_stats': self.send_anonymous_usage_stats, + 'use_colors': self.use_colors, + } + + @classmethod + def from_directory(cls, directory): + user_cfg = None + profile = read_profile(directory) + if profile: + user_cfg = profile.get('config', {}) + return cls.from_dict(user_cfg) + + class Profile(object): - def __init__(self, profile_name, target_name, send_anonymous_usage_stats, - use_colors, threads, credentials): + def __init__(self, profile_name, target_name, config, threads, + credentials): self.profile_name = profile_name self.target_name = target_name - self.send_anonymous_usage_stats = send_anonymous_usage_stats - self.use_colors = use_colors + if isinstance(config, dict): + config = UserConfig.from_dict(config) + self.config = config self.threads = threads self.credentials = credentials @@ -482,8 +517,7 @@ def to_profile_info(self, serialize_credentials=False): result = { 'profile_name': self.profile_name, 'target_name': self.target_name, - 'send_anonymous_usage_stats': self.send_anonymous_usage_stats, - 'use_colors': self.use_colors, + 'config': self.config.to_dict(), 'threads': self.threads, 'credentials': self.credentials.incorporate(), } @@ -568,21 +602,11 @@ def from_credentials(cls, credentials, threads, profile_name, target_name, :raises DbtProfileError: If the profile is invalid. :returns Profile: The new Profile object. """ - if user_cfg is None: - user_cfg = {} - send_anonymous_usage_stats = user_cfg.get( - 'send_anonymous_usage_stats', - DEFAULT_SEND_ANONYMOUS_USAGE_STATS - ) - use_colors = user_cfg.get( - 'use_colors', - DEFAULT_USE_COLORS - ) + config = UserConfig.from_dict(user_cfg) profile = cls( profile_name=profile_name, target_name=target_name, - send_anonymous_usage_stats=send_anonymous_usage_stats, - use_colors=use_colors, + config=config, threads=threads, credentials=credentials ) @@ -729,10 +753,8 @@ def from_args(cls, args, project_profile_name=None, cli_vars=None): cli_vars = dbt.utils.parse_cli_vars(getattr(args, 'vars', '{}')) threads_override = getattr(args, 'threads', None) - # TODO(jeb): is it even possible for this to not be set? - profiles_dir = getattr(args, 'profiles_dir', PROFILES_DIR) target_override = getattr(args, 'target', None) - raw_profiles = read_profile(profiles_dir) + raw_profiles = read_profile(args.profiles_dir) profile_name = cls.pick_profile_name(args.profile, project_profile_name) @@ -781,9 +803,8 @@ def __init__(self, project_name, version, project_root, source_paths, macro_paths, data_paths, test_paths, analysis_paths, docs_paths, target_path, clean_targets, log_path, modules_path, quoting, models, on_run_start, on_run_end, - archive, seeds, profile_name, target_name, - send_anonymous_usage_stats, use_colors, threads, credentials, - packages, args): + archive, seeds, profile_name, target_name, config, + threads, credentials, packages, args): # 'vars' self.args = args self.cli_vars = dbt.utils.parse_cli_vars(getattr(args, 'vars', '{}')) @@ -817,8 +838,7 @@ def __init__(self, project_name, version, project_root, source_paths, self, profile_name=profile_name, target_name=target_name, - send_anonymous_usage_stats=send_anonymous_usage_stats, - use_colors=use_colors, + config=config, threads=threads, credentials=credentials ) @@ -861,8 +881,7 @@ def from_parts(cls, project, profile, args): packages=project.packages, profile_name=profile.profile_name, target_name=profile.target_name, - send_anonymous_usage_stats=profile.send_anonymous_usage_stats, - use_colors=profile.use_colors, + config=profile.config, threads=profile.threads, credentials=profile.credentials, args=args diff --git a/dbt/contracts/project.py b/dbt/contracts/project.py index f14e74784e3..ad34dadc8c3 100644 --- a/dbt/contracts/project.py +++ b/dbt/contracts/project.py @@ -284,6 +284,20 @@ class PackageConfig(APIObject): SCHEMA = PACKAGE_FILE_CONTRACT +USER_CONFIG_CONTRACT = { + 'type': 'object', + 'additionalProperties': True, + 'properties': { + 'send_anonymous_usage_stats': { + 'type': 'boolean', + }, + 'use_colors': { + 'type': 'boolean', + }, + }, +} + + PROFILE_INFO_CONTRACT = { 'type': 'object', 'additionalProperties': False, @@ -294,12 +308,7 @@ class PackageConfig(APIObject): 'target_name': { 'type': 'string', }, - 'send_anonymous_usage_stats': { - 'type': 'boolean', - }, - 'use_colors': { - 'type': 'boolean', - }, + 'config': USER_CONFIG_CONTRACT, 'threads': { 'type': 'number', }, @@ -313,8 +322,7 @@ class PackageConfig(APIObject): }, }, 'required': [ - 'profile_name', 'target_name', 'send_anonymous_usage_stats', - 'use_colors', 'threads', 'credentials' + 'profile_name', 'target_name', 'config', 'threads', 'credentials' ], } diff --git a/dbt/main.py b/dbt/main.py index 1c358ef21d5..336dd310cba 100644 --- a/dbt/main.py +++ b/dbt/main.py @@ -28,9 +28,9 @@ import dbt.profiler from dbt.utils import ExitCodes -from dbt.config import Project, Profile, RuntimeConfig, PROFILES_DIR, \ +from dbt.config import Project, UserConfig, RuntimeConfig, PROFILES_DIR, \ read_profiles -from dbt.exceptions import DbtProfileError, DbtProfileError, RuntimeException +from dbt.exceptions import DbtProjectError, DbtProfileError, RuntimeException PROFILES_HELP_MESSAGE = """ @@ -118,16 +118,16 @@ def initialize_config_values(parsed): easy. """ try: - profile = Profile.from_args(parsed) + cfg = UserConfig.from_directory(parsed.profiles_dir) except RuntimeException: - profile = None + cfg = UserConfig.from_dict(None) - if profile is None or profile.send_anonymous_usage_stats: + if cfg.send_anonymous_usage_stats: dbt.tracking.initialize_tracking(parsed.profiles_dir) else: dbt.tracking.do_not_track() - if profile is None or profile.use_colors: + if cfg.use_colors: dbt.ui.printer.use_colors() diff --git a/test/integration/base.py b/test/integration/base.py index 3f6492298c8..5b12d3b8c99 100644 --- a/test/integration/base.py +++ b/test/integration/base.py @@ -42,6 +42,7 @@ class TestArgs(object): def __init__(self, kwargs): self.which = 'run' self.single_threaded = False + self.profiles_dir = DBT_CONFIG_DIR self.__dict__.update(kwargs) diff --git a/test/unit/test_config.py b/test/unit/test_config.py index cd2cfa1e381..156620df968 100644 --- a/test/unit/test_config.py +++ b/test/unit/test_config.py @@ -209,8 +209,8 @@ def test_from_raw_profiles(self): self.assertEqual(profile.profile_name, 'default') self.assertEqual(profile.target_name, 'postgres') self.assertEqual(profile.threads, 7) - self.assertTrue(profile.send_anonymous_usage_stats) - self.assertTrue(profile.use_colors) + self.assertTrue(profile.config.send_anonymous_usage_stats) + self.assertTrue(profile.config.use_colors) self.assertTrue(isinstance(profile.credentials, PostgresCredentials)) self.assertEqual(profile.credentials.type, 'postgres') self.assertEqual(profile.credentials.host, 'postgres-db-hostname') @@ -228,8 +228,8 @@ def test_config_override(self): profile = self.from_raw_profiles() self.assertEqual(profile.profile_name, 'default') self.assertEqual(profile.target_name, 'postgres') - self.assertFalse(profile.send_anonymous_usage_stats) - self.assertFalse(profile.use_colors) + self.assertFalse(profile.config.send_anonymous_usage_stats) + self.assertFalse(profile.config.use_colors) def test_partial_config_override(self): self.default_profile_data['config'] = { @@ -238,8 +238,8 @@ def test_partial_config_override(self): profile = self.from_raw_profiles() self.assertEqual(profile.profile_name, 'default') self.assertEqual(profile.target_name, 'postgres') - self.assertFalse(profile.send_anonymous_usage_stats) - self.assertTrue(profile.use_colors) + self.assertFalse(profile.config.send_anonymous_usage_stats) + self.assertTrue(profile.config.use_colors) def test_missing_type(self): del self.default_profile_data['default']['outputs']['postgres']['type'] @@ -364,8 +364,8 @@ def test_profile_simple(self): self.assertEqual(profile.profile_name, 'default') self.assertEqual(profile.target_name, 'postgres') self.assertEqual(profile.threads, 7) - self.assertTrue(profile.send_anonymous_usage_stats) - self.assertTrue(profile.use_colors) + self.assertTrue(profile.config.send_anonymous_usage_stats) + self.assertTrue(profile.config.use_colors) self.assertTrue(isinstance(profile.credentials, PostgresCredentials)) self.assertEqual(profile.credentials.type, 'postgres') self.assertEqual(profile.credentials.host, 'postgres-db-hostname') @@ -389,8 +389,8 @@ def test_profile_override(self): self.assertEqual(profile.profile_name, 'other') self.assertEqual(profile.target_name, 'other-postgres') self.assertEqual(profile.threads, 3) - self.assertTrue(profile.send_anonymous_usage_stats) - self.assertTrue(profile.use_colors) + self.assertTrue(profile.config.send_anonymous_usage_stats) + self.assertTrue(profile.config.use_colors) self.assertTrue(isinstance(profile.credentials, PostgresCredentials)) self.assertEqual(profile.credentials.type, 'postgres') self.assertEqual(profile.credentials.host, 'other-postgres-db-hostname') @@ -411,8 +411,8 @@ def test_target_override(self): self.assertEqual(profile.profile_name, 'default') self.assertEqual(profile.target_name, 'redshift') self.assertEqual(profile.threads, 1) - self.assertTrue(profile.send_anonymous_usage_stats) - self.assertTrue(profile.use_colors) + self.assertTrue(profile.config.send_anonymous_usage_stats) + self.assertTrue(profile.config.use_colors) self.assertTrue(isinstance(profile.credentials, RedshiftCredentials)) self.assertEqual(profile.credentials.type, 'redshift') self.assertEqual(profile.credentials.host, 'redshift-db-hostname') @@ -434,8 +434,8 @@ def test_env_vars(self): self.assertEqual(profile.profile_name, 'default') self.assertEqual(profile.target_name, 'with-vars') self.assertEqual(profile.threads, 1) - self.assertTrue(profile.send_anonymous_usage_stats) - self.assertTrue(profile.use_colors) + self.assertTrue(profile.config.send_anonymous_usage_stats) + self.assertTrue(profile.config.use_colors) self.assertEqual(profile.credentials.type, 'postgres') self.assertEqual(profile.credentials.host, 'env-postgres-host') self.assertEqual(profile.credentials.port, 6543) @@ -456,8 +456,8 @@ def test_env_vars_env_target(self): self.assertEqual(profile.profile_name, 'default') self.assertEqual(profile.target_name, 'with-vars') self.assertEqual(profile.threads, 1) - self.assertTrue(profile.send_anonymous_usage_stats) - self.assertTrue(profile.use_colors) + self.assertTrue(profile.config.send_anonymous_usage_stats) + self.assertTrue(profile.config.use_colors) self.assertEqual(profile.credentials.type, 'postgres') self.assertEqual(profile.credentials.host, 'env-postgres-host') self.assertEqual(profile.credentials.port, 6543) @@ -487,8 +487,8 @@ def test_cli_and_env_vars(self): self.assertEqual(profile.profile_name, 'default') self.assertEqual(profile.target_name, 'cli-and-env-vars') self.assertEqual(profile.threads, 1) - self.assertTrue(profile.send_anonymous_usage_stats) - self.assertTrue(profile.use_colors) + self.assertTrue(profile.config.send_anonymous_usage_stats) + self.assertTrue(profile.config.use_colors) self.assertEqual(profile.credentials.type, 'postgres') self.assertEqual(profile.credentials.host, 'cli-postgres-host') self.assertEqual(profile.credentials.port, 6543) @@ -978,7 +978,7 @@ def test_validate_fails(self): project = self.get_project() profile = self.get_profile() # invalid - must be boolean - profile.use_colors = None + profile.config.use_colors = None with self.assertRaises(dbt.exceptions.DbtProjectError): dbt.config.RuntimeConfig.from_parts(project, profile, {}) From 3cbf49cba7778f63a64701bcb487f303a8410403 Mon Sep 17 00:00:00 2001 From: Claire Carroll Date: Thu, 13 Dec 2018 16:46:06 -0500 Subject: [PATCH 06/16] Add m flag for tests --- dbt/main.py | 1 + 1 file changed, 1 insertion(+) diff --git a/dbt/main.py b/dbt/main.py index 03435a340c8..c8d13c18eac 100644 --- a/dbt/main.py +++ b/dbt/main.py @@ -575,6 +575,7 @@ def parse_args(args): """ ) sub.add_argument( + '-m', '--models', required=False, nargs='+', From 946686256043c0928def3c90fc149dd3f6905713 Mon Sep 17 00:00:00 2001 From: Jacob Beck Date: Fri, 14 Dec 2018 10:32:42 -0700 Subject: [PATCH 07/16] add require-dbt-version config item and --no-version-check flag, make dependency errors fail the run --- dbt/config.py | 82 ++++++++++++++++++- dbt/contracts/project.py | 13 ++- dbt/main.py | 8 ++ dbt/task/deps.py | 3 +- dbt/utils.py | 7 +- .../local_dependency/dbt_project.yml | 4 +- .../test_local_dependency.py | 23 +++++- test/unit/test_config.py | 80 ++++++++++++++++-- 8 files changed, 199 insertions(+), 21 deletions(-) diff --git a/dbt/config.py b/dbt/config.py index 28b57271e8a..65365aeec61 100644 --- a/dbt/config.py +++ b/dbt/config.py @@ -8,6 +8,7 @@ import dbt.clients.yaml_helper import dbt.clients.system import dbt.utils +from dbt.compat import basestring from dbt.contracts.project import Project as ProjectContract, Configuration, \ PackageConfig, ProfileConfig from dbt.exceptions import DbtProjectError, DbtProfileError, RecursionException @@ -17,6 +18,8 @@ from dbt.logger import GLOBAL_LOGGER as logger from dbt.utils import DBTConfigKeys +from dbt.version import get_installed_version +from dbt.semver import VersionSpecifier, versions_compatible import dbt.ui.printer DEFAULT_THREADS = 1 @@ -54,6 +57,24 @@ There are {} unused configuration paths:\n{} """ +INVALID_VERSION_ERROR = """\ +This version of dbt is not supported with the '{package}' package. + Installed version of dbt: {installed} + Required version of dbt for '{package}': {version_spec} + +Check the requirements for the '{package}' package, or run dbt again with \ +--no-version-check +""" + +IMPOSSIBLE_VERSION_ERROR = """\ +The package version requirement can never be satisfied for the '{package} +package. + Required versions of dbt for '{package}': {version_spec} + +Check the requirements for the '{package}' package, or run dbt again with \ +--no-version-check +""" + def read_profile(profiles_dir): path = os.path.join(profiles_dir, 'profiles.yml') @@ -191,12 +212,27 @@ def _list_if_none_or_string(value): return value +def _parse_versions(versions): + """Parse multiple versions as read from disk. The versions value may be any + one of: + - a single version string ('>0.12.1') + - a single string specifying multiple comma-separated versions + ('>0.11.1,<=0.12.2') + - an array of single-version strings (['>0.11.1', '<=0.12.2']) + + Regardless, this will return a list of VersionSpecifiers + """ + if isinstance(versions, basestring): + versions = versions.split(',') + return [VersionSpecifier.from_version_string(v) for v in versions] + + class Project(object): def __init__(self, project_name, version, project_root, profile_name, source_paths, macro_paths, data_paths, test_paths, analysis_paths, docs_paths, target_path, clean_targets, log_path, modules_path, quoting, models, on_run_start, - on_run_end, archive, seeds, packages): + on_run_end, archive, seeds, dbt_version, packages): self.project_name = project_name self.version = version self.project_root = project_root @@ -217,6 +253,7 @@ def __init__(self, project_name, version, project_root, profile_name, self.on_run_end = on_run_end self.archive = archive self.seeds = seeds + self.dbt_version = dbt_version self.packages = packages @staticmethod @@ -301,6 +338,12 @@ def from_project_config(cls, project_dict, packages_dict=None): on_run_end = project_dict.get('on-run-end', []) archive = project_dict.get('archive', []) seeds = project_dict.get('seeds', {}) + dbt_raw_version = project_dict.get('require-dbt-version', '>=0.0.0') + + try: + dbt_version = _parse_versions(dbt_raw_version) + except dbt.exceptions.SemverException as e: + raise DbtProjectError(str(e)) packages = package_config_from_data(packages_dict) @@ -325,6 +368,7 @@ def from_project_config(cls, project_dict, packages_dict=None): on_run_end=on_run_end, archive=archive, seeds=seeds, + dbt_version=dbt_version, packages=packages ) # sanity check - this means an internal issue @@ -370,6 +414,9 @@ def to_project_config(self, with_packages=False): 'on-run-end': self.on_run_end, 'archive': self.archive, 'seeds': self.seeds, + 'require-dbt-version': [ + v.to_version_string() for v in self.dbt_version + ], }) if with_packages: result.update(self.packages.serialize()) @@ -458,6 +505,28 @@ def warn_for_unused_resource_config_paths(self, resource_fqns, disabled): ) logger.info(dbt.ui.printer.yellow(msg)) + def validate_version(self): + """Ensure this package works with the installed version of dbt.""" + installed = get_installed_version() + if not versions_compatible(*self.dbt_version): + msg = IMPOSSIBLE_VERSION_ERROR.format( + package=self.project_name, + version_spec=[ + x.to_version_string() for x in self.dbt_version + ] + ) + raise DbtProjectError(msg) + + if not versions_compatible(installed, *self.dbt_version): + msg = INVALID_VERSION_ERROR.format( + package=self.project_name, + installed=installed.to_version_string(), + version_spec=[ + x.to_version_string() for x in self.dbt_version + ] + ) + raise DbtProjectError(msg) + class UserConfig(object): def __init__(self, send_anonymous_usage_stats, use_colors): @@ -807,8 +876,8 @@ def __init__(self, project_name, version, project_root, source_paths, macro_paths, data_paths, test_paths, analysis_paths, docs_paths, target_path, clean_targets, log_path, modules_path, quoting, models, on_run_start, on_run_end, - archive, seeds, profile_name, target_name, config, - threads, credentials, packages, args): + archive, seeds, dbt_version, profile_name, target_name, + config, threads, credentials, packages, args): # 'vars' self.args = args self.cli_vars = dbt.utils.parse_cli_vars(getattr(args, 'vars', '{}')) @@ -835,7 +904,8 @@ def __init__(self, project_name, version, project_root, source_paths, on_run_end=on_run_end, archive=archive, seeds=seeds, - packages=packages, + dbt_version=dbt_version, + packages=packages ) # 'profile' Profile.__init__( @@ -882,6 +952,7 @@ def from_parts(cls, project, profile, args): on_run_end=project.on_run_end, archive=project.archive, seeds=project.seeds, + dbt_version=project.dbt_version, packages=project.packages, profile_name=profile.profile_name, target_name=profile.target_name, @@ -942,6 +1013,9 @@ def validate(self): except dbt.exceptions.ValidationException as e: raise DbtProjectError(str(e)) + if getattr(self.args, 'version_check', False): + self.validate_version() + @classmethod def from_args(cls, args): """Given arguments, read in dbt_project.yml from the current directory, diff --git a/dbt/contracts/project.py b/dbt/contracts/project.py index 8363554c377..db76f6b13b1 100644 --- a/dbt/contracts/project.py +++ b/dbt/contracts/project.py @@ -24,7 +24,7 @@ 'target_schema': {'type': 'string'}, 'tables': { 'type': 'array', - 'item': ARCHIVE_TABLE_CONFIG_CONTRACT, + 'items': ARCHIVE_TABLE_CONFIG_CONTRACT, } }, 'required': ['source_schema', 'target_schema', 'tables'], @@ -140,6 +140,11 @@ 'type': 'object', 'additionalProperties': True, }, + # we validate the regex separately, using the pattern in dbt.semver + 'require-dbt-version': { + 'type': ['string', 'array'], + 'items': {'type': 'string'}, + }, }, 'required': ['name', 'version'], } @@ -174,7 +179,7 @@ class Project(APIObject): }, 'revision': { 'type': ['string', 'array'], - 'item': 'string', + 'items': {'type': 'string'}, 'description': 'The git revision to use, if it is not tip', }, }, @@ -220,10 +225,10 @@ class Project(APIObject): }, 'version': { 'type': ['string', 'array'], - 'item': { + 'items': { 'anyOf': [ VERSION_SPECIFICATION_CONTRACT, - 'string' + {'type': 'string'} ], }, 'description': 'The version of the package', diff --git a/dbt/main.py b/dbt/main.py index 248745c9476..13043c246b6 100644 --- a/dbt/main.py +++ b/dbt/main.py @@ -530,6 +530,14 @@ def parse_args(args): If specified, DBT will drop incremental models and fully-recalculate the incremental table from the model definition. """) + sub.add_argument( + '--no-version-check', + dest='version_check', + action='store_false', + help=""" + If set, skip ensuring dbt's version matches the one specified in + the dbt_project.yml file ('require-dbt-version') + """) seed_sub = subs.add_parser( 'seed', diff --git a/dbt/task/deps.py b/dbt/task/deps.py index 9436f6a0d7e..2fe91a8af66 100644 --- a/dbt/task/deps.py +++ b/dbt/task/deps.py @@ -152,7 +152,8 @@ def nice_version_name(self): def incorporate(self, other): return RegistryPackage( package=self.package, - version=self.version + other.version + version=[x.to_version_string() for x in + self.version + other.version] ) def _check_in_index(self): diff --git a/dbt/utils.py b/dbt/utils.py index ca7c2611907..788c73f760f 100644 --- a/dbt/utils.py +++ b/dbt/utils.py @@ -209,11 +209,10 @@ def dependencies_for_path(config, module_path): try: yield config.new_project(full_obj) except dbt.exceptions.DbtProjectError as e: - logger.info( - "Error reading dependency project at {}".format( - full_obj) + raise dbt.exceptions.DbtProjectError( + 'Failed to read package at {}: {}' + .format(full_obj, e) ) - logger.info(str(e)) def dependency_projects(config): diff --git a/test/integration/006_simple_dependency_test/local_dependency/dbt_project.yml b/test/integration/006_simple_dependency_test/local_dependency/dbt_project.yml index 0a091b8bee5..8aa9ee5891a 100644 --- a/test/integration/006_simple_dependency_test/local_dependency/dbt_project.yml +++ b/test/integration/006_simple_dependency_test/local_dependency/dbt_project.yml @@ -5,11 +5,13 @@ version: '1.0' profile: 'default' source-paths: ["models"] -analysis-paths: ["analysis"] +analysis-paths: ["analysis"] test-paths: ["tests"] data-paths: ["data"] macro-paths: ["macros"] +require-dbt-version: '>=0.1.0' + target-path: "target" # directory which will store compiled SQL files clean-targets: # directories to be removed by `dbt clean` - "target" diff --git a/test/integration/006_simple_dependency_test/test_local_dependency.py b/test/integration/006_simple_dependency_test/test_local_dependency.py index fe79d1b9ba3..d09aa9de848 100644 --- a/test/integration/006_simple_dependency_test/test_local_dependency.py +++ b/test/integration/006_simple_dependency_test/test_local_dependency.py @@ -1,5 +1,10 @@ from nose.plugins.attrib import attr from test.integration.base import DBTIntegrationTest +import mock + +import dbt.semver +import dbt.config +import dbt.exceptions class TestSimpleDependency(DBTIntegrationTest): @@ -41,7 +46,6 @@ def test_postgres_local_dependency(self): ) - class TestSimpleDependencyWithSchema(TestSimpleDependency): @property def project_config(self): @@ -57,3 +61,20 @@ def base_schema(self): def configured_schema(self): return 'configured_{}_macro'.format(self.unique_schema()) + + @attr(type='postgres') + @mock.patch('dbt.config.get_installed_version') + def test_postgres_local_dependency_out_of_date(self, mock_get): + mock_get.return_value = dbt.semver.VersionSpecifier.from_version_string('0.0.1') + self.run_dbt(['deps']) + with self.assertRaises(dbt.exceptions.DbtProjectError) as e: + self.run_dbt(['run']) + self.assertIn('--no-version-check', str(e.exception)) + + @attr(type='postgres') + @mock.patch('dbt.config.get_installed_version') + def test_postgres_local_dependency_out_of_date_no_check(self, mock_get): + mock_get.return_value = dbt.semver.VersionSpecifier.from_version_string('0.0.1') + self.run_dbt(['deps']) + results = self.run_dbt(['run', '--no-version-check']) + self.assertEqual(len(results), 3) diff --git a/test/unit/test_config.py b/test/unit/test_config.py index 9d2d8aee233..7f924e02adf 100644 --- a/test/unit/test_config.py +++ b/test/unit/test_config.py @@ -14,6 +14,7 @@ from dbt.adapters.postgres import PostgresCredentials from dbt.adapters.redshift import RedshiftCredentials from dbt.contracts.project import PackageConfig +from dbt.semver import VersionSpecifier @contextmanager @@ -64,7 +65,8 @@ def temp_cd(path): class Args(object): - def __init__(self, profiles_dir=None, threads=None, profile=None, cli_vars=None): + def __init__(self, profiles_dir=None, threads=None, profile=None, + cli_vars=None, version_check=None): self.profile = profile if threads is not None: self.threads = threads @@ -72,6 +74,8 @@ def __init__(self, profiles_dir=None, threads=None, profile=None, cli_vars=None) self.profiles_dir = profiles_dir if cli_vars is not None: self.vars = cli_vars + if version_check is not None: + self.version_check = version_check class BaseConfigTest(unittest.TestCase): @@ -143,7 +147,8 @@ def setUp(self): 'target': 'other-postgres', } } - self.args = Args(profiles_dir=self.profiles_dir, cli_vars='{}') + self.args = Args(profiles_dir=self.profiles_dir, cli_vars='{}', + version_check=True) self.env_override = { 'env_value_type': 'postgres', 'env_value_host': 'env-postgres-host', @@ -534,6 +539,8 @@ def test_defaults(self): self.assertEqual(project.on_run_end, []) self.assertEqual(project.archive, []) self.assertEqual(project.seeds, {}) + self.assertEqual(project.dbt_version, + [VersionSpecifier.from_version_string('>=0.0.0')]) self.assertEqual(project.packages, PackageConfig(packages=[])) # just make sure str() doesn't crash anything, that's always # embarrassing @@ -617,7 +624,7 @@ def test_all_overrides(self): 'tables': [ { 'source_table': 'my_table', - 'target_Table': 'my_table_archived', + 'target_table': 'my_table_archived', 'updated_at': 'updated_at_field', 'unique_key': 'table_id', }, @@ -631,6 +638,7 @@ def test_all_overrides(self): 'post-hook': 'grant select on {{ this }} to bi_user', }, }, + 'require-dbt-version': '>=0.1.0', }) packages = { 'packages': [ @@ -689,7 +697,7 @@ def test_all_overrides(self): 'tables': [ { 'source_table': 'my_table', - 'target_Table': 'my_table_archived', + 'target_table': 'my_table_archived', 'updated_at': 'updated_at_field', 'unique_key': 'table_id', }, @@ -702,6 +710,8 @@ def test_all_overrides(self): 'post-hook': 'grant select on {{ this }} to bi_user', }, }) + self.assertEqual(project.dbt_version, + [VersionSpecifier.from_version_string('>=0.1.0')]) self.assertEqual(project.packages, PackageConfig(packages=[ { 'local': 'foo', @@ -744,6 +754,16 @@ def test_no_project(self): self.assertIn('no dbt_project.yml', str(exc.exception)) + def test_invalid_version(self): + self.default_project_data['require-dbt-version'] = 'hello!' + with self.assertRaises(dbt.exceptions.DbtProjectError) as exc: + dbt.config.Project.from_project_config(self.default_project_data) + + def test_unsupported_version(self): + self.default_project_data['require-dbt-version'] = '>99999.0.0' + # allowed, because the RuntimeConfig checks, not the Project itself + dbt.config.Project.from_project_config(self.default_project_data) + def test__no_unused_resource_config_paths(self): self.default_project_data.update({ 'models': model_config, @@ -885,7 +905,6 @@ def test__warn_for_unused_resource_config_paths_disabled(self, mock_logger): self.assertEqual(len(unused), 0) - class TestProjectFile(BaseFileTest): def setUp(self): super(TestProjectFile, self).setUp() @@ -946,10 +965,21 @@ def get_profile(self): self.default_profile_data, self.default_project_data['profile'], {} ) + def from_parts(self, exc=None): + project = self.get_project() + profile = self.get_profile() + if exc is None: + return dbt.config.RuntimeConfig.from_parts(project, profile, self.args) + + with self.assertRaises(exc) as raised: + err = raised + dbt.config.RuntimeConfig.from_parts(project, profile, self.args) + return err + def test_from_parts(self): project = self.get_project() profile = self.get_profile() - config = dbt.config.RuntimeConfig.from_parts(project, profile, {}) + config = dbt.config.RuntimeConfig.from_parts(project, profile, self.args) self.assertEqual(config.cli_vars, {}) self.assertEqual(config.to_profile_info(), profile.to_profile_info()) @@ -982,6 +1012,44 @@ def test_validate_fails(self): with self.assertRaises(dbt.exceptions.DbtProjectError): dbt.config.RuntimeConfig.from_parts(project, profile, {}) + def test_supported_version(self): + self.default_project_data['require-dbt-version'] = '>0.0.0' + conf = self.from_parts() + self.assertEqual(set(x.to_version_string() for x in conf.dbt_version), {'>0.0.0'}) + + def test_unsupported_version(self): + self.default_project_data['require-dbt-version'] = '>99999.0.0' + raised = self.from_parts(dbt.exceptions.DbtProjectError) + self.assertIn('This version of dbt is not supported', str(raised.exception)) + + def test_unsupported_version_no_check(self): + self.default_project_data['require-dbt-version'] = '>99999.0.0' + self.args.version_check = False + conf = self.from_parts() + self.assertEqual(set(x.to_version_string() for x in conf.dbt_version), {'>99999.0.0'}) + + def test_supported_version_range(self): + self.default_project_data['require-dbt-version'] = ['>0.0.0', '<=99999.0.0'] + conf = self.from_parts() + self.assertEqual(set(x.to_version_string() for x in conf.dbt_version), {'>0.0.0', '<=99999.0.0'}) + + def test_unsupported_version_range(self): + self.default_project_data['require-dbt-version'] = ['>0.0.0', '<=0.0.1'] + raised = self.from_parts(dbt.exceptions.DbtProjectError) + self.assertIn('This version of dbt is not supported', str(raised.exception)) + + def test_unsupported_version_range_no_check(self): + self.default_project_data['require-dbt-version'] = ['>0.0.0', '<=0.0.1'] + self.args.version_check = False + conf = self.from_parts() + self.assertEqual(set(x.to_version_string() for x in conf.dbt_version), {'>0.0.0', '<=0.0.1'}) + + def test_impossible_version_range(self): + self.default_project_data['require-dbt-version'] = ['>99999.0.0', '<=0.0.1'] + raised = self.from_parts(dbt.exceptions.DbtProjectError) + self.assertIn('The package version requirement can never be satisfied', str(raised.exception)) + + class TestRuntimeConfigFiles(BaseFileTest): def setUp(self): From 4780c4bb182a74d4506066aed2e3c280aa30cd1b Mon Sep 17 00:00:00 2001 From: Jacob Beck Date: Fri, 14 Dec 2018 10:40:10 -0700 Subject: [PATCH 08/16] Split dbt into core and plugins --- .bumpversion.cfg | 14 +- .coveragerc | 3 +- CHANGELOG.md => core/CHANGELOG.md | 0 CONTRIBUTING.md => core/CONTRIBUTING.md | 0 License.md => core/License.md | 0 MANIFEST.in => core/MANIFEST.in | 0 README.md => core/README.md | 0 core/dbt/__init__.py | 1 + core/dbt/adapters/__init__.py | 1 + {dbt => core/dbt}/adapters/base/__init__.py | 1 + .../dbt}/adapters/base/connections.py | 0 {dbt => core/dbt}/adapters/base/impl.py | 0 {dbt => core/dbt}/adapters/base/meta.py | 0 core/dbt/adapters/base/plugin.py | 26 + {dbt => core/dbt}/adapters/base/relation.py | 0 {dbt => core/dbt}/adapters/cache.py | 0 {dbt => core/dbt}/adapters/factory.py | 24 +- {dbt => core/dbt}/adapters/sql/__init__.py | 0 {dbt => core/dbt}/adapters/sql/connections.py | 0 {dbt => core/dbt}/adapters/sql/impl.py | 0 {dbt => core/dbt}/api/__init__.py | 0 {dbt => core/dbt}/api/object.py | 0 {dbt => core/dbt/clients}/__init__.py | 0 {dbt => core/dbt}/clients/agate_helper.py | 0 {dbt => core/dbt}/clients/gcloud.py | 0 {dbt => core/dbt}/clients/git.py | 0 {dbt => core/dbt}/clients/jinja.py | 0 {dbt => core/dbt}/clients/registry.py | 0 {dbt => core/dbt}/clients/system.py | 0 {dbt => core/dbt}/clients/yaml_helper.py | 0 {dbt => core/dbt}/compat.py | 0 {dbt => core/dbt}/compilation.py | 0 core/dbt/config/__init__.py | 22 + core/dbt/config/profile.py | 370 ++++++ core/dbt/config/project.py | 442 +++++++ core/dbt/config/renderer.py | 95 ++ core/dbt/config/runtime.py | 190 +++ .../adapters => core/dbt/context}/__init__.py | 0 {dbt => core/dbt}/context/common.py | 25 +- {dbt => core/dbt}/context/parser.py | 0 {dbt => core/dbt}/context/runtime.py | 0 .../dbt/contracts}/__init__.py | 0 {dbt => core/dbt}/contracts/common.py | 0 {dbt => core/dbt}/contracts/connection.py | 0 .../dbt/contracts/graph}/__init__.py | 0 {dbt => core/dbt}/contracts/graph/compiled.py | 0 {dbt => core/dbt}/contracts/graph/manifest.py | 0 {dbt => core/dbt}/contracts/graph/parsed.py | 0 {dbt => core/dbt}/contracts/graph/unparsed.py | 0 {dbt => core/dbt}/contracts/project.py | 0 {dbt => core/dbt}/contracts/results.py | 0 {dbt => core/dbt}/deprecations.py | 0 {dbt => core/dbt}/exceptions.py | 0 {dbt => core/dbt}/flags.py | 0 {dbt/contracts => core/dbt/graph}/__init__.py | 0 {dbt => core/dbt}/graph/selector.py | 0 {dbt => core/dbt}/hooks.py | 0 core/dbt/include/__init__.py | 1 + core/dbt/include/global_project/__init__.py | 11 + .../include/global_project/dbt_project.yml | 0 .../include/global_project/docs/overview.md | 0 .../global_project/macros/adapters/common.sql | 0 .../include/global_project/macros/core.sql | 0 .../global_project/macros/etc/datetime.sql | 0 .../macros/etc/get_custom_schema.sql | 0 .../macros/etc/is_incremental.sql | 0 .../materializations/archive/archive.sql | 22 - .../macros/materializations/common/merge.sql | 15 +- .../macros/materializations/helpers.sql | 0 .../incremental/incremental.sql | 0 .../macros/materializations/seed/seed.sql | 0 .../macros/materializations/table/table.sql | 0 .../view/create_or_replace_view.sql | 19 +- .../macros/materializations/view/view.sql | 0 .../macros/operations/catalog/get_catalog.sql | 0 .../operations/relations/get_relations.sql | 0 .../macros/schema_tests/accepted_values.sql | 0 .../macros/schema_tests/not_null.sql | 0 .../macros/schema_tests/relationships.sql | 0 .../macros/schema_tests/unique.sql | 0 {dbt => core/dbt}/include/index.html | 0 {dbt => core/dbt}/linker.py | 0 {dbt => core/dbt}/links.py | 0 {dbt => core/dbt}/loader.py | 0 {dbt => core/dbt}/logger.py | 0 {dbt => core/dbt}/main.py | 0 {dbt => core/dbt}/node_runners.py | 1 - {dbt => core/dbt}/node_types.py | 0 {dbt => core/dbt}/parser/__init__.py | 0 {dbt => core/dbt}/parser/analysis.py | 0 {dbt => core/dbt}/parser/archives.py | 0 {dbt => core/dbt}/parser/base.py | 3 +- {dbt => core/dbt}/parser/base_sql.py | 0 {dbt => core/dbt}/parser/data_test.py | 0 {dbt => core/dbt}/parser/docs.py | 0 {dbt => core/dbt}/parser/hooks.py | 0 {dbt => core/dbt}/parser/macros.py | 0 {dbt => core/dbt}/parser/models.py | 0 {dbt => core/dbt}/parser/schemas.py | 0 {dbt => core/dbt}/parser/seeds.py | 0 {dbt => core/dbt}/parser/source_config.py | 0 {dbt => core/dbt}/parser/util.py | 0 {dbt => core/dbt}/profiler.py | 0 {dbt => core/dbt}/runner.py | 0 {dbt => core/dbt}/schema.py | 0 {dbt => core/dbt}/semver.py | 0 {dbt => core/dbt}/ssh_forward.py | 0 .../graph => core/dbt/task}/__init__.py | 0 {dbt => core/dbt}/task/archive.py | 0 {dbt => core/dbt}/task/base_task.py | 0 {dbt => core/dbt}/task/clean.py | 0 {dbt => core/dbt}/task/compile.py | 0 {dbt => core/dbt}/task/debug.py | 0 {dbt => core/dbt}/task/deps.py | 0 {dbt => core/dbt}/task/generate.py | 2 +- {dbt => core/dbt}/task/init.py | 0 {dbt => core/dbt}/task/run.py | 0 {dbt => core/dbt}/task/seed.py | 0 {dbt => core/dbt}/task/serve.py | 2 +- {dbt => core/dbt}/task/test.py | 0 {dbt => core/dbt}/tracking.py | 0 {dbt/graph => core/dbt/ui}/__init__.py | 0 {dbt => core/dbt}/ui/colors.py | 0 {dbt => core/dbt}/ui/printer.py | 0 {dbt => core/dbt}/utils.py | 8 +- {dbt => core/dbt}/version.py | 2 +- {dbt => core/dbt}/writer.py | 0 core/etc/dag.png | Bin 0 -> 161481 bytes .../invocation_env_context.json | 0 .../invocation_event.json | 0 .../platform_context.json | 0 .../run_model_context.json | 0 core/scripts/create_adapter_plugins.py | 162 +++ {scripts => core/scripts}/dbt | 0 .../upgrade_dbt_schema_tests_v1_to_v2.py | 0 setup.py => core/setup.py | 23 +- dbt/adapters/postgres/__init__.py | 6 - dbt/adapters/redshift/__init__.py | 6 - dbt/config.py | 1077 ----------------- dbt/include/__init__.py | 8 - dbt/task/__init__.py | 0 dbt/templates.py | 0 dbt/ui/__init__.py | 0 plugins/bigquery/dbt/__init__.py | 1 + plugins/bigquery/dbt/adapters/__init__.py | 1 + .../dbt}/adapters/bigquery/__init__.py | 9 +- .../dbt}/adapters/bigquery/connections.py | 0 .../bigquery/dbt}/adapters/bigquery/impl.py | 0 .../dbt}/adapters/bigquery/relation.py | 0 plugins/bigquery/dbt/include/__init__.py | 1 + .../bigquery/dbt/include/bigquery/__init__.py | 2 + .../dbt/include/bigquery/dbt_project.yml | 5 + .../dbt/include/bigquery/macros/adapters.sql | 0 .../dbt/include/bigquery/macros/etc.sql | 0 .../macros/materializations/archive.sql | 23 + .../macros/materializations/incremental.sql | 0 .../macros/materializations/merge.sql | 3 + .../bigquery/macros/materializations/seed.sql | 0 .../macros/materializations/table.sql | 0 .../bigquery/macros/materializations/view.sql | 13 + plugins/bigquery/setup.py | 29 + plugins/postgres/dbt/__init__.py | 1 + plugins/postgres/dbt/adapters/__init__.py | 1 + .../dbt/adapters/postgres/__init__.py | 11 + .../dbt}/adapters/postgres/connections.py | 0 .../postgres/dbt}/adapters/postgres/impl.py | 0 plugins/postgres/dbt/include/__init__.py | 1 + .../postgres/dbt/include/postgres/__init__.py | 2 + .../dbt/include/postgres/dbt_project.yml | 5 + .../dbt/include/postgres/macros/catalog.sql | 0 .../dbt/include/postgres/macros/relations.sql | 0 plugins/postgres/setup.py | 27 + plugins/redshift/dbt/__init__.py | 1 + plugins/redshift/dbt/adapters/__init__.py | 1 + .../dbt/adapters/redshift/__init__.py | 13 + .../dbt}/adapters/redshift/connections.py | 0 .../redshift/dbt}/adapters/redshift/impl.py | 0 plugins/redshift/dbt/include/__init__.py | 1 + .../redshift/dbt/include/redshift/__init__.py | 3 + .../dbt/include/redshift/dbt_project.yml | 5 + .../dbt/include/redshift/macros/adapters.sql | 0 .../dbt/include/redshift/macros/catalog.sql | 0 .../dbt/include/redshift/macros/relations.sql | 0 plugins/redshift/setup.py | 31 + plugins/snowflake/dbt/__init__.py | 1 + plugins/snowflake/dbt/adapters/__init__.py | 1 + .../dbt}/adapters/snowflake/__init__.py | 8 +- .../dbt}/adapters/snowflake/connections.py | 0 .../snowflake/dbt}/adapters/snowflake/impl.py | 0 .../dbt}/adapters/snowflake/relation.py | 0 plugins/snowflake/dbt/include/__init__.py | 1 + .../dbt/include/snowflake/__init__.py | 2 + .../dbt/include/snowflake/dbt_project.yml | 5 + .../dbt/include/snowflake/macros/adapters.sql | 0 .../dbt/include/snowflake/macros/catalog.sql | 0 .../macros/materializations/merge.sql | 3 + .../macros/materializations/table.sql | 0 .../macros/materializations/view.sql | 3 + plugins/snowflake/setup.py | 31 + requirements.txt | 6 +- .../test_local_dependency.py | 4 +- .../test_docs_generate.py | 57 +- test/unit/test_config.py | 8 +- test/unit/test_graph.py | 1 - tox.ini | 60 +- 205 files changed, 1722 insertions(+), 1241 deletions(-) rename CHANGELOG.md => core/CHANGELOG.md (100%) rename CONTRIBUTING.md => core/CONTRIBUTING.md (100%) rename License.md => core/License.md (100%) rename MANIFEST.in => core/MANIFEST.in (100%) rename README.md => core/README.md (100%) create mode 100644 core/dbt/__init__.py create mode 100644 core/dbt/adapters/__init__.py rename {dbt => core/dbt}/adapters/base/__init__.py (81%) rename {dbt => core/dbt}/adapters/base/connections.py (100%) rename {dbt => core/dbt}/adapters/base/impl.py (100%) rename {dbt => core/dbt}/adapters/base/meta.py (100%) create mode 100644 core/dbt/adapters/base/plugin.py rename {dbt => core/dbt}/adapters/base/relation.py (100%) rename {dbt => core/dbt}/adapters/cache.py (100%) rename {dbt => core/dbt}/adapters/factory.py (81%) rename {dbt => core/dbt}/adapters/sql/__init__.py (100%) rename {dbt => core/dbt}/adapters/sql/connections.py (100%) rename {dbt => core/dbt}/adapters/sql/impl.py (100%) rename {dbt => core/dbt}/api/__init__.py (100%) rename {dbt => core/dbt}/api/object.py (100%) rename {dbt => core/dbt/clients}/__init__.py (100%) rename {dbt => core/dbt}/clients/agate_helper.py (100%) rename {dbt => core/dbt}/clients/gcloud.py (100%) rename {dbt => core/dbt}/clients/git.py (100%) rename {dbt => core/dbt}/clients/jinja.py (100%) rename {dbt => core/dbt}/clients/registry.py (100%) rename {dbt => core/dbt}/clients/system.py (100%) rename {dbt => core/dbt}/clients/yaml_helper.py (100%) rename {dbt => core/dbt}/compat.py (100%) rename {dbt => core/dbt}/compilation.py (100%) create mode 100644 core/dbt/config/__init__.py create mode 100644 core/dbt/config/profile.py create mode 100644 core/dbt/config/project.py create mode 100644 core/dbt/config/renderer.py create mode 100644 core/dbt/config/runtime.py rename {dbt/adapters => core/dbt/context}/__init__.py (100%) rename {dbt => core/dbt}/context/common.py (95%) rename {dbt => core/dbt}/context/parser.py (100%) rename {dbt => core/dbt}/context/runtime.py (100%) rename {dbt/clients => core/dbt/contracts}/__init__.py (100%) rename {dbt => core/dbt}/contracts/common.py (100%) rename {dbt => core/dbt}/contracts/connection.py (100%) rename {dbt/context => core/dbt/contracts/graph}/__init__.py (100%) rename {dbt => core/dbt}/contracts/graph/compiled.py (100%) rename {dbt => core/dbt}/contracts/graph/manifest.py (100%) rename {dbt => core/dbt}/contracts/graph/parsed.py (100%) rename {dbt => core/dbt}/contracts/graph/unparsed.py (100%) rename {dbt => core/dbt}/contracts/project.py (100%) rename {dbt => core/dbt}/contracts/results.py (100%) rename {dbt => core/dbt}/deprecations.py (100%) rename {dbt => core/dbt}/exceptions.py (100%) rename {dbt => core/dbt}/flags.py (100%) rename {dbt/contracts => core/dbt/graph}/__init__.py (100%) rename {dbt => core/dbt}/graph/selector.py (100%) rename {dbt => core/dbt}/hooks.py (100%) create mode 100644 core/dbt/include/__init__.py create mode 100644 core/dbt/include/global_project/__init__.py rename {dbt => core/dbt}/include/global_project/dbt_project.yml (100%) rename {dbt => core/dbt}/include/global_project/docs/overview.md (100%) rename {dbt => core/dbt}/include/global_project/macros/adapters/common.sql (100%) rename {dbt => core/dbt}/include/global_project/macros/core.sql (100%) rename {dbt => core/dbt}/include/global_project/macros/etc/datetime.sql (100%) rename {dbt => core/dbt}/include/global_project/macros/etc/get_custom_schema.sql (100%) rename {dbt => core/dbt}/include/global_project/macros/etc/is_incremental.sql (100%) rename {dbt => core/dbt}/include/global_project/macros/materializations/archive/archive.sql (89%) rename {dbt => core/dbt}/include/global_project/macros/materializations/common/merge.sql (73%) rename {dbt => core/dbt}/include/global_project/macros/materializations/helpers.sql (100%) rename {dbt => core/dbt}/include/global_project/macros/materializations/incremental/incremental.sql (100%) rename {dbt => core/dbt}/include/global_project/macros/materializations/seed/seed.sql (100%) rename {dbt => core/dbt}/include/global_project/macros/materializations/table/table.sql (100%) rename dbt/include/global_project/macros/materializations/view/bq_snowflake_view.sql => core/dbt/include/global_project/macros/materializations/view/create_or_replace_view.sql (82%) rename {dbt => core/dbt}/include/global_project/macros/materializations/view/view.sql (100%) rename {dbt => core/dbt}/include/global_project/macros/operations/catalog/get_catalog.sql (100%) rename {dbt => core/dbt}/include/global_project/macros/operations/relations/get_relations.sql (100%) rename {dbt => core/dbt}/include/global_project/macros/schema_tests/accepted_values.sql (100%) rename {dbt => core/dbt}/include/global_project/macros/schema_tests/not_null.sql (100%) rename {dbt => core/dbt}/include/global_project/macros/schema_tests/relationships.sql (100%) rename {dbt => core/dbt}/include/global_project/macros/schema_tests/unique.sql (100%) rename {dbt => core/dbt}/include/index.html (100%) rename {dbt => core/dbt}/linker.py (100%) rename {dbt => core/dbt}/links.py (100%) rename {dbt => core/dbt}/loader.py (100%) rename {dbt => core/dbt}/logger.py (100%) rename {dbt => core/dbt}/main.py (100%) rename {dbt => core/dbt}/node_runners.py (99%) rename {dbt => core/dbt}/node_types.py (100%) rename {dbt => core/dbt}/parser/__init__.py (100%) rename {dbt => core/dbt}/parser/analysis.py (100%) rename {dbt => core/dbt}/parser/archives.py (100%) rename {dbt => core/dbt}/parser/base.py (98%) rename {dbt => core/dbt}/parser/base_sql.py (100%) rename {dbt => core/dbt}/parser/data_test.py (100%) rename {dbt => core/dbt}/parser/docs.py (100%) rename {dbt => core/dbt}/parser/hooks.py (100%) rename {dbt => core/dbt}/parser/macros.py (100%) rename {dbt => core/dbt}/parser/models.py (100%) rename {dbt => core/dbt}/parser/schemas.py (100%) rename {dbt => core/dbt}/parser/seeds.py (100%) rename {dbt => core/dbt}/parser/source_config.py (100%) rename {dbt => core/dbt}/parser/util.py (100%) rename {dbt => core/dbt}/profiler.py (100%) rename {dbt => core/dbt}/runner.py (100%) rename {dbt => core/dbt}/schema.py (100%) rename {dbt => core/dbt}/semver.py (100%) rename {dbt => core/dbt}/ssh_forward.py (100%) rename {dbt/contracts/graph => core/dbt/task}/__init__.py (100%) rename {dbt => core/dbt}/task/archive.py (100%) rename {dbt => core/dbt}/task/base_task.py (100%) rename {dbt => core/dbt}/task/clean.py (100%) rename {dbt => core/dbt}/task/compile.py (100%) rename {dbt => core/dbt}/task/debug.py (100%) rename {dbt => core/dbt}/task/deps.py (100%) rename {dbt => core/dbt}/task/generate.py (99%) rename {dbt => core/dbt}/task/init.py (100%) rename {dbt => core/dbt}/task/run.py (100%) rename {dbt => core/dbt}/task/seed.py (100%) rename {dbt => core/dbt}/task/serve.py (94%) rename {dbt => core/dbt}/task/test.py (100%) rename {dbt => core/dbt}/tracking.py (100%) rename {dbt/graph => core/dbt/ui}/__init__.py (100%) rename {dbt => core/dbt}/ui/colors.py (100%) rename {dbt => core/dbt}/ui/printer.py (100%) rename {dbt => core/dbt}/utils.py (98%) rename {dbt => core/dbt}/version.py (98%) rename {dbt => core/dbt}/writer.py (100%) create mode 100644 core/etc/dag.png rename {events => core/events}/schemas/com.fishtownanalytics/invocation_env_context.json (100%) rename {events => core/events}/schemas/com.fishtownanalytics/invocation_event.json (100%) rename {events => core/events}/schemas/com.fishtownanalytics/platform_context.json (100%) rename {events => core/events}/schemas/com.fishtownanalytics/run_model_context.json (100%) create mode 100644 core/scripts/create_adapter_plugins.py rename {scripts => core/scripts}/dbt (100%) rename {scripts => core/scripts}/upgrade_dbt_schema_tests_v1_to_v2.py (100%) rename setup.py => core/setup.py (69%) delete mode 100644 dbt/adapters/postgres/__init__.py delete mode 100644 dbt/adapters/redshift/__init__.py delete mode 100644 dbt/config.py delete mode 100644 dbt/include/__init__.py delete mode 100644 dbt/task/__init__.py delete mode 100644 dbt/templates.py delete mode 100644 dbt/ui/__init__.py create mode 100644 plugins/bigquery/dbt/__init__.py create mode 100644 plugins/bigquery/dbt/adapters/__init__.py rename {dbt => plugins/bigquery/dbt}/adapters/bigquery/__init__.py (54%) rename {dbt => plugins/bigquery/dbt}/adapters/bigquery/connections.py (100%) rename {dbt => plugins/bigquery/dbt}/adapters/bigquery/impl.py (100%) rename {dbt => plugins/bigquery/dbt}/adapters/bigquery/relation.py (100%) create mode 100644 plugins/bigquery/dbt/include/__init__.py create mode 100644 plugins/bigquery/dbt/include/bigquery/__init__.py create mode 100644 plugins/bigquery/dbt/include/bigquery/dbt_project.yml rename dbt/include/global_project/macros/adapters/bigquery.sql => plugins/bigquery/dbt/include/bigquery/macros/adapters.sql (100%) rename dbt/include/global_project/macros/etc/bigquery.sql => plugins/bigquery/dbt/include/bigquery/macros/etc.sql (100%) create mode 100644 plugins/bigquery/dbt/include/bigquery/macros/materializations/archive.sql rename dbt/include/global_project/macros/materializations/incremental/bigquery_incremental.sql => plugins/bigquery/dbt/include/bigquery/macros/materializations/incremental.sql (100%) create mode 100644 plugins/bigquery/dbt/include/bigquery/macros/materializations/merge.sql rename dbt/include/global_project/macros/materializations/seed/bigquery.sql => plugins/bigquery/dbt/include/bigquery/macros/materializations/seed.sql (100%) rename dbt/include/global_project/macros/materializations/table/bigquery_table.sql => plugins/bigquery/dbt/include/bigquery/macros/materializations/table.sql (100%) create mode 100644 plugins/bigquery/dbt/include/bigquery/macros/materializations/view.sql create mode 100644 plugins/bigquery/setup.py create mode 100644 plugins/postgres/dbt/__init__.py create mode 100644 plugins/postgres/dbt/adapters/__init__.py create mode 100644 plugins/postgres/dbt/adapters/postgres/__init__.py rename {dbt => plugins/postgres/dbt}/adapters/postgres/connections.py (100%) rename {dbt => plugins/postgres/dbt}/adapters/postgres/impl.py (100%) create mode 100644 plugins/postgres/dbt/include/__init__.py create mode 100644 plugins/postgres/dbt/include/postgres/__init__.py create mode 100644 plugins/postgres/dbt/include/postgres/dbt_project.yml rename dbt/include/global_project/macros/catalog/postgres_catalog.sql => plugins/postgres/dbt/include/postgres/macros/catalog.sql (100%) rename dbt/include/global_project/macros/relations/postgres_relations.sql => plugins/postgres/dbt/include/postgres/macros/relations.sql (100%) create mode 100644 plugins/postgres/setup.py create mode 100644 plugins/redshift/dbt/__init__.py create mode 100644 plugins/redshift/dbt/adapters/__init__.py create mode 100644 plugins/redshift/dbt/adapters/redshift/__init__.py rename {dbt => plugins/redshift/dbt}/adapters/redshift/connections.py (100%) rename {dbt => plugins/redshift/dbt}/adapters/redshift/impl.py (100%) create mode 100644 plugins/redshift/dbt/include/__init__.py create mode 100644 plugins/redshift/dbt/include/redshift/__init__.py create mode 100644 plugins/redshift/dbt/include/redshift/dbt_project.yml rename dbt/include/global_project/macros/adapters/redshift.sql => plugins/redshift/dbt/include/redshift/macros/adapters.sql (100%) rename dbt/include/global_project/macros/catalog/redshift_catalog.sql => plugins/redshift/dbt/include/redshift/macros/catalog.sql (100%) rename dbt/include/global_project/macros/relations/redshift_relations.sql => plugins/redshift/dbt/include/redshift/macros/relations.sql (100%) create mode 100644 plugins/redshift/setup.py create mode 100644 plugins/snowflake/dbt/__init__.py create mode 100644 plugins/snowflake/dbt/adapters/__init__.py rename {dbt => plugins/snowflake/dbt}/adapters/snowflake/__init__.py (55%) rename {dbt => plugins/snowflake/dbt}/adapters/snowflake/connections.py (100%) rename {dbt => plugins/snowflake/dbt}/adapters/snowflake/impl.py (100%) rename {dbt => plugins/snowflake/dbt}/adapters/snowflake/relation.py (100%) create mode 100644 plugins/snowflake/dbt/include/__init__.py create mode 100644 plugins/snowflake/dbt/include/snowflake/__init__.py create mode 100644 plugins/snowflake/dbt/include/snowflake/dbt_project.yml rename dbt/include/global_project/macros/adapters/snowflake.sql => plugins/snowflake/dbt/include/snowflake/macros/adapters.sql (100%) rename dbt/include/global_project/macros/catalog/snowflake_catalog.sql => plugins/snowflake/dbt/include/snowflake/macros/catalog.sql (100%) create mode 100644 plugins/snowflake/dbt/include/snowflake/macros/materializations/merge.sql rename dbt/include/global_project/macros/materializations/table/snowflake_table.sql => plugins/snowflake/dbt/include/snowflake/macros/materializations/table.sql (100%) create mode 100644 plugins/snowflake/dbt/include/snowflake/macros/materializations/view.sql create mode 100644 plugins/snowflake/setup.py diff --git a/.bumpversion.cfg b/.bumpversion.cfg index f04d1e92cfa..00c2666d1f2 100644 --- a/.bumpversion.cfg +++ b/.bumpversion.cfg @@ -1,5 +1,5 @@ [bumpversion] -current_version = 0.12.2rc1 +current_version = 0.13.0a1 parse = (?P\d+) \.(?P\d+) \.(?P\d+) @@ -20,7 +20,15 @@ values = [bumpversion:part:num] first_value = 1 -[bumpversion:file:setup.py] +[bumpversion:file:core/setup.py] -[bumpversion:file:dbt/version.py] +[bumpversion:file:core/dbt/version.py] + +[bumpversion:file:plugins/postgres/setup.py] + +[bumpversion:file:plugins/redshift/setup.py] + +[bumpversion:file:plugins/snowflake/setup.py] + +[bumpversion:file:plugins/bigquery/setup.py] diff --git a/.coveragerc b/.coveragerc index 23cf94ed431..18244411816 100644 --- a/.coveragerc +++ b/.coveragerc @@ -1,3 +1,4 @@ [report] include = - dbt/* + core/dbt/* + plugins/adapters/dbt/* diff --git a/CHANGELOG.md b/core/CHANGELOG.md similarity index 100% rename from CHANGELOG.md rename to core/CHANGELOG.md diff --git a/CONTRIBUTING.md b/core/CONTRIBUTING.md similarity index 100% rename from CONTRIBUTING.md rename to core/CONTRIBUTING.md diff --git a/License.md b/core/License.md similarity index 100% rename from License.md rename to core/License.md diff --git a/MANIFEST.in b/core/MANIFEST.in similarity index 100% rename from MANIFEST.in rename to core/MANIFEST.in diff --git a/README.md b/core/README.md similarity index 100% rename from README.md rename to core/README.md diff --git a/core/dbt/__init__.py b/core/dbt/__init__.py new file mode 100644 index 00000000000..69e3be50dac --- /dev/null +++ b/core/dbt/__init__.py @@ -0,0 +1 @@ +__path__ = __import__('pkgutil').extend_path(__path__, __name__) diff --git a/core/dbt/adapters/__init__.py b/core/dbt/adapters/__init__.py new file mode 100644 index 00000000000..69e3be50dac --- /dev/null +++ b/core/dbt/adapters/__init__.py @@ -0,0 +1 @@ +__path__ = __import__('pkgutil').extend_path(__path__, __name__) diff --git a/dbt/adapters/base/__init__.py b/core/dbt/adapters/base/__init__.py similarity index 81% rename from dbt/adapters/base/__init__.py rename to core/dbt/adapters/base/__init__.py index a509f6b0ed9..98f96abe1b4 100644 --- a/dbt/adapters/base/__init__.py +++ b/core/dbt/adapters/base/__init__.py @@ -2,3 +2,4 @@ from dbt.adapters.base.relation import BaseRelation from dbt.adapters.base.connections import BaseConnectionManager, Credentials from dbt.adapters.base.impl import BaseAdapter +from dbt.adapters.base.plugin import AdapterPlugin diff --git a/dbt/adapters/base/connections.py b/core/dbt/adapters/base/connections.py similarity index 100% rename from dbt/adapters/base/connections.py rename to core/dbt/adapters/base/connections.py diff --git a/dbt/adapters/base/impl.py b/core/dbt/adapters/base/impl.py similarity index 100% rename from dbt/adapters/base/impl.py rename to core/dbt/adapters/base/impl.py diff --git a/dbt/adapters/base/meta.py b/core/dbt/adapters/base/meta.py similarity index 100% rename from dbt/adapters/base/meta.py rename to core/dbt/adapters/base/meta.py diff --git a/core/dbt/adapters/base/plugin.py b/core/dbt/adapters/base/plugin.py new file mode 100644 index 00000000000..242bc681b8a --- /dev/null +++ b/core/dbt/adapters/base/plugin.py @@ -0,0 +1,26 @@ +import os + +from dbt.config.project import Project + + +class AdapterPlugin(object): + """Defines the basic requirements for a dbt adapter plugin. + + :param type adapter: An adapter class, derived from BaseAdapter + :param type credentials: A credentials object, derived from Credentials + :param str project_name: The name of this adapter plugin's associated dbt + project. + :param str include_path: The path to this adapter plugin's root + :param Optional[List[str]] dependencies: A list of adapter names that this\ + adapter depends upon. + """ + def __init__(self, adapter, credentials, include_path, dependencies=None): + self.adapter = adapter + self.credentials = credentials + self.include_path = include_path + project_path = os.path.join(self.include_path, adapter.type()) + project = Project.from_project_root(project_path, {}) + self.project_name = project.project_name + if dependencies is None: + dependencies = [] + self.dependencies = dependencies diff --git a/dbt/adapters/base/relation.py b/core/dbt/adapters/base/relation.py similarity index 100% rename from dbt/adapters/base/relation.py rename to core/dbt/adapters/base/relation.py diff --git a/dbt/adapters/cache.py b/core/dbt/adapters/cache.py similarity index 100% rename from dbt/adapters/cache.py rename to core/dbt/adapters/cache.py diff --git a/dbt/adapters/factory.py b/core/dbt/adapters/factory.py similarity index 81% rename from dbt/adapters/factory.py rename to core/dbt/adapters/factory.py index bef5e66dfa3..f3145c690f1 100644 --- a/dbt/adapters/factory.py +++ b/core/dbt/adapters/factory.py @@ -2,10 +2,10 @@ import dbt.exceptions from importlib import import_module +from dbt.include.global_project import PACKAGES import threading - ADAPTER_TYPES = {} _ADAPTERS = {} @@ -28,25 +28,31 @@ def get_relation_class_by_name(adapter_name): return adapter.Relation -def load_adapter(adapter_name): - """Load an adapter package with the class of adapter_name, put it in the - ADAPTER_TYPES dict, and return its associated Credentials - """ +def load_plugin(adapter_name): try: mod = import_module('.'+adapter_name, 'dbt.adapters') except ImportError: raise dbt.exceptions.RuntimeException( "Could not find adapter type {}!".format(adapter_name) ) - if mod.Adapter.type() != adapter_name: + plugin = mod.Plugin + + if plugin.adapter.type() != adapter_name: raise dbt.exceptions.RuntimeException( 'Expected to find adapter with type named {}, got adapter with ' 'type {}' - .format(adapter_name, mod.Adapter.type()) + .format(adapter_name, plugin.adapter.type()) ) - ADAPTER_TYPES[adapter_name] = mod.Adapter - return mod.Credentials + with _ADAPTER_LOCK: + ADAPTER_TYPES[adapter_name] = plugin.adapter + + PACKAGES[plugin.project_name] = plugin.include_path + + for dep in plugin.dependencies: + load_plugin(dep) + + return plugin.credentials def get_adapter(config): diff --git a/dbt/adapters/sql/__init__.py b/core/dbt/adapters/sql/__init__.py similarity index 100% rename from dbt/adapters/sql/__init__.py rename to core/dbt/adapters/sql/__init__.py diff --git a/dbt/adapters/sql/connections.py b/core/dbt/adapters/sql/connections.py similarity index 100% rename from dbt/adapters/sql/connections.py rename to core/dbt/adapters/sql/connections.py diff --git a/dbt/adapters/sql/impl.py b/core/dbt/adapters/sql/impl.py similarity index 100% rename from dbt/adapters/sql/impl.py rename to core/dbt/adapters/sql/impl.py diff --git a/dbt/api/__init__.py b/core/dbt/api/__init__.py similarity index 100% rename from dbt/api/__init__.py rename to core/dbt/api/__init__.py diff --git a/dbt/api/object.py b/core/dbt/api/object.py similarity index 100% rename from dbt/api/object.py rename to core/dbt/api/object.py diff --git a/dbt/__init__.py b/core/dbt/clients/__init__.py similarity index 100% rename from dbt/__init__.py rename to core/dbt/clients/__init__.py diff --git a/dbt/clients/agate_helper.py b/core/dbt/clients/agate_helper.py similarity index 100% rename from dbt/clients/agate_helper.py rename to core/dbt/clients/agate_helper.py diff --git a/dbt/clients/gcloud.py b/core/dbt/clients/gcloud.py similarity index 100% rename from dbt/clients/gcloud.py rename to core/dbt/clients/gcloud.py diff --git a/dbt/clients/git.py b/core/dbt/clients/git.py similarity index 100% rename from dbt/clients/git.py rename to core/dbt/clients/git.py diff --git a/dbt/clients/jinja.py b/core/dbt/clients/jinja.py similarity index 100% rename from dbt/clients/jinja.py rename to core/dbt/clients/jinja.py diff --git a/dbt/clients/registry.py b/core/dbt/clients/registry.py similarity index 100% rename from dbt/clients/registry.py rename to core/dbt/clients/registry.py diff --git a/dbt/clients/system.py b/core/dbt/clients/system.py similarity index 100% rename from dbt/clients/system.py rename to core/dbt/clients/system.py diff --git a/dbt/clients/yaml_helper.py b/core/dbt/clients/yaml_helper.py similarity index 100% rename from dbt/clients/yaml_helper.py rename to core/dbt/clients/yaml_helper.py diff --git a/dbt/compat.py b/core/dbt/compat.py similarity index 100% rename from dbt/compat.py rename to core/dbt/compat.py diff --git a/dbt/compilation.py b/core/dbt/compilation.py similarity index 100% rename from dbt/compilation.py rename to core/dbt/compilation.py diff --git a/core/dbt/config/__init__.py b/core/dbt/config/__init__.py new file mode 100644 index 00000000000..b5280511ef7 --- /dev/null +++ b/core/dbt/config/__init__.py @@ -0,0 +1,22 @@ + +from .renderer import ConfigRenderer +from .profile import Profile, UserConfig +from .project import Project +from .profile import read_profile +from .profile import PROFILES_DIR +from .runtime import RuntimeConfig + + +def read_profiles(profiles_dir=None): + """This is only used in main, for some error handling""" + if profiles_dir is None: + profiles_dir = PROFILES_DIR + + raw_profiles = read_profile(profiles_dir) + + if raw_profiles is None: + profiles = {} + else: + profiles = {k: v for (k, v) in raw_profiles.items() if k != 'config'} + + return profiles diff --git a/core/dbt/config/profile.py b/core/dbt/config/profile.py new file mode 100644 index 00000000000..bb5c91cc246 --- /dev/null +++ b/core/dbt/config/profile.py @@ -0,0 +1,370 @@ +import os +import pprint + +from dbt.adapters.factory import load_plugin +from dbt.clients.system import load_file_contents +from dbt.clients.yaml_helper import load_yaml_text +from dbt.contracts.project import ProfileConfig +from dbt.exceptions import DbtProfileError +from dbt.exceptions import DbtProjectError +from dbt.exceptions import ValidationException +from dbt.exceptions import RuntimeException +from dbt.logger import GLOBAL_LOGGER as logger +from dbt.utils import parse_cli_vars + +from .renderer import ConfigRenderer + +DEFAULT_THREADS = 1 +DEFAULT_SEND_ANONYMOUS_USAGE_STATS = True +DEFAULT_USE_COLORS = True +DEFAULT_PROFILES_DIR = os.path.join(os.path.expanduser('~'), '.dbt') +PROFILES_DIR = os.path.expanduser( + os.environ.get('DBT_PROFILES_DIR', DEFAULT_PROFILES_DIR) +) + +INVALID_PROFILE_MESSAGE = """ +dbt encountered an error while trying to read your profiles.yml file. + +{error_string} +""" + + +NO_SUPPLIED_PROFILE_ERROR = """\ +dbt cannot run because no profile was specified for this dbt project. +To specify a profile for this project, add a line like the this to +your dbt_project.yml file: + +profile: [profile name] + +Here, [profile name] should be replaced with a profile name +defined in your profiles.yml file. You can find profiles.yml here: + +{profiles_file}/profiles.yml +""".format(profiles_file=PROFILES_DIR) + + +def read_profile(profiles_dir): + path = os.path.join(profiles_dir, 'profiles.yml') + + contents = None + if os.path.isfile(path): + try: + contents = load_file_contents(path, strip=False) + return load_yaml_text(contents) + except ValidationException as e: + msg = INVALID_PROFILE_MESSAGE.format(error_string=e) + raise ValidationException(msg) + + return {} + + +class UserConfig(object): + def __init__(self, send_anonymous_usage_stats, use_colors): + self.send_anonymous_usage_stats = send_anonymous_usage_stats + self.use_colors = use_colors + + @classmethod + def from_dict(cls, cfg=None): + if cfg is None: + cfg = {} + send_anonymous_usage_stats = cfg.get( + 'send_anonymous_usage_stats', + DEFAULT_SEND_ANONYMOUS_USAGE_STATS + ) + use_colors = cfg.get( + 'use_colors', + DEFAULT_USE_COLORS + ) + return cls(send_anonymous_usage_stats, use_colors) + + def to_dict(self): + return { + 'send_anonymous_usage_stats': self.send_anonymous_usage_stats, + 'use_colors': self.use_colors, + } + + @classmethod + def from_directory(cls, directory): + user_cfg = None + profile = read_profile(directory) + if profile: + user_cfg = profile.get('config', {}) + return cls.from_dict(user_cfg) + + +class Profile(object): + def __init__(self, profile_name, target_name, config, threads, + credentials): + self.profile_name = profile_name + self.target_name = target_name + if isinstance(config, dict): + config = UserConfig.from_dict(config) + self.config = config + self.threads = threads + self.credentials = credentials + + def to_profile_info(self, serialize_credentials=False): + """Unlike to_project_config, this dict is not a mirror of any existing + on-disk data structure. It's used when creating a new profile from an + existing one. + + :param serialize_credentials bool: If True, serialize the credentials. + Otherwise, the Credentials object will be copied. + :returns dict: The serialized profile. + """ + result = { + 'profile_name': self.profile_name, + 'target_name': self.target_name, + 'config': self.config.to_dict(), + 'threads': self.threads, + 'credentials': self.credentials.incorporate(), + } + if serialize_credentials: + result['credentials'] = result['credentials'].serialize() + return result + + def __str__(self): + return pprint.pformat(self.to_profile_info()) + + def __eq__(self, other): + if not (isinstance(other, self.__class__) and + isinstance(self, other.__class__)): + return False + return False + return self.to_profile_info() == other.to_profile_info() + + def validate(self): + if self.credentials: + self.credentials.validate() + try: + ProfileConfig(**self.to_profile_info(serialize_credentials=True)) + except ValidationException as exc: + raise DbtProfileError(str(exc)) + + @staticmethod + def _credentials_from_profile(profile, profile_name, target_name): + # credentials carry their 'type' in their actual type, not their + # attributes. We do want this in order to pick our Credentials class. + if 'type' not in profile: + raise DbtProfileError( + 'required field "type" not found in profile {} and target {}' + .format(profile_name, target_name)) + + typename = profile.pop('type') + + try: + cls = load_plugin(typename) + credentials = cls(**profile) + except RuntimeException as e: + raise DbtProfileError( + 'Credentials in profile "{}", target "{}" invalid: {}' + .format(profile_name, target_name, str(e)) + ) + return credentials + + @staticmethod + def pick_profile_name(args_profile_name, project_profile_name=None): + profile_name = project_profile_name + if args_profile_name is not None: + profile_name = args_profile_name + if profile_name is None: + raise DbtProjectError(NO_SUPPLIED_PROFILE_ERROR) + return profile_name + + @staticmethod + def _get_profile_data(profile, profile_name, target_name): + if 'outputs' not in profile: + raise DbtProfileError( + "outputs not specified in profile '{}'".format(profile_name) + ) + outputs = profile['outputs'] + + if target_name not in outputs: + outputs = '\n'.join(' - {}'.format(output) + for output in outputs) + msg = ("The profile '{}' does not have a target named '{}'. The " + "valid target names for this profile are:\n{}" + .format(profile_name, target_name, outputs)) + raise DbtProfileError(msg, result_type='invalid_target') + profile_data = outputs[target_name] + return profile_data + + @classmethod + def from_credentials(cls, credentials, threads, profile_name, target_name, + user_cfg=None): + """Create a profile from an existing set of Credentials and the + remaining information. + + :param credentials dict: The credentials dict for this profile. + :param threads int: The number of threads to use for connections. + :param profile_name str: The profile name used for this profile. + :param target_name str: The target name used for this profile. + :param user_cfg Optional[dict]: The user-level config block from the + raw profiles, if specified. + :raises DbtProfileError: If the profile is invalid. + :returns Profile: The new Profile object. + """ + config = UserConfig.from_dict(user_cfg) + profile = cls( + profile_name=profile_name, + target_name=target_name, + config=config, + threads=threads, + credentials=credentials + ) + profile.validate() + return profile + + @classmethod + def render_profile(cls, raw_profile, profile_name, target_override, + cli_vars): + """This is a containment zone for the hateful way we're rendering + profiles. + """ + renderer = ConfigRenderer(cli_vars=cli_vars) + + # rendering profiles is a bit complex. Two constraints cause trouble: + # 1) users should be able to use environment/cli variables to specify + # the target in their profile. + # 2) Missing environment/cli variables in profiles/targets that don't + # end up getting selected should not cause errors. + # so first we'll just render the target name, then we use that rendered + # name to extract a profile that we can render. + if target_override is not None: + target_name = target_override + elif 'target' in raw_profile: + # render the target if it was parsed from yaml + target_name = renderer.render_value(raw_profile['target']) + else: + target_name = 'default' + logger.debug( + "target not specified in profile '{}', using '{}'" + .format(profile_name, target_name) + ) + + raw_profile_data = cls._get_profile_data( + raw_profile, profile_name, target_name + ) + + profile_data = renderer.render_profile_data(raw_profile_data) + return target_name, profile_data + + @classmethod + def from_raw_profile_info(cls, raw_profile, profile_name, cli_vars, + user_cfg=None, target_override=None, + threads_override=None): + """Create a profile from its raw profile information. + + (this is an intermediate step, mostly useful for unit testing) + + :param raw_profile dict: The profile data for a single profile, from + disk as yaml and its values rendered with jinja. + :param profile_name str: The profile name used. + :param cli_vars dict: The command-line variables passed as arguments, + as a dict. + :param user_cfg Optional[dict]: The global config for the user, if it + was present. + :param target_override Optional[str]: The target to use, if provided on + the command line. + :param threads_override Optional[str]: The thread count to use, if + provided on the command line. + :raises DbtProfileError: If the profile is invalid or missing, or the + target could not be found + :returns Profile: The new Profile object. + """ + # user_cfg is not rendered since it only contains booleans. + # TODO: should it be, and the values coerced to bool? + target_name, profile_data = cls.render_profile( + raw_profile, profile_name, target_override, cli_vars + ) + + # valid connections never include the number of threads, but it's + # stored on a per-connection level in the raw configs + threads = profile_data.pop('threads', DEFAULT_THREADS) + if threads_override is not None: + threads = threads_override + + credentials = cls._credentials_from_profile( + profile_data, profile_name, target_name + ) + + return cls.from_credentials( + credentials=credentials, + profile_name=profile_name, + target_name=target_name, + threads=threads, + user_cfg=user_cfg + ) + + @classmethod + def from_raw_profiles(cls, raw_profiles, profile_name, cli_vars, + target_override=None, threads_override=None): + """ + :param raw_profiles dict: The profile data, from disk as yaml. + :param profile_name str: The profile name to use. + :param cli_vars dict: The command-line variables passed as arguments, + as a dict. + :param target_override Optional[str]: The target to use, if provided on + the command line. + :param threads_override Optional[str]: The thread count to use, if + provided on the command line. + :raises DbtProjectError: If there is no profile name specified in the + project or the command line arguments + :raises DbtProfileError: If the profile is invalid or missing, or the + target could not be found + :returns Profile: The new Profile object. + """ + if profile_name not in raw_profiles: + raise DbtProjectError( + "Could not find profile named '{}'".format(profile_name) + ) + + # First, we've already got our final decision on profile name, and we + # don't render keys, so we can pluck that out + raw_profile = raw_profiles[profile_name] + + user_cfg = raw_profiles.get('config') + + return cls.from_raw_profile_info( + raw_profile=raw_profile, + profile_name=profile_name, + cli_vars=cli_vars, + user_cfg=user_cfg, + target_override=target_override, + threads_override=threads_override, + ) + + @classmethod + def from_args(cls, args, project_profile_name=None, cli_vars=None): + """Given the raw profiles as read from disk and the name of the desired + profile if specified, return the profile component of the runtime + config. + + :param args argparse.Namespace: The arguments as parsed from the cli. + :param cli_vars dict: The command-line variables passed as arguments, + as a dict. + :param project_profile_name Optional[str]: The profile name, if + specified in a project. + :raises DbtProjectError: If there is no profile name specified in the + project or the command line arguments, or if the specified profile + is not found + :raises DbtProfileError: If the profile is invalid or missing, or the + target could not be found. + :returns Profile: The new Profile object. + """ + if cli_vars is None: + cli_vars = parse_cli_vars(getattr(args, 'vars', '{}')) + + threads_override = getattr(args, 'threads', None) + target_override = getattr(args, 'target', None) + raw_profiles = read_profile(args.profiles_dir) + profile_name = cls.pick_profile_name(args.profile, + project_profile_name) + + return cls.from_raw_profiles( + raw_profiles=raw_profiles, + profile_name=profile_name, + cli_vars=cli_vars, + target_override=target_override, + threads_override=threads_override + ) diff --git a/core/dbt/config/project.py b/core/dbt/config/project.py new file mode 100644 index 00000000000..8366755ef89 --- /dev/null +++ b/core/dbt/config/project.py @@ -0,0 +1,442 @@ + +from copy import deepcopy +import hashlib +import os +import pprint + +from dbt import compat +from dbt.clients.system import resolve_path_from_base +from dbt.clients.system import path_exists +from dbt.clients.system import load_file_contents +from dbt.clients.yaml_helper import load_yaml_text +from dbt.exceptions import DbtProjectError +from dbt.exceptions import RecursionException +from dbt.exceptions import SemverException +from dbt.exceptions import ValidationException +from dbt.logger import GLOBAL_LOGGER as logger +from dbt.semver import VersionSpecifier +from dbt.semver import versions_compatible +from dbt.version import get_installed_version +from dbt.ui import printer +from dbt.utils import deep_map +from dbt.utils import parse_cli_vars +from dbt.utils import DBTConfigKeys + +from dbt.contracts.project import Project as ProjectContract +from dbt.contracts.project import PackageConfig + +from .renderer import ConfigRenderer + + +UNUSED_RESOURCE_CONFIGURATION_PATH_MESSAGE = """\ +WARNING: Configuration paths exist in your dbt_project.yml file which do not \ +apply to any resources. +There are {} unused configuration paths:\n{} +""" + + +INVALID_VERSION_ERROR = """\ +This version of dbt is not supported with the '{package}' package. + Installed version of dbt: {installed} + Required version of dbt for '{package}': {version_spec} +Check the requirements for the '{package}' package, or run dbt again with \ +--no-version-check +""" + + +IMPOSSIBLE_VERSION_ERROR = """\ +The package version requirement can never be satisfied for the '{package} +package. + Required versions of dbt for '{package}': {version_spec} +Check the requirements for the '{package}' package, or run dbt again with \ +--no-version-check +""" + + +def _list_if_none(value): + if value is None: + value = [] + return value + + +def _dict_if_none(value): + if value is None: + value = {} + return value + + +def _list_if_none_or_string(value): + value = _list_if_none(value) + if isinstance(value, compat.basestring): + return [value] + return value + + +def _load_yaml(path): + contents = load_file_contents(path) + return load_yaml_text(contents) + + +def _get_config_paths(config, path=(), paths=None): + if paths is None: + paths = set() + + for key, value in config.items(): + if isinstance(value, dict): + if key in DBTConfigKeys: + if path not in paths: + paths.add(path) + else: + _get_config_paths(value, path + (key,), paths) + else: + if path not in paths: + paths.add(path) + + return frozenset(paths) + + +def _is_config_used(path, fqns): + if fqns: + for fqn in fqns: + if len(path) <= len(fqn) and fqn[:len(path)] == path: + return True + return False + + +def package_data_from_root(project_root): + package_filepath = resolve_path_from_base( + 'packages.yml', project_root + ) + + if path_exists(package_filepath): + packages_dict = _load_yaml(package_filepath) + else: + packages_dict = None + return packages_dict + + +def package_config_from_data(packages_data): + if packages_data is None: + packages_data = {'packages': []} + + try: + packages = PackageConfig(**packages_data) + except ValidationException as e: + raise DbtProjectError('Invalid package config: {}'.format(str(e))) + return packages + + +def _parse_versions(versions): + """Parse multiple versions as read from disk. The versions value may be any + one of: + - a single version string ('>0.12.1') + - a single string specifying multiple comma-separated versions + ('>0.11.1,<=0.12.2') + - an array of single-version strings (['>0.11.1', '<=0.12.2']) + + Regardless, this will return a list of VersionSpecifiers + """ + if isinstance(versions, compat.basestring): + versions = versions.split(',') + return [VersionSpecifier.from_version_string(v) for v in versions] + + +class Project(object): + def __init__(self, project_name, version, project_root, profile_name, + source_paths, macro_paths, data_paths, test_paths, + analysis_paths, docs_paths, target_path, clean_targets, + log_path, modules_path, quoting, models, on_run_start, + on_run_end, archive, seeds, dbt_version, packages): + self.project_name = project_name + self.version = version + self.project_root = project_root + self.profile_name = profile_name + self.source_paths = source_paths + self.macro_paths = macro_paths + self.data_paths = data_paths + self.test_paths = test_paths + self.analysis_paths = analysis_paths + self.docs_paths = docs_paths + self.target_path = target_path + self.clean_targets = clean_targets + self.log_path = log_path + self.modules_path = modules_path + self.quoting = quoting + self.models = models + self.on_run_start = on_run_start + self.on_run_end = on_run_end + self.archive = archive + self.seeds = seeds + self.dbt_version = dbt_version + self.packages = packages + + @staticmethod + def _preprocess(project_dict): + """Pre-process certain special keys to convert them from None values + into empty containers, and to turn strings into arrays of strings. + """ + handlers = { + ('archive',): _list_if_none, + ('on-run-start',): _list_if_none_or_string, + ('on-run-end',): _list_if_none_or_string, + } + + for k in ('models', 'seeds'): + handlers[(k,)] = _dict_if_none + handlers[(k, 'vars')] = _dict_if_none + handlers[(k, 'pre-hook')] = _list_if_none_or_string + handlers[(k, 'post-hook')] = _list_if_none_or_string + handlers[('seeds', 'column_types')] = _dict_if_none + + def converter(value, keypath): + if keypath in handlers: + handler = handlers[keypath] + return handler(value) + else: + return value + + return deep_map(converter, project_dict) + + @classmethod + def from_project_config(cls, project_dict, packages_dict=None): + """Create a project from its project and package configuration, as read + by yaml.safe_load(). + + :param project_dict dict: The dictionary as read from disk + :param packages_dict Optional[dict]: If it exists, the packages file as + read from disk. + :raises DbtProjectError: If the project is missing or invalid, or if + the packages file exists and is invalid. + :returns Project: The project, with defaults populated. + """ + try: + project_dict = cls._preprocess(project_dict) + except RecursionException: + raise DbtProjectError( + 'Cycle detected: Project input has a reference to itself', + project=project_dict + ) + # just for validation. + try: + ProjectContract(**project_dict) + except ValidationException as e: + raise DbtProjectError(str(e)) + + # name/version are required in the Project definition, so we can assume + # they are present + name = project_dict['name'] + version = project_dict['version'] + # this is added at project_dict parse time and should always be here + # once we see it. + project_root = project_dict['project-root'] + # this is only optional in the sense that if it's not present, it needs + # to have been a cli argument. + profile_name = project_dict.get('profile') + # these are optional + source_paths = project_dict.get('source-paths', ['models']) + macro_paths = project_dict.get('macro-paths', ['macros']) + data_paths = project_dict.get('data-paths', ['data']) + test_paths = project_dict.get('test-paths', ['test']) + analysis_paths = project_dict.get('analysis-paths', []) + docs_paths = project_dict.get('docs-paths', source_paths[:]) + target_path = project_dict.get('target-path', 'target') + # should this also include the modules path by default? + clean_targets = project_dict.get('clean-targets', [target_path]) + log_path = project_dict.get('log-path', 'logs') + modules_path = project_dict.get('modules-path', 'dbt_modules') + # in the default case we'll populate this once we know the adapter type + quoting = project_dict.get('quoting', {}) + + models = project_dict.get('models', {}) + on_run_start = project_dict.get('on-run-start', []) + on_run_end = project_dict.get('on-run-end', []) + archive = project_dict.get('archive', []) + seeds = project_dict.get('seeds', {}) + dbt_raw_version = project_dict.get('require-dbt-version', '>=0.0.0') + + try: + dbt_version = _parse_versions(dbt_raw_version) + except SemverException as e: + raise DbtProjectError(str(e)) + + packages = package_config_from_data(packages_dict) + + project = cls( + project_name=name, + version=version, + project_root=project_root, + profile_name=profile_name, + source_paths=source_paths, + macro_paths=macro_paths, + data_paths=data_paths, + test_paths=test_paths, + analysis_paths=analysis_paths, + docs_paths=docs_paths, + target_path=target_path, + clean_targets=clean_targets, + log_path=log_path, + modules_path=modules_path, + quoting=quoting, + models=models, + on_run_start=on_run_start, + on_run_end=on_run_end, + archive=archive, + seeds=seeds, + dbt_version=dbt_version, + packages=packages + ) + # sanity check - this means an internal issue + project.validate() + return project + + def __str__(self): + cfg = self.to_project_config(with_packages=True) + return pprint.pformat(cfg) + + def __eq__(self, other): + if not (isinstance(other, self.__class__) and + isinstance(self, other.__class__)): + return False + return self.to_project_config(with_packages=True) == \ + other.to_project_config(with_packages=True) + + def to_project_config(self, with_packages=False): + """Return a dict representation of the config that could be written to + disk with `yaml.safe_dump` to get this configuration. + + :param with_packages bool: If True, include the serialized packages + file in the root. + :returns dict: The serialized profile. + """ + result = deepcopy({ + 'name': self.project_name, + 'version': self.version, + 'project-root': self.project_root, + 'profile': self.profile_name, + 'source-paths': self.source_paths, + 'macro-paths': self.macro_paths, + 'data-paths': self.data_paths, + 'test-paths': self.test_paths, + 'analysis-paths': self.analysis_paths, + 'docs-paths': self.docs_paths, + 'target-path': self.target_path, + 'clean-targets': self.clean_targets, + 'log-path': self.log_path, + 'quoting': self.quoting, + 'models': self.models, + 'on-run-start': self.on_run_start, + 'on-run-end': self.on_run_end, + 'archive': self.archive, + 'seeds': self.seeds, + 'require-dbt-version': [ + v.to_version_string() for v in self.dbt_version + ], + }) + if with_packages: + result.update(self.packages.serialize()) + return result + + def validate(self): + try: + ProjectContract(**self.to_project_config()) + except ValidationException as exc: + raise DbtProjectError(str(exc)) + + @classmethod + def from_project_root(cls, project_root, cli_vars): + """Create a project from a root directory. Reads in dbt_project.yml and + packages.yml, if it exists. + + :param project_root str: The path to the project root to load. + :raises DbtProjectError: If the project is missing or invalid, or if + the packages file exists and is invalid. + :returns Project: The project, with defaults populated. + """ + project_root = os.path.normpath(project_root) + project_yaml_filepath = os.path.join(project_root, 'dbt_project.yml') + + # get the project.yml contents + if not path_exists(project_yaml_filepath): + raise DbtProjectError( + 'no dbt_project.yml found at expected path {}' + .format(project_yaml_filepath) + ) + + if isinstance(cli_vars, compat.basestring): + cli_vars = parse_cli_vars(cli_vars) + renderer = ConfigRenderer(cli_vars) + + project_dict = _load_yaml(project_yaml_filepath) + rendered_project = renderer.render_project(project_dict) + rendered_project['project-root'] = project_root + packages_dict = package_data_from_root(project_root) + return cls.from_project_config(rendered_project, packages_dict) + + @classmethod + def from_current_directory(cls, cli_vars): + return cls.from_project_root(os.getcwd(), cli_vars) + + def hashed_name(self): + return hashlib.md5(self.project_name.encode('utf-8')).hexdigest() + + def get_resource_config_paths(self): + """Return a dictionary with 'seeds' and 'models' keys whose values are + lists of lists of strings, where each inner list of strings represents + a configured path in the resource. + """ + return { + 'models': _get_config_paths(self.models), + 'seeds': _get_config_paths(self.seeds), + } + + def get_unused_resource_config_paths(self, resource_fqns, disabled): + """Return a list of lists of strings, where each inner list of strings + represents a type + FQN path of a resource configuration that is not + used. + """ + disabled_fqns = frozenset(tuple(fqn) for fqn in disabled) + resource_config_paths = self.get_resource_config_paths() + unused_resource_config_paths = [] + for resource_type, config_paths in resource_config_paths.items(): + used_fqns = resource_fqns.get(resource_type, frozenset()) + fqns = used_fqns | disabled_fqns + + for config_path in config_paths: + if not _is_config_used(config_path, fqns): + unused_resource_config_paths.append( + (resource_type,) + config_path + ) + return unused_resource_config_paths + + def warn_for_unused_resource_config_paths(self, resource_fqns, disabled): + unused = self.get_unused_resource_config_paths(resource_fqns, disabled) + if len(unused) == 0: + return + + msg = UNUSED_RESOURCE_CONFIGURATION_PATH_MESSAGE.format( + len(unused), + '\n'.join('- {}'.format('.'.join(u)) for u in unused) + ) + logger.info(printer.yellow(msg)) + + def validate_version(self): + """Ensure this package works with the installed version of dbt.""" + installed = get_installed_version() + if not versions_compatible(*self.dbt_version): + msg = IMPOSSIBLE_VERSION_ERROR.format( + package=self.project_name, + version_spec=[ + x.to_version_string() for x in self.dbt_version + ] + ) + raise DbtProjectError(msg) + + if not versions_compatible(installed, *self.dbt_version): + msg = INVALID_VERSION_ERROR.format( + package=self.project_name, + installed=installed.to_version_string(), + version_spec=[ + x.to_version_string() for x in self.dbt_version + ] + ) + raise DbtProjectError(msg) diff --git a/core/dbt/config/renderer.py b/core/dbt/config/renderer.py new file mode 100644 index 00000000000..35c66ae880a --- /dev/null +++ b/core/dbt/config/renderer.py @@ -0,0 +1,95 @@ +from dbt import compat +from dbt.clients.jinja import get_rendered +from dbt.context.common import env_var +from dbt.context.common import Var +from dbt.exceptions import DbtProfileError +from dbt.exceptions import DbtProjectError +from dbt.exceptions import RecursionException +from dbt.utils import deep_map + + +class ConfigRenderer(object): + """A renderer provides configuration rendering for a given set of cli + variables and a render type. + """ + def __init__(self, cli_vars): + self.context = {'env_var': env_var} + self.context['var'] = Var(None, self.context, cli_vars) + + @staticmethod + def _is_hook_or_model_vars_path(keypath): + if not keypath: + return False + + first = keypath[0] + # run hooks + if first in {'on-run-start', 'on-run-end'}: + return True + # models have two things to avoid + if first in {'seeds', 'models'}: + # model-level hooks + if 'pre-hook' in keypath or 'post-hook' in keypath: + return True + # model-level 'vars' declarations + if 'vars' in keypath: + return True + + return False + + def _render_project_entry(self, value, keypath): + """Render an entry, in case it's jinja. This is meant to be passed to + deep_map. + + If the parsed entry is a string and has the name 'port', this will + attempt to cast it to an int, and on failure will return the parsed + string. + + :param value Any: The value to potentially render + :param key str: The key to convert on. + :return Any: The rendered entry. + """ + # hooks should be treated as raw sql, they'll get rendered later. + # Same goes for 'vars' declarations inside 'models'/'seeds'. + if self._is_hook_or_model_vars_path(keypath): + return value + + return self.render_value(value) + + def render_value(self, value, keypath=None): + # keypath is ignored. + # if it wasn't read as a string, ignore it + if not isinstance(value, compat.basestring): + return value + + return get_rendered(value, self.context) + + def _render_profile_data(self, value, keypath): + result = self.render_value(value) + if len(keypath) == 1 and keypath[-1] == 'port': + try: + result = int(result) + except ValueError: + # let the validator or connection handle this + pass + return result + + def render_project(self, as_parsed): + """Render the parsed data, returning a new dict (or whatever was read). + """ + try: + return deep_map(self._render_project_entry, as_parsed) + except RecursionException: + raise DbtProjectError( + 'Cycle detected: Project input has a reference to itself', + project=as_parsed + ) + + def render_profile_data(self, as_parsed): + """Render the chosen profile entry, as it was parsed.""" + try: + return deep_map(self._render_profile_data, as_parsed) + except RecursionException: + raise DbtProfileError( + 'Cycle detected: Profile input has a reference to itself', + project=as_parsed + ) diff --git a/core/dbt/config/runtime.py b/core/dbt/config/runtime.py new file mode 100644 index 00000000000..ee654474a5b --- /dev/null +++ b/core/dbt/config/runtime.py @@ -0,0 +1,190 @@ + +from copy import deepcopy +import pprint + +from dbt.utils import parse_cli_vars +from dbt.contracts.project import Configuration +from dbt.exceptions import DbtProjectError +from dbt.exceptions import ValidationException +from dbt.adapters.factory import get_relation_class_by_name + +from .profile import Profile +from .project import Project + + +class RuntimeConfig(Project, Profile): + """The runtime configuration, as constructed from its components. There's a + lot because there is a lot of stuff! + """ + def __init__(self, project_name, version, project_root, source_paths, + macro_paths, data_paths, test_paths, analysis_paths, + docs_paths, target_path, clean_targets, log_path, + modules_path, quoting, models, on_run_start, on_run_end, + archive, seeds, dbt_version, profile_name, target_name, + config, threads, credentials, packages, args): + # 'vars' + self.args = args + self.cli_vars = parse_cli_vars(getattr(args, 'vars', '{}')) + # 'project' + Project.__init__( + self, + project_name=project_name, + version=version, + project_root=project_root, + profile_name=profile_name, + source_paths=source_paths, + macro_paths=macro_paths, + data_paths=data_paths, + test_paths=test_paths, + analysis_paths=analysis_paths, + docs_paths=docs_paths, + target_path=target_path, + clean_targets=clean_targets, + log_path=log_path, + modules_path=modules_path, + quoting=quoting, + models=models, + on_run_start=on_run_start, + on_run_end=on_run_end, + archive=archive, + seeds=seeds, + dbt_version=dbt_version, + packages=packages + ) + # 'profile' + Profile.__init__( + self, + profile_name=profile_name, + target_name=target_name, + config=config, + threads=threads, + credentials=credentials + ) + self.validate() + + @classmethod + def from_parts(cls, project, profile, args): + """Instantiate a RuntimeConfig from its components. + + :param profile Profile: A parsed dbt Profile. + :param project Project: A parsed dbt Project. + :param args argparse.Namespace: The parsed command-line arguments. + :returns RuntimeConfig: The new configuration. + """ + quoting = deepcopy( + get_relation_class_by_name(profile.credentials.type) + .DEFAULTS['quote_policy'] + ) + quoting.update(project.quoting) + return cls( + project_name=project.project_name, + version=project.version, + project_root=project.project_root, + source_paths=project.source_paths, + macro_paths=project.macro_paths, + data_paths=project.data_paths, + test_paths=project.test_paths, + analysis_paths=project.analysis_paths, + docs_paths=project.docs_paths, + target_path=project.target_path, + clean_targets=project.clean_targets, + log_path=project.log_path, + modules_path=project.modules_path, + quoting=quoting, + models=project.models, + on_run_start=project.on_run_start, + on_run_end=project.on_run_end, + archive=project.archive, + seeds=project.seeds, + dbt_version=project.dbt_version, + packages=project.packages, + profile_name=profile.profile_name, + target_name=profile.target_name, + config=profile.config, + threads=profile.threads, + credentials=profile.credentials, + args=args + ) + + def new_project(self, project_root): + """Given a new project root, read in its project dictionary, supply the + existing project's profile info, and create a new project file. + + :param project_root str: A filepath to a dbt project. + :raises DbtProfileError: If the profile is invalid. + :raises DbtProjectError: If project is missing or invalid. + :returns RuntimeConfig: The new configuration. + """ + # copy profile + profile = Profile(**self.to_profile_info()) + profile.validate() + # load the new project and its packages. Don't pass cli variables. + project = Project.from_project_root(project_root, {}) + + cfg = self.from_parts( + project=project, + profile=profile, + args=deepcopy(self.args), + ) + # force our quoting back onto the new project. + cfg.quoting = deepcopy(self.quoting) + return cfg + + def serialize(self): + """Serialize the full configuration to a single dictionary. For any + instance that has passed validate() (which happens in __init__), it + matches the Configuration contract. + + Note that args are not serialized. + + :returns dict: The serialized configuration. + """ + result = self.to_project_config(with_packages=True) + result.update(self.to_profile_info(serialize_credentials=True)) + result['cli_vars'] = deepcopy(self.cli_vars) + return result + + def __str__(self): + return pprint.pformat(self.serialize()) + + def validate(self): + """Validate the configuration against its contract. + + :raises DbtProjectError: If the configuration fails validation. + """ + try: + Configuration(**self.serialize()) + except ValidationException as e: + raise DbtProjectError(str(e)) + + if getattr(self.args, 'version_check', False): + self.validate_version() + + @classmethod + def from_args(cls, args): + """Given arguments, read in dbt_project.yml from the current directory, + read in packages.yml if it exists, and use them to find the profile to + load. + + :param args argparse.Namespace: The arguments as parsed from the cli. + :raises DbtProjectError: If the project is invalid or missing. + :raises DbtProfileError: If the profile is invalid or missing. + :raises ValidationException: If the cli variables are invalid. + """ + cli_vars = parse_cli_vars(getattr(args, 'vars', '{}')) + + # build the project and read in packages.yml + project = Project.from_current_directory(cli_vars) + + # build the profile + profile = Profile.from_args( + args=args, + project_profile_name=project.profile_name, + cli_vars=cli_vars + ) + + return cls.from_parts( + project=project, + profile=profile, + args=args + ) diff --git a/dbt/adapters/__init__.py b/core/dbt/context/__init__.py similarity index 100% rename from dbt/adapters/__init__.py rename to core/dbt/context/__init__.py diff --git a/dbt/context/common.py b/core/dbt/context/common.py similarity index 95% rename from dbt/context/common.py rename to core/dbt/context/common.py index d55e43d049d..61b7aeab66d 100644 --- a/dbt/context/common.py +++ b/core/dbt/context/common.py @@ -7,6 +7,8 @@ from dbt.compat import basestring from dbt.node_types import NodeType from dbt.contracts.graph.parsed import ParsedMacro, ParsedNode +from dbt.include.global_project import PACKAGES +from dbt.include.global_project import PROJECT_NAME as GLOBAL_PROJECT_NAME import dbt.clients.jinja import dbt.clients.agate_helper @@ -84,6 +86,20 @@ def commit(self): return self.adapter.commit_if_has_connection(self.model.get('name')) +def _add_macro_map(context, package_name, macro_map): + """Update an existing context in-place, adding the given macro map to the + appropriate package namespace. Adapter packages get inserted into the + global namespace. + """ + key = package_name + if package_name in PACKAGES: + key = GLOBAL_PROJECT_NAME + if key not in context: + context[key] = {} + + context[key].update(macro_map) + + def _add_macros(context, model, manifest): macros_to_add = {'global': [], 'local': []} @@ -96,15 +112,12 @@ def _add_macros(context, model, manifest): macro.name: macro.generator(context) } - if context.get(package_name) is None: - context[package_name] = {} - - context.get(package_name, {}) \ - .update(macro_map) + # adapter packages are part of the global project space + _add_macro_map(context, package_name, macro_map) if package_name == model.package_name: macros_to_add['local'].append(macro_map) - elif package_name == dbt.include.GLOBAL_PROJECT_NAME: + elif package_name in PACKAGES: macros_to_add['global'].append(macro_map) # Load global macros before local macros -- local takes precedence diff --git a/dbt/context/parser.py b/core/dbt/context/parser.py similarity index 100% rename from dbt/context/parser.py rename to core/dbt/context/parser.py diff --git a/dbt/context/runtime.py b/core/dbt/context/runtime.py similarity index 100% rename from dbt/context/runtime.py rename to core/dbt/context/runtime.py diff --git a/dbt/clients/__init__.py b/core/dbt/contracts/__init__.py similarity index 100% rename from dbt/clients/__init__.py rename to core/dbt/contracts/__init__.py diff --git a/dbt/contracts/common.py b/core/dbt/contracts/common.py similarity index 100% rename from dbt/contracts/common.py rename to core/dbt/contracts/common.py diff --git a/dbt/contracts/connection.py b/core/dbt/contracts/connection.py similarity index 100% rename from dbt/contracts/connection.py rename to core/dbt/contracts/connection.py diff --git a/dbt/context/__init__.py b/core/dbt/contracts/graph/__init__.py similarity index 100% rename from dbt/context/__init__.py rename to core/dbt/contracts/graph/__init__.py diff --git a/dbt/contracts/graph/compiled.py b/core/dbt/contracts/graph/compiled.py similarity index 100% rename from dbt/contracts/graph/compiled.py rename to core/dbt/contracts/graph/compiled.py diff --git a/dbt/contracts/graph/manifest.py b/core/dbt/contracts/graph/manifest.py similarity index 100% rename from dbt/contracts/graph/manifest.py rename to core/dbt/contracts/graph/manifest.py diff --git a/dbt/contracts/graph/parsed.py b/core/dbt/contracts/graph/parsed.py similarity index 100% rename from dbt/contracts/graph/parsed.py rename to core/dbt/contracts/graph/parsed.py diff --git a/dbt/contracts/graph/unparsed.py b/core/dbt/contracts/graph/unparsed.py similarity index 100% rename from dbt/contracts/graph/unparsed.py rename to core/dbt/contracts/graph/unparsed.py diff --git a/dbt/contracts/project.py b/core/dbt/contracts/project.py similarity index 100% rename from dbt/contracts/project.py rename to core/dbt/contracts/project.py diff --git a/dbt/contracts/results.py b/core/dbt/contracts/results.py similarity index 100% rename from dbt/contracts/results.py rename to core/dbt/contracts/results.py diff --git a/dbt/deprecations.py b/core/dbt/deprecations.py similarity index 100% rename from dbt/deprecations.py rename to core/dbt/deprecations.py diff --git a/dbt/exceptions.py b/core/dbt/exceptions.py similarity index 100% rename from dbt/exceptions.py rename to core/dbt/exceptions.py diff --git a/dbt/flags.py b/core/dbt/flags.py similarity index 100% rename from dbt/flags.py rename to core/dbt/flags.py diff --git a/dbt/contracts/__init__.py b/core/dbt/graph/__init__.py similarity index 100% rename from dbt/contracts/__init__.py rename to core/dbt/graph/__init__.py diff --git a/dbt/graph/selector.py b/core/dbt/graph/selector.py similarity index 100% rename from dbt/graph/selector.py rename to core/dbt/graph/selector.py diff --git a/dbt/hooks.py b/core/dbt/hooks.py similarity index 100% rename from dbt/hooks.py rename to core/dbt/hooks.py diff --git a/core/dbt/include/__init__.py b/core/dbt/include/__init__.py new file mode 100644 index 00000000000..69e3be50dac --- /dev/null +++ b/core/dbt/include/__init__.py @@ -0,0 +1 @@ +__path__ = __import__('pkgutil').extend_path(__path__, __name__) diff --git a/core/dbt/include/global_project/__init__.py b/core/dbt/include/global_project/__init__.py new file mode 100644 index 00000000000..d0415108083 --- /dev/null +++ b/core/dbt/include/global_project/__init__.py @@ -0,0 +1,11 @@ +import os + +PACKAGE_PATH = os.path.dirname(os.path.dirname(__file__)) +PROJECT_NAME = 'dbt' + +DOCS_INDEX_FILE_PATH = os.path.normpath( + os.path.join(PACKAGE_PATH, "index.html")) + + +# Adapter registration will add to this +PACKAGES = {PROJECT_NAME: PACKAGE_PATH} diff --git a/dbt/include/global_project/dbt_project.yml b/core/dbt/include/global_project/dbt_project.yml similarity index 100% rename from dbt/include/global_project/dbt_project.yml rename to core/dbt/include/global_project/dbt_project.yml diff --git a/dbt/include/global_project/docs/overview.md b/core/dbt/include/global_project/docs/overview.md similarity index 100% rename from dbt/include/global_project/docs/overview.md rename to core/dbt/include/global_project/docs/overview.md diff --git a/dbt/include/global_project/macros/adapters/common.sql b/core/dbt/include/global_project/macros/adapters/common.sql similarity index 100% rename from dbt/include/global_project/macros/adapters/common.sql rename to core/dbt/include/global_project/macros/adapters/common.sql diff --git a/dbt/include/global_project/macros/core.sql b/core/dbt/include/global_project/macros/core.sql similarity index 100% rename from dbt/include/global_project/macros/core.sql rename to core/dbt/include/global_project/macros/core.sql diff --git a/dbt/include/global_project/macros/etc/datetime.sql b/core/dbt/include/global_project/macros/etc/datetime.sql similarity index 100% rename from dbt/include/global_project/macros/etc/datetime.sql rename to core/dbt/include/global_project/macros/etc/datetime.sql diff --git a/dbt/include/global_project/macros/etc/get_custom_schema.sql b/core/dbt/include/global_project/macros/etc/get_custom_schema.sql similarity index 100% rename from dbt/include/global_project/macros/etc/get_custom_schema.sql rename to core/dbt/include/global_project/macros/etc/get_custom_schema.sql diff --git a/dbt/include/global_project/macros/etc/is_incremental.sql b/core/dbt/include/global_project/macros/etc/is_incremental.sql similarity index 100% rename from dbt/include/global_project/macros/etc/is_incremental.sql rename to core/dbt/include/global_project/macros/etc/is_incremental.sql diff --git a/dbt/include/global_project/macros/materializations/archive/archive.sql b/core/dbt/include/global_project/macros/materializations/archive/archive.sql similarity index 89% rename from dbt/include/global_project/macros/materializations/archive/archive.sql rename to core/dbt/include/global_project/macros/materializations/archive/archive.sql index 06eabcade2e..1fb266535de 100644 --- a/dbt/include/global_project/macros/materializations/archive/archive.sql +++ b/core/dbt/include/global_project/macros/materializations/archive/archive.sql @@ -10,10 +10,6 @@ md5("dbt_pk" || '|' || "dbt_updated_at") {% endmacro %} -{% macro bigquery__archive_scd_hash() %} - to_hex(md5(concat(cast(`dbt_pk` as string), '|', cast(`dbt_updated_at` as string)))) -{% endmacro %} - {% macro create_temporary_table(sql, relation) %} {{ return(adapter_macro('create_temporary_table', sql, relation)) }} {% endmacro %} @@ -25,12 +21,6 @@ {{ return(relation) }} {% endmacro %} -{% macro bigquery__create_temporary_table(sql, relation) %} - {% set tmp_relation = adapter.create_temporary_table(sql) %} - {{ return(tmp_relation) }} -{% endmacro %} - - {# Add new columns to the table if applicable #} @@ -46,10 +36,6 @@ {% endfor %} {% endmacro %} -{% macro bigquery__create_columns(relation, columns) %} - {{ adapter.alter_table_add_columns(relation, columns) }} -{% endmacro %} - {# Run the update part of an archive query. Different databases have tricky differences in their `update` semantics. Table projection is @@ -68,14 +54,6 @@ and {{ adapter.quote('change_type') }} = 'update'; {% endmacro %} -{% macro bigquery__archive_update(target_relation, tmp_relation) %} - update {{ target_relation }} as dest - set dest.{{ adapter.quote('valid_to') }} = tmp.{{ adapter.quote('valid_to') }} - from {{ tmp_relation }} as tmp - where tmp.{{ adapter.quote('scd_id') }} = dest.{{ adapter.quote('scd_id') }} - and {{ adapter.quote('change_type') }} = 'update'; -{% endmacro %} - {# Cross-db compatible archival implementation diff --git a/dbt/include/global_project/macros/materializations/common/merge.sql b/core/dbt/include/global_project/macros/materializations/common/merge.sql similarity index 73% rename from dbt/include/global_project/macros/materializations/common/merge.sql rename to core/dbt/include/global_project/macros/materializations/common/merge.sql index bc537925abd..9903f7afd4e 100644 --- a/dbt/include/global_project/macros/materializations/common/merge.sql +++ b/core/dbt/include/global_project/macros/materializations/common/merge.sql @@ -4,7 +4,8 @@ {{ adapter_macro('get_merge_sql', target, source, unique_key, dest_columns) }} {%- endmacro %} -{% macro default__get_merge_sql(target, source, unique_key, dest_columns) -%} + +{% macro common_get_merge_sql(target, source, unique_key, dest_columns) -%} {%- set dest_cols_csv = dest_columns | map(attribute="name") | join(', ') -%} merge into {{ target }} as DBT_INTERNAL_DEST @@ -31,10 +32,12 @@ {% endmacro %} -{% macro redshift__get_merge_sql(target, source, unique_key, dest_columns) -%} - {{ exceptions.raise_compiler_error('get_merge_sql is not implemented for Redshift') }} -{% endmacro %} +{% macro default__get_merge_sql(target, source, unique_key, dest_columns) -%} + {% set typename = adapter.type() %} + + {{ exceptions.raise_compiler_error( + 'get_merge_sql is not implemented for {}'.format(typename) + ) + }} -{% macro postgres__get_merge_sql(target, source, unique_key, dest_columns) -%} - {{ exceptions.raise_compiler_error('get_merge_sql is not implemented for Postgres') }} {% endmacro %} diff --git a/dbt/include/global_project/macros/materializations/helpers.sql b/core/dbt/include/global_project/macros/materializations/helpers.sql similarity index 100% rename from dbt/include/global_project/macros/materializations/helpers.sql rename to core/dbt/include/global_project/macros/materializations/helpers.sql diff --git a/dbt/include/global_project/macros/materializations/incremental/incremental.sql b/core/dbt/include/global_project/macros/materializations/incremental/incremental.sql similarity index 100% rename from dbt/include/global_project/macros/materializations/incremental/incremental.sql rename to core/dbt/include/global_project/macros/materializations/incremental/incremental.sql diff --git a/dbt/include/global_project/macros/materializations/seed/seed.sql b/core/dbt/include/global_project/macros/materializations/seed/seed.sql similarity index 100% rename from dbt/include/global_project/macros/materializations/seed/seed.sql rename to core/dbt/include/global_project/macros/materializations/seed/seed.sql diff --git a/dbt/include/global_project/macros/materializations/table/table.sql b/core/dbt/include/global_project/macros/materializations/table/table.sql similarity index 100% rename from dbt/include/global_project/macros/materializations/table/table.sql rename to core/dbt/include/global_project/macros/materializations/table/table.sql diff --git a/dbt/include/global_project/macros/materializations/view/bq_snowflake_view.sql b/core/dbt/include/global_project/macros/materializations/view/create_or_replace_view.sql similarity index 82% rename from dbt/include/global_project/macros/materializations/view/bq_snowflake_view.sql rename to core/dbt/include/global_project/macros/materializations/view/create_or_replace_view.sql index d5ceafec383..20b2d5df9db 100644 --- a/dbt/include/global_project/macros/materializations/view/bq_snowflake_view.sql +++ b/core/dbt/include/global_project/macros/materializations/view/create_or_replace_view.sql @@ -9,15 +9,6 @@ {%- endif -%} {% endmacro %} -{% macro bigquery__handle_existing_table(full_refresh, non_destructive_mode, old_relation) %} - {%- if full_refresh and not non_destructive_mode -%} - {{ adapter.drop_relation(old_relation) }} - {%- else -%} - {{ exceptions.relation_wrong_type(old_relation, 'view') }} - {%- endif -%} -{% endmacro %} - - {# /* Core materialization implementation. BigQuery and Snowflake are similar because both can use `create or replace view` where the resulting view schema @@ -30,7 +21,7 @@ */ #} -{% macro impl_view_materialization(run_outside_transaction_hooks=True) %} +{% macro create_or_replace_view(run_outside_transaction_hooks=True) %} {%- set identifier = model['alias'] -%} {%- set non_destructive_mode = (flags.NON_DESTRUCTIVE == True) -%} @@ -88,11 +79,3 @@ {{ run_hooks(post_hooks, inside_transaction=False) }} {% endif %} {% endmacro %} - -{% materialization view, adapter='bigquery' -%} - {{ impl_view_materialization(run_outside_transaction_hooks=False) }} -{%- endmaterialization %} - -{% materialization view, adapter='snowflake' -%} - {{ impl_view_materialization() }} -{%- endmaterialization %} diff --git a/dbt/include/global_project/macros/materializations/view/view.sql b/core/dbt/include/global_project/macros/materializations/view/view.sql similarity index 100% rename from dbt/include/global_project/macros/materializations/view/view.sql rename to core/dbt/include/global_project/macros/materializations/view/view.sql diff --git a/dbt/include/global_project/macros/operations/catalog/get_catalog.sql b/core/dbt/include/global_project/macros/operations/catalog/get_catalog.sql similarity index 100% rename from dbt/include/global_project/macros/operations/catalog/get_catalog.sql rename to core/dbt/include/global_project/macros/operations/catalog/get_catalog.sql diff --git a/dbt/include/global_project/macros/operations/relations/get_relations.sql b/core/dbt/include/global_project/macros/operations/relations/get_relations.sql similarity index 100% rename from dbt/include/global_project/macros/operations/relations/get_relations.sql rename to core/dbt/include/global_project/macros/operations/relations/get_relations.sql diff --git a/dbt/include/global_project/macros/schema_tests/accepted_values.sql b/core/dbt/include/global_project/macros/schema_tests/accepted_values.sql similarity index 100% rename from dbt/include/global_project/macros/schema_tests/accepted_values.sql rename to core/dbt/include/global_project/macros/schema_tests/accepted_values.sql diff --git a/dbt/include/global_project/macros/schema_tests/not_null.sql b/core/dbt/include/global_project/macros/schema_tests/not_null.sql similarity index 100% rename from dbt/include/global_project/macros/schema_tests/not_null.sql rename to core/dbt/include/global_project/macros/schema_tests/not_null.sql diff --git a/dbt/include/global_project/macros/schema_tests/relationships.sql b/core/dbt/include/global_project/macros/schema_tests/relationships.sql similarity index 100% rename from dbt/include/global_project/macros/schema_tests/relationships.sql rename to core/dbt/include/global_project/macros/schema_tests/relationships.sql diff --git a/dbt/include/global_project/macros/schema_tests/unique.sql b/core/dbt/include/global_project/macros/schema_tests/unique.sql similarity index 100% rename from dbt/include/global_project/macros/schema_tests/unique.sql rename to core/dbt/include/global_project/macros/schema_tests/unique.sql diff --git a/dbt/include/index.html b/core/dbt/include/index.html similarity index 100% rename from dbt/include/index.html rename to core/dbt/include/index.html diff --git a/dbt/linker.py b/core/dbt/linker.py similarity index 100% rename from dbt/linker.py rename to core/dbt/linker.py diff --git a/dbt/links.py b/core/dbt/links.py similarity index 100% rename from dbt/links.py rename to core/dbt/links.py diff --git a/dbt/loader.py b/core/dbt/loader.py similarity index 100% rename from dbt/loader.py rename to core/dbt/loader.py diff --git a/dbt/logger.py b/core/dbt/logger.py similarity index 100% rename from dbt/logger.py rename to core/dbt/logger.py diff --git a/dbt/main.py b/core/dbt/main.py similarity index 100% rename from dbt/main.py rename to core/dbt/main.py diff --git a/dbt/node_runners.py b/core/dbt/node_runners.py similarity index 99% rename from dbt/node_runners.py rename to core/dbt/node_runners.py index 27f23c6347e..93224161809 100644 --- a/dbt/node_runners.py +++ b/core/dbt/node_runners.py @@ -13,7 +13,6 @@ import dbt.ui.printer import dbt.flags import dbt.schema -import dbt.templates import dbt.writer import six diff --git a/dbt/node_types.py b/core/dbt/node_types.py similarity index 100% rename from dbt/node_types.py rename to core/dbt/node_types.py diff --git a/dbt/parser/__init__.py b/core/dbt/parser/__init__.py similarity index 100% rename from dbt/parser/__init__.py rename to core/dbt/parser/__init__.py diff --git a/dbt/parser/analysis.py b/core/dbt/parser/analysis.py similarity index 100% rename from dbt/parser/analysis.py rename to core/dbt/parser/analysis.py diff --git a/dbt/parser/archives.py b/core/dbt/parser/archives.py similarity index 100% rename from dbt/parser/archives.py rename to core/dbt/parser/archives.py diff --git a/dbt/parser/base.py b/core/dbt/parser/base.py similarity index 98% rename from dbt/parser/base.py rename to core/dbt/parser/base.py index fbcd3050c98..0bf18a7df5d 100644 --- a/dbt/parser/base.py +++ b/core/dbt/parser/base.py @@ -8,6 +8,7 @@ import dbt.clients.jinja import dbt.context.parser +from dbt.include.global_project import PROJECT_NAME as GLOBAL_PROJECT_NAME from dbt.utils import coalesce from dbt.logger import GLOBAL_LOGGER as logger from dbt.contracts.graph.parsed import ParsedNode @@ -76,7 +77,7 @@ def get_schema_func(self): if get_schema_macro is None: get_schema_macro = self.macro_manifest.find_macro_by_name( 'generate_schema_name', - dbt.include.GLOBAL_PROJECT_NAME + GLOBAL_PROJECT_NAME ) if get_schema_macro is None: def get_schema(_): diff --git a/dbt/parser/base_sql.py b/core/dbt/parser/base_sql.py similarity index 100% rename from dbt/parser/base_sql.py rename to core/dbt/parser/base_sql.py diff --git a/dbt/parser/data_test.py b/core/dbt/parser/data_test.py similarity index 100% rename from dbt/parser/data_test.py rename to core/dbt/parser/data_test.py diff --git a/dbt/parser/docs.py b/core/dbt/parser/docs.py similarity index 100% rename from dbt/parser/docs.py rename to core/dbt/parser/docs.py diff --git a/dbt/parser/hooks.py b/core/dbt/parser/hooks.py similarity index 100% rename from dbt/parser/hooks.py rename to core/dbt/parser/hooks.py diff --git a/dbt/parser/macros.py b/core/dbt/parser/macros.py similarity index 100% rename from dbt/parser/macros.py rename to core/dbt/parser/macros.py diff --git a/dbt/parser/models.py b/core/dbt/parser/models.py similarity index 100% rename from dbt/parser/models.py rename to core/dbt/parser/models.py diff --git a/dbt/parser/schemas.py b/core/dbt/parser/schemas.py similarity index 100% rename from dbt/parser/schemas.py rename to core/dbt/parser/schemas.py diff --git a/dbt/parser/seeds.py b/core/dbt/parser/seeds.py similarity index 100% rename from dbt/parser/seeds.py rename to core/dbt/parser/seeds.py diff --git a/dbt/parser/source_config.py b/core/dbt/parser/source_config.py similarity index 100% rename from dbt/parser/source_config.py rename to core/dbt/parser/source_config.py diff --git a/dbt/parser/util.py b/core/dbt/parser/util.py similarity index 100% rename from dbt/parser/util.py rename to core/dbt/parser/util.py diff --git a/dbt/profiler.py b/core/dbt/profiler.py similarity index 100% rename from dbt/profiler.py rename to core/dbt/profiler.py diff --git a/dbt/runner.py b/core/dbt/runner.py similarity index 100% rename from dbt/runner.py rename to core/dbt/runner.py diff --git a/dbt/schema.py b/core/dbt/schema.py similarity index 100% rename from dbt/schema.py rename to core/dbt/schema.py diff --git a/dbt/semver.py b/core/dbt/semver.py similarity index 100% rename from dbt/semver.py rename to core/dbt/semver.py diff --git a/dbt/ssh_forward.py b/core/dbt/ssh_forward.py similarity index 100% rename from dbt/ssh_forward.py rename to core/dbt/ssh_forward.py diff --git a/dbt/contracts/graph/__init__.py b/core/dbt/task/__init__.py similarity index 100% rename from dbt/contracts/graph/__init__.py rename to core/dbt/task/__init__.py diff --git a/dbt/task/archive.py b/core/dbt/task/archive.py similarity index 100% rename from dbt/task/archive.py rename to core/dbt/task/archive.py diff --git a/dbt/task/base_task.py b/core/dbt/task/base_task.py similarity index 100% rename from dbt/task/base_task.py rename to core/dbt/task/base_task.py diff --git a/dbt/task/clean.py b/core/dbt/task/clean.py similarity index 100% rename from dbt/task/clean.py rename to core/dbt/task/clean.py diff --git a/dbt/task/compile.py b/core/dbt/task/compile.py similarity index 100% rename from dbt/task/compile.py rename to core/dbt/task/compile.py diff --git a/dbt/task/debug.py b/core/dbt/task/debug.py similarity index 100% rename from dbt/task/debug.py rename to core/dbt/task/debug.py diff --git a/dbt/task/deps.py b/core/dbt/task/deps.py similarity index 100% rename from dbt/task/deps.py rename to core/dbt/task/deps.py diff --git a/dbt/task/generate.py b/core/dbt/task/generate.py similarity index 99% rename from dbt/task/generate.py rename to core/dbt/task/generate.py index 6cc1df5e02c..96d5789eb10 100644 --- a/dbt/task/generate.py +++ b/core/dbt/task/generate.py @@ -5,7 +5,7 @@ from dbt.adapters.factory import get_adapter from dbt.clients.system import write_json from dbt.compat import bigint -from dbt.include import DOCS_INDEX_FILE_PATH +from dbt.include.global_project import DOCS_INDEX_FILE_PATH import dbt.ui.printer import dbt.utils import dbt.compilation diff --git a/dbt/task/init.py b/core/dbt/task/init.py similarity index 100% rename from dbt/task/init.py rename to core/dbt/task/init.py diff --git a/dbt/task/run.py b/core/dbt/task/run.py similarity index 100% rename from dbt/task/run.py rename to core/dbt/task/run.py diff --git a/dbt/task/seed.py b/core/dbt/task/seed.py similarity index 100% rename from dbt/task/seed.py rename to core/dbt/task/seed.py diff --git a/dbt/task/serve.py b/core/dbt/task/serve.py similarity index 94% rename from dbt/task/serve.py rename to core/dbt/task/serve.py index 3a94ffbafed..d5e58762466 100644 --- a/dbt/task/serve.py +++ b/core/dbt/task/serve.py @@ -2,7 +2,7 @@ import os import webbrowser -from dbt.include import DOCS_INDEX_FILE_PATH +from dbt.include.global_project import DOCS_INDEX_FILE_PATH from dbt.compat import SimpleHTTPRequestHandler, TCPServer from dbt.logger import GLOBAL_LOGGER as logger diff --git a/dbt/task/test.py b/core/dbt/task/test.py similarity index 100% rename from dbt/task/test.py rename to core/dbt/task/test.py diff --git a/dbt/tracking.py b/core/dbt/tracking.py similarity index 100% rename from dbt/tracking.py rename to core/dbt/tracking.py diff --git a/dbt/graph/__init__.py b/core/dbt/ui/__init__.py similarity index 100% rename from dbt/graph/__init__.py rename to core/dbt/ui/__init__.py diff --git a/dbt/ui/colors.py b/core/dbt/ui/colors.py similarity index 100% rename from dbt/ui/colors.py rename to core/dbt/ui/colors.py diff --git a/dbt/ui/printer.py b/core/dbt/ui/printer.py similarity index 100% rename from dbt/ui/printer.py rename to core/dbt/ui/printer.py diff --git a/dbt/utils.py b/core/dbt/utils.py similarity index 98% rename from dbt/utils.py rename to core/dbt/utils.py index 788c73f760f..b5c2001edaf 100644 --- a/dbt/utils.py +++ b/core/dbt/utils.py @@ -13,7 +13,7 @@ import dbt.exceptions import dbt.flags -from dbt.include import GLOBAL_DBT_MODULES_PATH +from dbt.include.global_project import PACKAGES from dbt.compat import basestring, DECIMALS from dbt.logger import GLOBAL_LOGGER as logger from dbt.node_types import NodeType @@ -216,10 +216,8 @@ def dependencies_for_path(config, module_path): def dependency_projects(config): - module_paths = [ - GLOBAL_DBT_MODULES_PATH, - os.path.join(config.project_root, config.modules_path) - ] + module_paths = list(PACKAGES.values()) + module_paths.append(os.path.join(config.project_root, config.modules_path)) for module_path in module_paths: for entry in dependencies_for_path(config, module_path): diff --git a/dbt/version.py b/core/dbt/version.py similarity index 98% rename from dbt/version.py rename to core/dbt/version.py index a990b6614f3..752926a2f59 100644 --- a/dbt/version.py +++ b/core/dbt/version.py @@ -57,5 +57,5 @@ def get_version_information(): .format(version_msg)) -__version__ = '0.12.2rc1' +__version__ = '0.13.0a1' installed = get_installed_version() diff --git a/dbt/writer.py b/core/dbt/writer.py similarity index 100% rename from dbt/writer.py rename to core/dbt/writer.py diff --git a/core/etc/dag.png b/core/etc/dag.png new file mode 100644 index 0000000000000000000000000000000000000000..ad76924a43f78d4e64c2220fa53273ac08663c8f GIT binary patch literal 161481 zcmeFZcT`i`x;G4hh{&dhH0dDHK|q911r(Hy^xi>ggwRWnB1nxQy%z-xP3avJsi7$) zK!DIg54{DFFMIEM&OP^j``-7w|Gr~qjEv08wPt_H?so*PjBhh(!TfM+rgG8jXC`mK@jwFc_&6CXkCsc~+Wz_V|g zqtgs#ac?+9d)gUVZoN2Hiof+BH#q|UOsBMQ%RJNed4V+)*VX+nqOH5P-WLCMTVNp7 zevclT2ixyR$>3mWiIS%~(s#C&dIYs|HB6BgG5)snW23-M@OI)L+oHaS^*F<=>X4;g z`9pO#UvUjFax1as&sOGSp$Sqn?^e(1e=QE&BwfhX=Vz%D!OE~9u) zQ{noCU3LyDwXA%v>ie{T@3e9}>Q}U<=^1kKS+5nq71`r`o%^h|v{$4bg0JobcqZGn z-|IEg)k~s&G#{$+nlmqlsX$8dM$oq&sRXt=k1TmKzRFWwBkX*`+xMFJ-8HsLMPl1$ z1J6w#Txvy($o4CJ=H-@%-g>i>c~4kd@Jr^8y1IH#VutyMBFGtwlRc0lTVS~vp3ubQY>Gq^IR8m-hD}-aH&kd&r8Jg@bL}u&O3tN=$OB> z?cM}a5f@P1^n7rG_#Ih>G3wApwEVRaZ`AP@#sM3i?I?aJQq_EFt?wp{q(+M*vtg>E zH|6$jlPnOCbC4=2F_7N+`PiG9>&LaPPqV4~eo)?2{Qh3*9^rGvA8*M`;>(}JzQ6sE zdHRh$SM>YkK9d!(UtzM3o8N&~gbuEE7kDQpxD@rQ+mGKoR*Lxf%==MhxMM-UOTuP4 zA!UJ|L@$W~>DprF6=i;=t+P|SddPgEB)aAYU@`brL8HI9m{zP=tibn_C4SGkMn`j| zUAjt|Q?gS=?H@IJ=B?cGv}|u7-*4@ioP9czIP(goZ6^$64ZVeY!`2zf^MKTp_*VF> zFx9u*AF0-8$Zmd$Y>N#1e*HU(66GS%`)4aunr{<-Jho*PO=x`E7}c0#tm?+$OVtt+ zaqsr?2zx~@t~W_%ADLfpI16kLY>;o<{~Uc3qrtV6f`@vQdV##k`u8UyH&qfo7V8@6z)I`JZ;khk`#rp?nYX5q zrAYHLb!^~e^vkrD7PTYZ2F-xEX!$tdqN-2mqJ~knQKTpXxm^?wSMK{RV_2zUwwwTU?>O25TKDwPlx&23#_zhh%zef%ZH zjph*~r$^Y4&Ay@L#<>1Oap}`CA)PWEnNO4b-#p_1vRWigEGSZxFbYPzbJLP0>3(^x zj?Cg(BxI9jLT=*2c-;8bIJz|S=Yq?b^G8>=(U;@?g)#7l@azJB6)1Y``j8RLG>ruh z*?l@qS+V^BI;cY>ZDrjv*M>=n3PpF89Rl~56T=s09RUA$lXvuJ?Zz=PulLt+&V z+uT(ig2dD%5gxu>%n}Wf+7eX{Iy}NmrHtPS)|+{2aB6tv-pkboY~*s!{ep?Xt9z

iA0U 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

G}*@!sN6a% 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⪖Ar7jM_pu~iOk@_Chlb1wKx~yev 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 Yj=4sy6{;cXw+no3Dyd(~Rk;1&UnWwQng9R* literal 0 HcmV?d00001 diff --git a/events/schemas/com.fishtownanalytics/invocation_env_context.json b/core/events/schemas/com.fishtownanalytics/invocation_env_context.json similarity index 100% rename from events/schemas/com.fishtownanalytics/invocation_env_context.json rename to core/events/schemas/com.fishtownanalytics/invocation_env_context.json diff --git a/events/schemas/com.fishtownanalytics/invocation_event.json b/core/events/schemas/com.fishtownanalytics/invocation_event.json similarity index 100% rename from events/schemas/com.fishtownanalytics/invocation_event.json rename to core/events/schemas/com.fishtownanalytics/invocation_event.json diff --git a/events/schemas/com.fishtownanalytics/platform_context.json b/core/events/schemas/com.fishtownanalytics/platform_context.json similarity index 100% rename from events/schemas/com.fishtownanalytics/platform_context.json rename to core/events/schemas/com.fishtownanalytics/platform_context.json diff --git a/events/schemas/com.fishtownanalytics/run_model_context.json b/core/events/schemas/com.fishtownanalytics/run_model_context.json similarity index 100% rename from events/schemas/com.fishtownanalytics/run_model_context.json rename to core/events/schemas/com.fishtownanalytics/run_model_context.json diff --git a/core/scripts/create_adapter_plugins.py b/core/scripts/create_adapter_plugins.py new file mode 100644 index 00000000000..9b0349f1876 --- /dev/null +++ b/core/scripts/create_adapter_plugins.py @@ -0,0 +1,162 @@ +#!/usr/bin/env python +import argparse +import os +import sys + +pj = os.path.join + +PROJECT_TEMPLATE = ''' +name: dbt_{adapter} +version: {version} + +macro-paths: ["macros"] +''' + +NAMESPACE_INIT_TEMPLATE = ''' +__path__ = __import__('pkgutil').extend_path(__path__, __name__) +'''.lstrip() + + +# TODO: make this not default to fishtown for everything! +SETUP_PY_TEMPLATE = ''' +#!/usr/bin/env python +from setuptools import find_packages +from distutils.core import setup + +package_name = "dbt-{adapter}" +package_version = "{version}" +description = """The {adapter} adpter plugin for dbt (data build tool)""" + +setup( + name=package_name, + version=package_version, + description=description, + long_description_content_type=description, + author={author_name}, + author_email={author_email}, + url={url}, + packages=find_packages(), + install_requires=[ + 'dbt-core=={dbt_core_version}', + {dependencies} + ] +) +'''.lstrip() + + + +ADAPTER_INIT_TEMPLATE = ''' +from dbt.adapters.{adapter}.connections import {title_adapter}ConnectionManager +from dbt.adapters.{adapter}.connections import {title_adapter}Credentials +from dbt.adapters.{adapter}.impl import {title_adapter}Adapter + +from dbt.adapters.base import AdapterPlugin +from dbt.include import {adapter} + +Plugin = AdapterPlugin( + adapter={title_adapter}Adapter, + credentials={title_adapter}Credentials, + include_path={adapter}.PACKAGE_PATH) +'''.lstrip() + + +INCLUDE_INIT_TEMPLATE = ''' +import os +PACKAGE_PATH = os.path.dirname(os.path.dirname(__file__)) +'''.lstrip() + + +def parse_args(argv=None): + if argv is None: + argv = sys.argv[1:] + parser = argparse.ArgumentParser() + parser.add_argument('root') + parser.add_argument('adapter') + parser.add_argument('--title-case', '-t', default=None) + parser.add_argument('--dependency', action='append') + parser.add_argument('--dbt-core-version', default='0.13.0') + parser.add_argument('--email') + parser.add_argument('--author') + parser.add_argument('--url') + parser.add_argument('--package-version', default='0.0.1') + parser.add_argument('--project-version', default='1.0') + parsed = parser.parse_args() + + if parsed.title_case is None: + parsed.title_case = parsed.adapter.title() + + if parsed.dependency: + #['a', 'b'] => "'a',\n 'b'"; ['a'] -> "'a'," + parsed.dependency = '\n '.join( + "'{}',".format(d) for d in parsed.dependency + ) + else: + parsed.dependency = '' + + if parsed.email is not None: + parsed.email = "'{}'".format(parsed.email) + else: + parsed.email = '' + if parsed.author is not None: + parsed.author = "'{}'".format(parsed.author) + else: + parsed.author = '' + if parsed.url is not None: + parsed.url = "'{}'".format(parsed.url) + else: + parsed.url = '' + return parsed + + + +def main(): + parsed = parse_args() + dest = pj(parsed.root, parsed.adapter) + if os.path.exists(dest): + raise Exception('path exists') + + adapters_path = pj(dest, 'dbt', 'adapters', parsed.adapter) + include_path = pj(dest, 'dbt', 'include', parsed.adapter) + os.makedirs(adapters_path) + os.makedirs(pj(include_path, 'macros')) + + # namespaces! + with open(pj(dest, 'dbt', '__init__.py'), 'w') as fp: + fp.write(NAMESPACE_INIT_TEMPLATE) + with open(pj(dest, 'dbt', 'adapters', '__init__.py'), 'w') as fp: + fp.write(NAMESPACE_INIT_TEMPLATE) + with open(pj(dest, 'dbt', 'include', '__init__.py'), 'w') as fp: + fp.write(NAMESPACE_INIT_TEMPLATE) + + # setup script! + with open(pj(dest, 'setup.py'), 'w') as fp: + fp.write(SETUP_PY_TEMPLATE.format(adapter=parsed.adapter, + version=parsed.package_version, + author_name=parsed.author, + author_email=parsed.email, + url=parsed.url, + dbt_core_version=parsed.dbt_core_version, + dependencies=parsed.dependency)) + + + # adapter stuff! + with open(pj(adapters_path, '__init__.py'), 'w') as fp: + fp.write(ADAPTER_INIT_TEMPLATE.format(adapter=parsed.adapter, + title_adapter=parsed.title_case)) + + # macro/project stuff! + with open(pj(include_path, '__init__.py'), 'w') as fp: + fp.write(INCLUDE_INIT_TEMPLATE) + + with open(pj(include_path, 'dbt_project.yml'), 'w') as fp: + fp.write(PROJECT_TEMPLATE.format(adapter=parsed.adapter, + version=parsed.project_version)) + + # TODO: + # - bare class impls for mandatory subclasses + # (ConnectionManager, Credentials, Adapter) + # - impls of mandatory abstract methods w/explicit NotImplementedErrors + + +if __name__ == '__main__': + main() diff --git a/scripts/dbt b/core/scripts/dbt similarity index 100% rename from scripts/dbt rename to core/scripts/dbt diff --git a/scripts/upgrade_dbt_schema_tests_v1_to_v2.py b/core/scripts/upgrade_dbt_schema_tests_v1_to_v2.py similarity index 100% rename from scripts/upgrade_dbt_schema_tests_v1_to_v2.py rename to core/scripts/upgrade_dbt_schema_tests_v1_to_v2.py diff --git a/setup.py b/core/setup.py similarity index 69% rename from setup.py rename to core/setup.py index 95e3a7d1593..68c5495e8fd 100644 --- a/setup.py +++ b/core/setup.py @@ -6,22 +6,12 @@ def read(fname): return open(os.path.join(os.path.dirname(__file__), fname)).read() -package_name = "dbt" -package_version = "0.12.2rc1" +package_name = "dbt-core" +package_version = "0.13.0a1" description = """dbt (data build tool) is a command line tool that helps \ analysts and engineers transform data in their warehouse more effectively""" -boto_requirements = [ - 'boto3>=1.6.23,<1.8.0', - 'botocore>=1.9.23,<1.11.0', -] - -postgres_requirements = [ - 'psycopg2>=2.7.5,<2.8', -] - - setup( name=package_name, version=package_version, @@ -50,15 +40,6 @@ def read(fname): scripts=[ 'scripts/dbt', ], - extras_require={ - # when we split out adapters into their own python packages, these - # extras requirements lists will just be the appropriate adapter - # packages - 'snowflake': ['snowflake-connector-python>=1.4.9'] + boto_requirements, - 'bigquery': ['google-cloud-bigquery>=1.0.0,<2'], - 'redshift': boto_requirements[:] + postgres_requirements[:], - 'postgres': postgres_requirements[:], - }, install_requires=[ 'Jinja2>=2.10', 'PyYAML>=3.11', diff --git a/dbt/adapters/postgres/__init__.py b/dbt/adapters/postgres/__init__.py deleted file mode 100644 index d63b2d32b58..00000000000 --- a/dbt/adapters/postgres/__init__.py +++ /dev/null @@ -1,6 +0,0 @@ -from dbt.adapters.postgres.connections import PostgresConnectionManager -from dbt.adapters.postgres.connections import PostgresCredentials -from dbt.adapters.postgres.impl import PostgresAdapter - -Adapter = PostgresAdapter -Credentials = PostgresCredentials diff --git a/dbt/adapters/redshift/__init__.py b/dbt/adapters/redshift/__init__.py deleted file mode 100644 index aa47613a429..00000000000 --- a/dbt/adapters/redshift/__init__.py +++ /dev/null @@ -1,6 +0,0 @@ -from dbt.adapters.redshift.connections import RedshiftConnectionManager -from dbt.adapters.redshift.connections import RedshiftCredentials -from dbt.adapters.redshift.impl import RedshiftAdapter - -Adapter = RedshiftAdapter -Credentials = RedshiftCredentials diff --git a/dbt/config.py b/dbt/config.py deleted file mode 100644 index 65365aeec61..00000000000 --- a/dbt/config.py +++ /dev/null @@ -1,1077 +0,0 @@ -import os.path -import os -from copy import deepcopy -import hashlib -import pprint - -import dbt.exceptions -import dbt.clients.yaml_helper -import dbt.clients.system -import dbt.utils -from dbt.compat import basestring -from dbt.contracts.project import Project as ProjectContract, Configuration, \ - PackageConfig, ProfileConfig -from dbt.exceptions import DbtProjectError, DbtProfileError, RecursionException -from dbt.context.common import env_var, Var -from dbt import compat -from dbt.adapters.factory import load_adapter, get_relation_class_by_name - -from dbt.logger import GLOBAL_LOGGER as logger -from dbt.utils import DBTConfigKeys -from dbt.version import get_installed_version -from dbt.semver import VersionSpecifier, versions_compatible -import dbt.ui.printer - -DEFAULT_THREADS = 1 -DEFAULT_SEND_ANONYMOUS_USAGE_STATS = True -DEFAULT_USE_COLORS = True -DEFAULT_PROFILES_DIR = os.path.join(os.path.expanduser('~'), '.dbt') -PROFILES_DIR = os.path.expanduser( - os.environ.get('DBT_PROFILES_DIR', DEFAULT_PROFILES_DIR) - ) - -INVALID_PROFILE_MESSAGE = """ -dbt encountered an error while trying to read your profiles.yml file. - -{error_string} -""" - - -NO_SUPPLIED_PROFILE_ERROR = """\ -dbt cannot run because no profile was specified for this dbt project. -To specify a profile for this project, add a line like the this to -your dbt_project.yml file: - -profile: [profile name] - -Here, [profile name] should be replaced with a profile name -defined in your profiles.yml file. You can find profiles.yml here: - -{profiles_file}/profiles.yml -""".format(profiles_file=PROFILES_DIR) - - -UNUSED_RESOURCE_CONFIGURATION_PATH_MESSAGE = """\ -WARNING: Configuration paths exist in your dbt_project.yml file which do not \ -apply to any resources. -There are {} unused configuration paths:\n{} -""" - -INVALID_VERSION_ERROR = """\ -This version of dbt is not supported with the '{package}' package. - Installed version of dbt: {installed} - Required version of dbt for '{package}': {version_spec} - -Check the requirements for the '{package}' package, or run dbt again with \ ---no-version-check -""" - -IMPOSSIBLE_VERSION_ERROR = """\ -The package version requirement can never be satisfied for the '{package} -package. - Required versions of dbt for '{package}': {version_spec} - -Check the requirements for the '{package}' package, or run dbt again with \ ---no-version-check -""" - - -def read_profile(profiles_dir): - path = os.path.join(profiles_dir, 'profiles.yml') - - contents = None - if os.path.isfile(path): - try: - contents = dbt.clients.system.load_file_contents(path, strip=False) - return dbt.clients.yaml_helper.load_yaml_text(contents) - except dbt.exceptions.ValidationException as e: - msg = INVALID_PROFILE_MESSAGE.format(error_string=e) - raise dbt.exceptions.ValidationException(msg) - - return {} - - -def read_profiles(profiles_dir=None): - """This is only used in main, for some error handling""" - if profiles_dir is None: - profiles_dir = PROFILES_DIR - - raw_profiles = read_profile(profiles_dir) - - if raw_profiles is None: - profiles = {} - else: - profiles = {k: v for (k, v) in raw_profiles.items() if k != 'config'} - - return profiles - - -class ConfigRenderer(object): - """A renderer provides configuration rendering for a given set of cli - variables and a render type. - """ - def __init__(self, cli_vars): - self.context = {'env_var': env_var} - self.context['var'] = Var(None, self.context, cli_vars) - - @staticmethod - def _is_hook_or_model_vars_path(keypath): - if not keypath: - return False - - first = keypath[0] - # run hooks - if first in {'on-run-start', 'on-run-end'}: - return True - # models have two things to avoid - if first in {'seeds', 'models'}: - # model-level hooks - if 'pre-hook' in keypath or 'post-hook' in keypath: - return True - # model-level 'vars' declarations - if 'vars' in keypath: - return True - - return False - - def _render_project_entry(self, value, keypath): - """Render an entry, in case it's jinja. This is meant to be passed to - dbt.utils.deep_map. - - If the parsed entry is a string and has the name 'port', this will - attempt to cast it to an int, and on failure will return the parsed - string. - - :param value Any: The value to potentially render - :param key str: The key to convert on. - :return Any: The rendered entry. - """ - # hooks should be treated as raw sql, they'll get rendered later. - # Same goes for 'vars' declarations inside 'models'/'seeds'. - if self._is_hook_or_model_vars_path(keypath): - return value - - return self.render_value(value) - - def render_value(self, value, keypath=None): - # keypath is ignored. - # if it wasn't read as a string, ignore it - if not isinstance(value, compat.basestring): - return value - - return dbt.clients.jinja.get_rendered(value, self.context) - - def _render_profile_data(self, value, keypath): - result = self.render_value(value) - if len(keypath) == 1 and keypath[-1] == 'port': - try: - result = int(result) - except ValueError: - # let the validator or connection handle this - pass - return result - - def render_project(self, as_parsed): - """Render the parsed data, returning a new dict (or whatever was read). - """ - try: - return dbt.utils.deep_map(self._render_project_entry, as_parsed) - except RecursionException: - raise DbtProjectError( - 'Cycle detected: Project input has a reference to itself', - project=project_dict - ) - - def render_profile_data(self, as_parsed): - """Render the chosen profile entry, as it was parsed.""" - try: - return dbt.utils.deep_map(self._render_profile_data, as_parsed) - except RecursionException: - raise DbtProfileError( - 'Cycle detected: Profile input has a reference to itself', - project=as_parsed - ) - - -def _list_if_none(value): - if value is None: - value = [] - return value - - -def _dict_if_none(value): - if value is None: - value = {} - return value - - -def _list_if_none_or_string(value): - value = _list_if_none(value) - if isinstance(value, compat.basestring): - return [value] - return value - - -def _parse_versions(versions): - """Parse multiple versions as read from disk. The versions value may be any - one of: - - a single version string ('>0.12.1') - - a single string specifying multiple comma-separated versions - ('>0.11.1,<=0.12.2') - - an array of single-version strings (['>0.11.1', '<=0.12.2']) - - Regardless, this will return a list of VersionSpecifiers - """ - if isinstance(versions, basestring): - versions = versions.split(',') - return [VersionSpecifier.from_version_string(v) for v in versions] - - -class Project(object): - def __init__(self, project_name, version, project_root, profile_name, - source_paths, macro_paths, data_paths, test_paths, - analysis_paths, docs_paths, target_path, clean_targets, - log_path, modules_path, quoting, models, on_run_start, - on_run_end, archive, seeds, dbt_version, packages): - self.project_name = project_name - self.version = version - self.project_root = project_root - self.profile_name = profile_name - self.source_paths = source_paths - self.macro_paths = macro_paths - self.data_paths = data_paths - self.test_paths = test_paths - self.analysis_paths = analysis_paths - self.docs_paths = docs_paths - self.target_path = target_path - self.clean_targets = clean_targets - self.log_path = log_path - self.modules_path = modules_path - self.quoting = quoting - self.models = models - self.on_run_start = on_run_start - self.on_run_end = on_run_end - self.archive = archive - self.seeds = seeds - self.dbt_version = dbt_version - self.packages = packages - - @staticmethod - def _preprocess(project_dict): - """Pre-process certain special keys to convert them from None values - into empty containers, and to turn strings into arrays of strings. - """ - handlers = { - ('archive',): _list_if_none, - ('on-run-start',): _list_if_none_or_string, - ('on-run-end',): _list_if_none_or_string, - } - - for k in ('models', 'seeds'): - handlers[(k,)] = _dict_if_none - handlers[(k, 'vars')] = _dict_if_none - handlers[(k, 'pre-hook')] = _list_if_none_or_string - handlers[(k, 'post-hook')] = _list_if_none_or_string - handlers[('seeds', 'column_types')] = _dict_if_none - - def converter(value, keypath): - if keypath in handlers: - handler = handlers[keypath] - return handler(value) - else: - return value - - return dbt.utils.deep_map(converter, project_dict) - - @classmethod - def from_project_config(cls, project_dict, packages_dict=None): - """Create a project from its project and package configuration, as read - by yaml.safe_load(). - - :param project_dict dict: The dictionary as read from disk - :param packages_dict Optional[dict]: If it exists, the packages file as - read from disk. - :raises DbtProjectError: If the project is missing or invalid, or if - the packages file exists and is invalid. - :returns Project: The project, with defaults populated. - """ - try: - project_dict = cls._preprocess(project_dict) - except RecursionException: - raise DbtProjectError( - 'Cycle detected: Project input has a reference to itself', - project=project_dict - ) - # just for validation. - try: - ProjectContract(**project_dict) - except dbt.exceptions.ValidationException as e: - raise DbtProjectError(str(e)) - - # name/version are required in the Project definition, so we can assume - # they are present - name = project_dict['name'] - version = project_dict['version'] - # this is added at project_dict parse time and should always be here - # once we see it. - project_root = project_dict['project-root'] - # this is only optional in the sense that if it's not present, it needs - # to have been a cli argument. - profile_name = project_dict.get('profile') - # these are optional - source_paths = project_dict.get('source-paths', ['models']) - macro_paths = project_dict.get('macro-paths', ['macros']) - data_paths = project_dict.get('data-paths', ['data']) - test_paths = project_dict.get('test-paths', ['test']) - analysis_paths = project_dict.get('analysis-paths', []) - docs_paths = project_dict.get('docs-paths', source_paths[:]) - target_path = project_dict.get('target-path', 'target') - # should this also include the modules path by default? - clean_targets = project_dict.get('clean-targets', [target_path]) - log_path = project_dict.get('log-path', 'logs') - modules_path = project_dict.get('modules-path', 'dbt_modules') - # in the default case we'll populate this once we know the adapter type - quoting = project_dict.get('quoting', {}) - - models = project_dict.get('models', {}) - on_run_start = project_dict.get('on-run-start', []) - on_run_end = project_dict.get('on-run-end', []) - archive = project_dict.get('archive', []) - seeds = project_dict.get('seeds', {}) - dbt_raw_version = project_dict.get('require-dbt-version', '>=0.0.0') - - try: - dbt_version = _parse_versions(dbt_raw_version) - except dbt.exceptions.SemverException as e: - raise DbtProjectError(str(e)) - - packages = package_config_from_data(packages_dict) - - project = cls( - project_name=name, - version=version, - project_root=project_root, - profile_name=profile_name, - source_paths=source_paths, - macro_paths=macro_paths, - data_paths=data_paths, - test_paths=test_paths, - analysis_paths=analysis_paths, - docs_paths=docs_paths, - target_path=target_path, - clean_targets=clean_targets, - log_path=log_path, - modules_path=modules_path, - quoting=quoting, - models=models, - on_run_start=on_run_start, - on_run_end=on_run_end, - archive=archive, - seeds=seeds, - dbt_version=dbt_version, - packages=packages - ) - # sanity check - this means an internal issue - project.validate() - return project - - def __str__(self): - cfg = self.to_project_config(with_packages=True) - return pprint.pformat(cfg) - - def __eq__(self, other): - if not (isinstance(other, self.__class__) and - isinstance(self, other.__class__)): - return False - return self.to_project_config(with_packages=True) == \ - other.to_project_config(with_packages=True) - - def to_project_config(self, with_packages=False): - """Return a dict representation of the config that could be written to - disk with `yaml.safe_dump` to get this configuration. - - :param with_packages bool: If True, include the serialized packages - file in the root. - :returns dict: The serialized profile. - """ - result = deepcopy({ - 'name': self.project_name, - 'version': self.version, - 'project-root': self.project_root, - 'profile': self.profile_name, - 'source-paths': self.source_paths, - 'macro-paths': self.macro_paths, - 'data-paths': self.data_paths, - 'test-paths': self.test_paths, - 'analysis-paths': self.analysis_paths, - 'docs-paths': self.docs_paths, - 'target-path': self.target_path, - 'clean-targets': self.clean_targets, - 'log-path': self.log_path, - 'quoting': self.quoting, - 'models': self.models, - 'on-run-start': self.on_run_start, - 'on-run-end': self.on_run_end, - 'archive': self.archive, - 'seeds': self.seeds, - 'require-dbt-version': [ - v.to_version_string() for v in self.dbt_version - ], - }) - if with_packages: - result.update(self.packages.serialize()) - return result - - def validate(self): - try: - ProjectContract(**self.to_project_config()) - except dbt.exceptions.ValidationException as exc: - raise DbtProjectError(str(exc)) - - @classmethod - def from_project_root(cls, project_root, cli_vars): - """Create a project from a root directory. Reads in dbt_project.yml and - packages.yml, if it exists. - - :param project_root str: The path to the project root to load. - :raises DbtProjectError: If the project is missing or invalid, or if - the packages file exists and is invalid. - :returns Project: The project, with defaults populated. - """ - project_root = os.path.normpath(project_root) - project_yaml_filepath = os.path.join(project_root, 'dbt_project.yml') - - # get the project.yml contents - if not dbt.clients.system.path_exists(project_yaml_filepath): - raise DbtProjectError( - 'no dbt_project.yml found at expected path {}' - .format(project_yaml_filepath) - ) - - if isinstance(cli_vars, compat.basestring): - cli_vars = dbt.utils.parse_cli_vars(cli_vars) - renderer = ConfigRenderer(cli_vars) - - project_dict = _load_yaml(project_yaml_filepath) - rendered_project = renderer.render_project(project_dict) - rendered_project['project-root'] = project_root - packages_dict = package_data_from_root(project_root) - return cls.from_project_config(rendered_project, packages_dict) - - @classmethod - def from_current_directory(cls, cli_vars): - return cls.from_project_root(os.getcwd(), cli_vars) - - def hashed_name(self): - return hashlib.md5(self.project_name.encode('utf-8')).hexdigest() - - def get_resource_config_paths(self): - """Return a dictionary with 'seeds' and 'models' keys whose values are - lists of lists of strings, where each inner list of strings represents - a configured path in the resource. - """ - return { - 'models': _get_config_paths(self.models), - 'seeds': _get_config_paths(self.seeds), - } - - def get_unused_resource_config_paths(self, resource_fqns, disabled): - """Return a list of lists of strings, where each inner list of strings - represents a type + FQN path of a resource configuration that is not - used. - """ - disabled_fqns = frozenset(tuple(fqn) for fqn in disabled) - resource_config_paths = self.get_resource_config_paths() - unused_resource_config_paths = [] - for resource_type, config_paths in resource_config_paths.items(): - used_fqns = resource_fqns.get(resource_type, frozenset()) - fqns = used_fqns | disabled_fqns - - for config_path in config_paths: - if not _is_config_used(config_path, fqns): - unused_resource_config_paths.append( - (resource_type,) + config_path - ) - return unused_resource_config_paths - - def warn_for_unused_resource_config_paths(self, resource_fqns, disabled): - unused = self.get_unused_resource_config_paths(resource_fqns, disabled) - if len(unused) == 0: - return - - msg = UNUSED_RESOURCE_CONFIGURATION_PATH_MESSAGE.format( - len(unused), - '\n'.join('- {}'.format('.'.join(u)) for u in unused) - ) - logger.info(dbt.ui.printer.yellow(msg)) - - def validate_version(self): - """Ensure this package works with the installed version of dbt.""" - installed = get_installed_version() - if not versions_compatible(*self.dbt_version): - msg = IMPOSSIBLE_VERSION_ERROR.format( - package=self.project_name, - version_spec=[ - x.to_version_string() for x in self.dbt_version - ] - ) - raise DbtProjectError(msg) - - if not versions_compatible(installed, *self.dbt_version): - msg = INVALID_VERSION_ERROR.format( - package=self.project_name, - installed=installed.to_version_string(), - version_spec=[ - x.to_version_string() for x in self.dbt_version - ] - ) - raise DbtProjectError(msg) - - -class UserConfig(object): - def __init__(self, send_anonymous_usage_stats, use_colors): - self.send_anonymous_usage_stats = send_anonymous_usage_stats - self.use_colors = use_colors - - @classmethod - def from_dict(cls, cfg=None): - if cfg is None: - cfg = {} - send_anonymous_usage_stats = cfg.get( - 'send_anonymous_usage_stats', - DEFAULT_SEND_ANONYMOUS_USAGE_STATS - ) - use_colors = cfg.get( - 'use_colors', - DEFAULT_USE_COLORS - ) - return cls(send_anonymous_usage_stats, use_colors) - - def to_dict(self): - return { - 'send_anonymous_usage_stats': self.send_anonymous_usage_stats, - 'use_colors': self.use_colors, - } - - @classmethod - def from_directory(cls, directory): - user_cfg = None - profile = read_profile(directory) - if profile: - user_cfg = profile.get('config', {}) - return cls.from_dict(user_cfg) - - -class Profile(object): - def __init__(self, profile_name, target_name, config, threads, - credentials): - self.profile_name = profile_name - self.target_name = target_name - if isinstance(config, dict): - config = UserConfig.from_dict(config) - self.config = config - self.threads = threads - self.credentials = credentials - - def to_profile_info(self, serialize_credentials=False): - """Unlike to_project_config, this dict is not a mirror of any existing - on-disk data structure. It's used when creating a new profile from an - existing one. - - :param serialize_credentials bool: If True, serialize the credentials. - Otherwise, the Credentials object will be copied. - :returns dict: The serialized profile. - """ - result = { - 'profile_name': self.profile_name, - 'target_name': self.target_name, - 'config': self.config.to_dict(), - 'threads': self.threads, - 'credentials': self.credentials.incorporate(), - } - if serialize_credentials: - result['credentials'] = result['credentials'].serialize() - return result - - def __str__(self): - return pprint.pformat(self.to_profile_info()) - - def __eq__(self, other): - if not (isinstance(other, self.__class__) and - isinstance(self, other.__class__)): - return False - return False - return self.to_profile_info() == other.to_profile_info() - - def validate(self): - if self.credentials: - self.credentials.validate() - try: - ProfileConfig(**self.to_profile_info(serialize_credentials=True)) - except dbt.exceptions.ValidationException as exc: - raise DbtProfileError(str(exc)) - - @staticmethod - def _credentials_from_profile(profile, profile_name, target_name): - # credentials carry their 'type' in their actual type, not their - # attributes. We do want this in order to pick our Credentials class. - if 'type' not in profile: - raise DbtProfileError( - 'required field "type" not found in profile {} and target {}' - .format(profile_name, target_name)) - - typename = profile.pop('type') - - try: - cls = load_adapter(typename) - credentials = cls(**profile) - except dbt.exceptions.RuntimeException as e: - raise DbtProfileError( - 'Credentials in profile "{}", target "{}" invalid: {}' - .format(profile_name, target_name, str(e)) - ) - return credentials - - @staticmethod - def pick_profile_name(args_profile_name, project_profile_name=None): - profile_name = project_profile_name - if args_profile_name is not None: - profile_name = args_profile_name - if profile_name is None: - raise DbtProjectError(NO_SUPPLIED_PROFILE_ERROR) - return profile_name - - @staticmethod - def _get_profile_data(profile, profile_name, target_name): - if 'outputs' not in profile: - raise DbtProfileError( - "outputs not specified in profile '{}'".format(profile_name) - ) - outputs = profile['outputs'] - - if target_name not in outputs: - outputs = '\n'.join(' - {}'.format(output) - for output in outputs) - msg = ("The profile '{}' does not have a target named '{}'. The " - "valid target names for this profile are:\n{}" - .format(profile_name, target_name, outputs)) - raise DbtProfileError(msg, result_type='invalid_target') - profile_data = outputs[target_name] - return profile_data - - @classmethod - def from_credentials(cls, credentials, threads, profile_name, target_name, - user_cfg=None): - """Create a profile from an existing set of Credentials and the - remaining information. - - :param credentials dict: The credentials dict for this profile. - :param threads int: The number of threads to use for connections. - :param profile_name str: The profile name used for this profile. - :param target_name str: The target name used for this profile. - :param user_cfg Optional[dict]: The user-level config block from the - raw profiles, if specified. - :raises DbtProfileError: If the profile is invalid. - :returns Profile: The new Profile object. - """ - config = UserConfig.from_dict(user_cfg) - profile = cls( - profile_name=profile_name, - target_name=target_name, - config=config, - threads=threads, - credentials=credentials - ) - profile.validate() - return profile - - @classmethod - def render_profile(cls, raw_profile, profile_name, target_override, - cli_vars): - """This is a containment zone for the hateful way we're rendering - profiles. - """ - renderer = ConfigRenderer(cli_vars=cli_vars) - - # rendering profiles is a bit complex. Two constraints cause trouble: - # 1) users should be able to use environment/cli variables to specify - # the target in their profile. - # 2) Missing environment/cli variables in profiles/targets that don't - # end up getting selected should not cause errors. - # so first we'll just render the target name, then we use that rendered - # name to extract a profile that we can render. - if target_override is not None: - target_name = target_override - elif 'target' in raw_profile: - # render the target if it was parsed from yaml - target_name = renderer.render_value(raw_profile['target']) - else: - target_name = 'default' - logger.debug( - "target not specified in profile '{}', using '{}'" - .format(profile_name, target_name) - ) - - raw_profile_data = cls._get_profile_data( - raw_profile, profile_name, target_name - ) - - profile_data = renderer.render_profile_data(raw_profile_data) - return target_name, profile_data - - @classmethod - def from_raw_profile_info(cls, raw_profile, profile_name, cli_vars, - user_cfg=None, target_override=None, - threads_override=None): - """Create a profile from its raw profile information. - - (this is an intermediate step, mostly useful for unit testing) - - :param raw_profile dict: The profile data for a single profile, from - disk as yaml and its values rendered with jinja. - :param profile_name str: The profile name used. - :param cli_vars dict: The command-line variables passed as arguments, - as a dict. - :param user_cfg Optional[dict]: The global config for the user, if it - was present. - :param target_override Optional[str]: The target to use, if provided on - the command line. - :param threads_override Optional[str]: The thread count to use, if - provided on the command line. - :raises DbtProfileError: If the profile is invalid or missing, or the - target could not be found - :returns Profile: The new Profile object. - """ - # user_cfg is not rendered since it only contains booleans. - # TODO: should it be, and the values coerced to bool? - target_name, profile_data = cls.render_profile( - raw_profile, profile_name, target_override, cli_vars - ) - - # valid connections never include the number of threads, but it's - # stored on a per-connection level in the raw configs - threads = profile_data.pop('threads', DEFAULT_THREADS) - if threads_override is not None: - threads = threads_override - - credentials = cls._credentials_from_profile( - profile_data, profile_name, target_name - ) - - return cls.from_credentials( - credentials=credentials, - profile_name=profile_name, - target_name=target_name, - threads=threads, - user_cfg=user_cfg - ) - - @classmethod - def from_raw_profiles(cls, raw_profiles, profile_name, cli_vars, - target_override=None, threads_override=None): - """ - :param raw_profiles dict: The profile data, from disk as yaml. - :param profile_name str: The profile name to use. - :param cli_vars dict: The command-line variables passed as arguments, - as a dict. - :param target_override Optional[str]: The target to use, if provided on - the command line. - :param threads_override Optional[str]: The thread count to use, if - provided on the command line. - :raises DbtProjectError: If there is no profile name specified in the - project or the command line arguments - :raises DbtProfileError: If the profile is invalid or missing, or the - target could not be found - :returns Profile: The new Profile object. - """ - if profile_name not in raw_profiles: - raise DbtProjectError( - "Could not find profile named '{}'".format(profile_name) - ) - - # First, we've already got our final decision on profile name, and we - # don't render keys, so we can pluck that out - raw_profile = raw_profiles[profile_name] - - user_cfg = raw_profiles.get('config') - - return cls.from_raw_profile_info( - raw_profile=raw_profile, - profile_name=profile_name, - cli_vars=cli_vars, - user_cfg=user_cfg, - target_override=target_override, - threads_override=threads_override, - ) - - @classmethod - def from_args(cls, args, project_profile_name=None, cli_vars=None): - """Given the raw profiles as read from disk and the name of the desired - profile if specified, return the profile component of the runtime - config. - - :param args argparse.Namespace: The arguments as parsed from the cli. - :param cli_vars dict: The command-line variables passed as arguments, - as a dict. - :param project_profile_name Optional[str]: The profile name, if - specified in a project. - :raises DbtProjectError: If there is no profile name specified in the - project or the command line arguments, or if the specified profile - is not found - :raises DbtProfileError: If the profile is invalid or missing, or the - target could not be found. - :returns Profile: The new Profile object. - """ - if cli_vars is None: - cli_vars = dbt.utils.parse_cli_vars(getattr(args, 'vars', '{}')) - - threads_override = getattr(args, 'threads', None) - target_override = getattr(args, 'target', None) - raw_profiles = read_profile(args.profiles_dir) - profile_name = cls.pick_profile_name(args.profile, - project_profile_name) - - return cls.from_raw_profiles( - raw_profiles=raw_profiles, - profile_name=profile_name, - cli_vars=cli_vars, - target_override=target_override, - threads_override=threads_override - ) - - -def package_config_from_data(packages_data): - if packages_data is None: - packages_data = {'packages': []} - - try: - packages = PackageConfig(**packages_data) - except dbt.exceptions.ValidationException as e: - raise DbtProjectError('Invalid package config: {}'.format(str(e))) - return packages - - -def package_data_from_root(project_root): - package_filepath = dbt.clients.system.resolve_path_from_base( - 'packages.yml', project_root - ) - - if dbt.clients.system.path_exists(package_filepath): - packages_dict = _load_yaml(package_filepath) - else: - packages_dict = None - return packages_dict - - -def package_config_from_root(project_root): - packages_dict = package_data_from_root(project_root) - return package_config_from_data(packages_dict) - - -class RuntimeConfig(Project, Profile): - """The runtime configuration, as constructed from its components. There's a - lot because there is a lot of stuff! - """ - def __init__(self, project_name, version, project_root, source_paths, - macro_paths, data_paths, test_paths, analysis_paths, - docs_paths, target_path, clean_targets, log_path, - modules_path, quoting, models, on_run_start, on_run_end, - archive, seeds, dbt_version, profile_name, target_name, - config, threads, credentials, packages, args): - # 'vars' - self.args = args - self.cli_vars = dbt.utils.parse_cli_vars(getattr(args, 'vars', '{}')) - # 'project' - Project.__init__( - self, - project_name=project_name, - version=version, - project_root=project_root, - profile_name=profile_name, - source_paths=source_paths, - macro_paths=macro_paths, - data_paths=data_paths, - test_paths=test_paths, - analysis_paths=analysis_paths, - docs_paths=docs_paths, - target_path=target_path, - clean_targets=clean_targets, - log_path=log_path, - modules_path=modules_path, - quoting=quoting, - models=models, - on_run_start=on_run_start, - on_run_end=on_run_end, - archive=archive, - seeds=seeds, - dbt_version=dbt_version, - packages=packages - ) - # 'profile' - Profile.__init__( - self, - profile_name=profile_name, - target_name=target_name, - config=config, - threads=threads, - credentials=credentials - ) - self.validate() - - @classmethod - def from_parts(cls, project, profile, args): - """Instantiate a RuntimeConfig from its components. - - :param profile Profile: A parsed dbt Profile. - :param project Project: A parsed dbt Project. - :param args argparse.Namespace: The parsed command-line arguments. - :returns RuntimeConfig: The new configuration. - """ - quoting = deepcopy( - get_relation_class_by_name(profile.credentials.type) - .DEFAULTS['quote_policy'] - ) - quoting.update(project.quoting) - return cls( - project_name=project.project_name, - version=project.version, - project_root=project.project_root, - source_paths=project.source_paths, - macro_paths=project.macro_paths, - data_paths=project.data_paths, - test_paths=project.test_paths, - analysis_paths=project.analysis_paths, - docs_paths=project.docs_paths, - target_path=project.target_path, - clean_targets=project.clean_targets, - log_path=project.log_path, - modules_path=project.modules_path, - quoting=quoting, - models=project.models, - on_run_start=project.on_run_start, - on_run_end=project.on_run_end, - archive=project.archive, - seeds=project.seeds, - dbt_version=project.dbt_version, - packages=project.packages, - profile_name=profile.profile_name, - target_name=profile.target_name, - config=profile.config, - threads=profile.threads, - credentials=profile.credentials, - args=args - ) - - def new_project(self, project_root): - """Given a new project root, read in its project dictionary, supply the - existing project's profile info, and create a new project file. - - :param project_root str: A filepath to a dbt project. - :raises DbtProfileError: If the profile is invalid. - :raises DbtProjectError: If project is missing or invalid. - :returns RuntimeConfig: The new configuration. - """ - # copy profile - profile = Profile(**self.to_profile_info()) - profile.validate() - # load the new project and its packages. Don't pass cli variables. - project = Project.from_project_root(project_root, {}) - - cfg = self.from_parts( - project=project, - profile=profile, - args=deepcopy(self.args), - ) - # force our quoting back onto the new project. - cfg.quoting = deepcopy(self.quoting) - return cfg - - def serialize(self): - """Serialize the full configuration to a single dictionary. For any - instance that has passed validate() (which happens in __init__), it - matches the Configuration contract. - - Note that args are not serialized. - - :returns dict: The serialized configuration. - """ - result = self.to_project_config(with_packages=True) - result.update(self.to_profile_info(serialize_credentials=True)) - result['cli_vars'] = deepcopy(self.cli_vars) - return result - - def __str__(self): - return pprint.pformat(self.serialize()) - - def validate(self): - """Validate the configuration against its contract. - - :raises DbtProjectError: If the configuration fails validation. - """ - try: - Configuration(**self.serialize()) - except dbt.exceptions.ValidationException as e: - raise DbtProjectError(str(e)) - - if getattr(self.args, 'version_check', False): - self.validate_version() - - @classmethod - def from_args(cls, args): - """Given arguments, read in dbt_project.yml from the current directory, - read in packages.yml if it exists, and use them to find the profile to - load. - - :param args argparse.Namespace: The arguments as parsed from the cli. - :raises DbtProjectError: If the project is invalid or missing. - :raises DbtProfileError: If the profile is invalid or missing. - :raises ValidationException: If the cli variables are invalid. - """ - cli_vars = dbt.utils.parse_cli_vars(getattr(args, 'vars', '{}')) - - # build the project and read in packages.yml - project = Project.from_current_directory(cli_vars) - - # build the profile - profile = Profile.from_args( - args=args, - project_profile_name=project.profile_name, - cli_vars=cli_vars - ) - - return cls.from_parts( - project=project, - profile=profile, - args=args - ) - - -def _load_yaml(path): - contents = dbt.clients.system.load_file_contents(path) - return dbt.clients.yaml_helper.load_yaml_text(contents) - - -def _get_config_paths(config, path=(), paths=None): - if paths is None: - paths = set() - - for key, value in config.items(): - if isinstance(value, dict): - if key in DBTConfigKeys: - if path not in paths: - paths.add(path) - else: - _get_config_paths(value, path + (key,), paths) - else: - if path not in paths: - paths.add(path) - - return frozenset(paths) - - -def _is_config_used(path, fqns): - if fqns: - for fqn in fqns: - if len(path) <= len(fqn) and fqn[:len(path)] == path: - return True - return False diff --git a/dbt/include/__init__.py b/dbt/include/__init__.py deleted file mode 100644 index 4a940f8a518..00000000000 --- a/dbt/include/__init__.py +++ /dev/null @@ -1,8 +0,0 @@ - -import os - -GLOBAL_DBT_MODULES_PATH = os.path.dirname(__file__) -GLOBAL_PROJECT_NAME = 'dbt' - -DOCS_INDEX_FILE_PATH = os.path.normpath( - os.path.join(GLOBAL_DBT_MODULES_PATH, "index.html")) diff --git a/dbt/task/__init__.py b/dbt/task/__init__.py deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/dbt/templates.py b/dbt/templates.py deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/dbt/ui/__init__.py b/dbt/ui/__init__.py deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/plugins/bigquery/dbt/__init__.py b/plugins/bigquery/dbt/__init__.py new file mode 100644 index 00000000000..69e3be50dac --- /dev/null +++ b/plugins/bigquery/dbt/__init__.py @@ -0,0 +1 @@ +__path__ = __import__('pkgutil').extend_path(__path__, __name__) diff --git a/plugins/bigquery/dbt/adapters/__init__.py b/plugins/bigquery/dbt/adapters/__init__.py new file mode 100644 index 00000000000..69e3be50dac --- /dev/null +++ b/plugins/bigquery/dbt/adapters/__init__.py @@ -0,0 +1 @@ +__path__ = __import__('pkgutil').extend_path(__path__, __name__) diff --git a/dbt/adapters/bigquery/__init__.py b/plugins/bigquery/dbt/adapters/bigquery/__init__.py similarity index 54% rename from dbt/adapters/bigquery/__init__.py rename to plugins/bigquery/dbt/adapters/bigquery/__init__.py index c9822036cf6..5707c1690e9 100644 --- a/dbt/adapters/bigquery/__init__.py +++ b/plugins/bigquery/dbt/adapters/bigquery/__init__.py @@ -3,5 +3,10 @@ from dbt.adapters.bigquery.relation import BigQueryRelation from dbt.adapters.bigquery.impl import BigQueryAdapter -Adapter = BigQueryAdapter -Credentials = BigQueryCredentials +from dbt.adapters.base import AdapterPlugin +from dbt.include import bigquery + +Plugin = AdapterPlugin( + adapter=BigQueryAdapter, + credentials=BigQueryCredentials, + include_path=bigquery.PACKAGE_PATH) diff --git a/dbt/adapters/bigquery/connections.py b/plugins/bigquery/dbt/adapters/bigquery/connections.py similarity index 100% rename from dbt/adapters/bigquery/connections.py rename to plugins/bigquery/dbt/adapters/bigquery/connections.py diff --git a/dbt/adapters/bigquery/impl.py b/plugins/bigquery/dbt/adapters/bigquery/impl.py similarity index 100% rename from dbt/adapters/bigquery/impl.py rename to plugins/bigquery/dbt/adapters/bigquery/impl.py diff --git a/dbt/adapters/bigquery/relation.py b/plugins/bigquery/dbt/adapters/bigquery/relation.py similarity index 100% rename from dbt/adapters/bigquery/relation.py rename to plugins/bigquery/dbt/adapters/bigquery/relation.py diff --git a/plugins/bigquery/dbt/include/__init__.py b/plugins/bigquery/dbt/include/__init__.py new file mode 100644 index 00000000000..69e3be50dac --- /dev/null +++ b/plugins/bigquery/dbt/include/__init__.py @@ -0,0 +1 @@ +__path__ = __import__('pkgutil').extend_path(__path__, __name__) diff --git a/plugins/bigquery/dbt/include/bigquery/__init__.py b/plugins/bigquery/dbt/include/bigquery/__init__.py new file mode 100644 index 00000000000..87098354afd --- /dev/null +++ b/plugins/bigquery/dbt/include/bigquery/__init__.py @@ -0,0 +1,2 @@ +import os +PACKAGE_PATH = os.path.dirname(os.path.dirname(__file__)) diff --git a/plugins/bigquery/dbt/include/bigquery/dbt_project.yml b/plugins/bigquery/dbt/include/bigquery/dbt_project.yml new file mode 100644 index 00000000000..edae5386994 --- /dev/null +++ b/plugins/bigquery/dbt/include/bigquery/dbt_project.yml @@ -0,0 +1,5 @@ + +name: dbt_bigquery +version: 1.0 + +macro-paths: ["macros"] diff --git a/dbt/include/global_project/macros/adapters/bigquery.sql b/plugins/bigquery/dbt/include/bigquery/macros/adapters.sql similarity index 100% rename from dbt/include/global_project/macros/adapters/bigquery.sql rename to plugins/bigquery/dbt/include/bigquery/macros/adapters.sql diff --git a/dbt/include/global_project/macros/etc/bigquery.sql b/plugins/bigquery/dbt/include/bigquery/macros/etc.sql similarity index 100% rename from dbt/include/global_project/macros/etc/bigquery.sql rename to plugins/bigquery/dbt/include/bigquery/macros/etc.sql diff --git a/plugins/bigquery/dbt/include/bigquery/macros/materializations/archive.sql b/plugins/bigquery/dbt/include/bigquery/macros/materializations/archive.sql new file mode 100644 index 00000000000..5548b71a7e8 --- /dev/null +++ b/plugins/bigquery/dbt/include/bigquery/macros/materializations/archive.sql @@ -0,0 +1,23 @@ +{% macro bigquery__create_temporary_table(sql, relation) %} + {% set tmp_relation = adapter.create_temporary_table(sql) %} + {{ return(tmp_relation) }} +{% endmacro %} + + +{% macro bigquery__archive_scd_hash() %} + to_hex(md5(concat(cast(`dbt_pk` as string), '|', cast(`dbt_updated_at` as string)))) +{% endmacro %} + + +{% macro bigquery__create_columns(relation, columns) %} + {{ adapter.alter_table_add_columns(relation, columns) }} +{% endmacro %} + + +{% macro bigquery__archive_update(target_relation, tmp_relation) %} + update {{ target_relation }} as dest + set dest.{{ adapter.quote('valid_to') }} = tmp.{{ adapter.quote('valid_to') }} + from {{ tmp_relation }} as tmp + where tmp.{{ adapter.quote('scd_id') }} = dest.{{ adapter.quote('scd_id') }} + and {{ adapter.quote('change_type') }} = 'update'; +{% endmacro %} diff --git a/dbt/include/global_project/macros/materializations/incremental/bigquery_incremental.sql b/plugins/bigquery/dbt/include/bigquery/macros/materializations/incremental.sql similarity index 100% rename from dbt/include/global_project/macros/materializations/incremental/bigquery_incremental.sql rename to plugins/bigquery/dbt/include/bigquery/macros/materializations/incremental.sql diff --git a/plugins/bigquery/dbt/include/bigquery/macros/materializations/merge.sql b/plugins/bigquery/dbt/include/bigquery/macros/materializations/merge.sql new file mode 100644 index 00000000000..8e8f42a3563 --- /dev/null +++ b/plugins/bigquery/dbt/include/bigquery/macros/materializations/merge.sql @@ -0,0 +1,3 @@ +{% macro bigquery__get_merge_sql(target, source, unique_key, dest_columns) %} + {{ common_get_merge_sql(target, source, unique_key, dest_columns) }} +{% endmacro %} diff --git a/dbt/include/global_project/macros/materializations/seed/bigquery.sql b/plugins/bigquery/dbt/include/bigquery/macros/materializations/seed.sql similarity index 100% rename from dbt/include/global_project/macros/materializations/seed/bigquery.sql rename to plugins/bigquery/dbt/include/bigquery/macros/materializations/seed.sql diff --git a/dbt/include/global_project/macros/materializations/table/bigquery_table.sql b/plugins/bigquery/dbt/include/bigquery/macros/materializations/table.sql similarity index 100% rename from dbt/include/global_project/macros/materializations/table/bigquery_table.sql rename to plugins/bigquery/dbt/include/bigquery/macros/materializations/table.sql diff --git a/plugins/bigquery/dbt/include/bigquery/macros/materializations/view.sql b/plugins/bigquery/dbt/include/bigquery/macros/materializations/view.sql new file mode 100644 index 00000000000..561c38bb5c3 --- /dev/null +++ b/plugins/bigquery/dbt/include/bigquery/macros/materializations/view.sql @@ -0,0 +1,13 @@ + +{% macro bigquery__handle_existing_table(full_refresh, non_destructive_mode, old_relation) %} + {%- if full_refresh and not non_destructive_mode -%} + {{ adapter.drop_relation(old_relation) }} + {%- else -%} + {{ exceptions.relation_wrong_type(old_relation, 'view') }} + {%- endif -%} +{% endmacro %} + + +{% materialization view, adapter='bigquery' -%} + {{ create_or_replace_view(run_outside_transaction_hooks=False) }} +{%- endmaterialization %} diff --git a/plugins/bigquery/setup.py b/plugins/bigquery/setup.py new file mode 100644 index 00000000000..5c743575d46 --- /dev/null +++ b/plugins/bigquery/setup.py @@ -0,0 +1,29 @@ +#!/usr/bin/env python +from setuptools import find_packages +from distutils.core import setup + +package_name = "dbt-bigquery" +package_version = "0.13.0a1" +description = """The bigquery adapter plugin for dbt (data build tool)""" + + +setup( + name=package_name, + version=package_version, + description=description, + long_description_content_type=description, + author="Fishtown Analytics", + author_email="info@fishtownanalytics.com", + url="https://github.com/fishtown-analytics/dbt", + packages=find_packages(), + package_data={ + 'dbt': [ + 'include/bigquery/macros/*.sql', + 'include/bigquery/macros/**/*.sql', + ] + }, + install_requires=[ + 'dbt-core=={}'.format(package_version), + 'google-cloud-bigquery>=1.0.0,<2', + ] +) diff --git a/plugins/postgres/dbt/__init__.py b/plugins/postgres/dbt/__init__.py new file mode 100644 index 00000000000..69e3be50dac --- /dev/null +++ b/plugins/postgres/dbt/__init__.py @@ -0,0 +1 @@ +__path__ = __import__('pkgutil').extend_path(__path__, __name__) diff --git a/plugins/postgres/dbt/adapters/__init__.py b/plugins/postgres/dbt/adapters/__init__.py new file mode 100644 index 00000000000..69e3be50dac --- /dev/null +++ b/plugins/postgres/dbt/adapters/__init__.py @@ -0,0 +1 @@ +__path__ = __import__('pkgutil').extend_path(__path__, __name__) diff --git a/plugins/postgres/dbt/adapters/postgres/__init__.py b/plugins/postgres/dbt/adapters/postgres/__init__.py new file mode 100644 index 00000000000..f139484e807 --- /dev/null +++ b/plugins/postgres/dbt/adapters/postgres/__init__.py @@ -0,0 +1,11 @@ +from dbt.adapters.postgres.connections import PostgresConnectionManager +from dbt.adapters.postgres.connections import PostgresCredentials +from dbt.adapters.postgres.impl import PostgresAdapter + +from dbt.adapters.base import AdapterPlugin +from dbt.include import postgres + +Plugin = AdapterPlugin( + adapter=PostgresAdapter, + credentials=PostgresCredentials, + include_path=postgres.PACKAGE_PATH) diff --git a/dbt/adapters/postgres/connections.py b/plugins/postgres/dbt/adapters/postgres/connections.py similarity index 100% rename from dbt/adapters/postgres/connections.py rename to plugins/postgres/dbt/adapters/postgres/connections.py diff --git a/dbt/adapters/postgres/impl.py b/plugins/postgres/dbt/adapters/postgres/impl.py similarity index 100% rename from dbt/adapters/postgres/impl.py rename to plugins/postgres/dbt/adapters/postgres/impl.py diff --git a/plugins/postgres/dbt/include/__init__.py b/plugins/postgres/dbt/include/__init__.py new file mode 100644 index 00000000000..69e3be50dac --- /dev/null +++ b/plugins/postgres/dbt/include/__init__.py @@ -0,0 +1 @@ +__path__ = __import__('pkgutil').extend_path(__path__, __name__) diff --git a/plugins/postgres/dbt/include/postgres/__init__.py b/plugins/postgres/dbt/include/postgres/__init__.py new file mode 100644 index 00000000000..87098354afd --- /dev/null +++ b/plugins/postgres/dbt/include/postgres/__init__.py @@ -0,0 +1,2 @@ +import os +PACKAGE_PATH = os.path.dirname(os.path.dirname(__file__)) diff --git a/plugins/postgres/dbt/include/postgres/dbt_project.yml b/plugins/postgres/dbt/include/postgres/dbt_project.yml new file mode 100644 index 00000000000..266eba33db9 --- /dev/null +++ b/plugins/postgres/dbt/include/postgres/dbt_project.yml @@ -0,0 +1,5 @@ + +name: dbt_postgres +version: 1.0 + +macro-paths: ["macros"] diff --git a/dbt/include/global_project/macros/catalog/postgres_catalog.sql b/plugins/postgres/dbt/include/postgres/macros/catalog.sql similarity index 100% rename from dbt/include/global_project/macros/catalog/postgres_catalog.sql rename to plugins/postgres/dbt/include/postgres/macros/catalog.sql diff --git a/dbt/include/global_project/macros/relations/postgres_relations.sql b/plugins/postgres/dbt/include/postgres/macros/relations.sql similarity index 100% rename from dbt/include/global_project/macros/relations/postgres_relations.sql rename to plugins/postgres/dbt/include/postgres/macros/relations.sql diff --git a/plugins/postgres/setup.py b/plugins/postgres/setup.py new file mode 100644 index 00000000000..c91de0f680a --- /dev/null +++ b/plugins/postgres/setup.py @@ -0,0 +1,27 @@ +#!/usr/bin/env python +from setuptools import find_packages +from distutils.core import setup + +package_name = "dbt-postgres" +package_version = "0.13.0a1" +description = """The postgres adpter plugin for dbt (data build tool)""" + +setup( + name=package_name, + version=package_version, + description=description, + long_description_content_type=description, + author="Fishtown Analytics", + author_email="info@fishtownanalytics.com", + url="https://github.com/fishtown-analytics/dbt", + packages=find_packages(), + package_data={ + 'dbt': [ + 'include/postgres/macros/*.sql', + ] + }, + install_requires=[ + 'dbt-core=={}'.format(package_version), + 'psycopg2>=2.7.5,<2.8', + ] +) diff --git a/plugins/redshift/dbt/__init__.py b/plugins/redshift/dbt/__init__.py new file mode 100644 index 00000000000..69e3be50dac --- /dev/null +++ b/plugins/redshift/dbt/__init__.py @@ -0,0 +1 @@ +__path__ = __import__('pkgutil').extend_path(__path__, __name__) diff --git a/plugins/redshift/dbt/adapters/__init__.py b/plugins/redshift/dbt/adapters/__init__.py new file mode 100644 index 00000000000..69e3be50dac --- /dev/null +++ b/plugins/redshift/dbt/adapters/__init__.py @@ -0,0 +1 @@ +__path__ = __import__('pkgutil').extend_path(__path__, __name__) diff --git a/plugins/redshift/dbt/adapters/redshift/__init__.py b/plugins/redshift/dbt/adapters/redshift/__init__.py new file mode 100644 index 00000000000..336eb55d17d --- /dev/null +++ b/plugins/redshift/dbt/adapters/redshift/__init__.py @@ -0,0 +1,13 @@ +from dbt.adapters.redshift.connections import RedshiftConnectionManager +from dbt.adapters.redshift.connections import RedshiftCredentials +from dbt.adapters.redshift.impl import RedshiftAdapter + + +from dbt.adapters.base import AdapterPlugin +from dbt.include import redshift + +Plugin = AdapterPlugin( + adapter=RedshiftAdapter, + credentials=RedshiftCredentials, + include_path=redshift.PACKAGE_PATH, + dependencies=['postgres']) diff --git a/dbt/adapters/redshift/connections.py b/plugins/redshift/dbt/adapters/redshift/connections.py similarity index 100% rename from dbt/adapters/redshift/connections.py rename to plugins/redshift/dbt/adapters/redshift/connections.py diff --git a/dbt/adapters/redshift/impl.py b/plugins/redshift/dbt/adapters/redshift/impl.py similarity index 100% rename from dbt/adapters/redshift/impl.py rename to plugins/redshift/dbt/adapters/redshift/impl.py diff --git a/plugins/redshift/dbt/include/__init__.py b/plugins/redshift/dbt/include/__init__.py new file mode 100644 index 00000000000..69e3be50dac --- /dev/null +++ b/plugins/redshift/dbt/include/__init__.py @@ -0,0 +1 @@ +__path__ = __import__('pkgutil').extend_path(__path__, __name__) diff --git a/plugins/redshift/dbt/include/redshift/__init__.py b/plugins/redshift/dbt/include/redshift/__init__.py new file mode 100644 index 00000000000..ef10d7896ca --- /dev/null +++ b/plugins/redshift/dbt/include/redshift/__init__.py @@ -0,0 +1,3 @@ +import os +from dbt.include.postgres import PACKAGE_PATH as POSTGRES_PACKAGE_PATH +PACKAGE_PATH = os.path.dirname(os.path.dirname(__file__)) diff --git a/plugins/redshift/dbt/include/redshift/dbt_project.yml b/plugins/redshift/dbt/include/redshift/dbt_project.yml new file mode 100644 index 00000000000..edcd805ab7a --- /dev/null +++ b/plugins/redshift/dbt/include/redshift/dbt_project.yml @@ -0,0 +1,5 @@ + +name: dbt_redshift +version: 1.0 + +macro-paths: ["macros"] diff --git a/dbt/include/global_project/macros/adapters/redshift.sql b/plugins/redshift/dbt/include/redshift/macros/adapters.sql similarity index 100% rename from dbt/include/global_project/macros/adapters/redshift.sql rename to plugins/redshift/dbt/include/redshift/macros/adapters.sql diff --git a/dbt/include/global_project/macros/catalog/redshift_catalog.sql b/plugins/redshift/dbt/include/redshift/macros/catalog.sql similarity index 100% rename from dbt/include/global_project/macros/catalog/redshift_catalog.sql rename to plugins/redshift/dbt/include/redshift/macros/catalog.sql diff --git a/dbt/include/global_project/macros/relations/redshift_relations.sql b/plugins/redshift/dbt/include/redshift/macros/relations.sql similarity index 100% rename from dbt/include/global_project/macros/relations/redshift_relations.sql rename to plugins/redshift/dbt/include/redshift/macros/relations.sql diff --git a/plugins/redshift/setup.py b/plugins/redshift/setup.py new file mode 100644 index 00000000000..a62328edf0d --- /dev/null +++ b/plugins/redshift/setup.py @@ -0,0 +1,31 @@ +#!/usr/bin/env python +from setuptools import find_packages +from distutils.core import setup + +package_name = "dbt-redshift" +package_version = "0.13.0a1" +description = """The redshift adapter plugin for dbt (data build tool)""" + + +setup( + name=package_name, + version=package_version, + description=description, + long_description_content_type=description, + author="Fishtown Analytics", + author_email="info@fishtownanalytics.com", + url="https://github.com/fishtown-analytics/dbt", + packages=find_packages(), + package_data={ + 'dbt': [ + 'include/redshift/macros/*.sql', + ] + }, + install_requires=[ + 'dbt-core=={}'.format(package_version), + 'dbt-postgres=={}'.format(package_version), + 'boto3>=1.6.23,<1.8.0', + 'botocore>=1.9.23,<1.11.0', + 'psycopg2>=2.7.5,<2.8', + ] +) diff --git a/plugins/snowflake/dbt/__init__.py b/plugins/snowflake/dbt/__init__.py new file mode 100644 index 00000000000..69e3be50dac --- /dev/null +++ b/plugins/snowflake/dbt/__init__.py @@ -0,0 +1 @@ +__path__ = __import__('pkgutil').extend_path(__path__, __name__) diff --git a/plugins/snowflake/dbt/adapters/__init__.py b/plugins/snowflake/dbt/adapters/__init__.py new file mode 100644 index 00000000000..69e3be50dac --- /dev/null +++ b/plugins/snowflake/dbt/adapters/__init__.py @@ -0,0 +1 @@ +__path__ = __import__('pkgutil').extend_path(__path__, __name__) diff --git a/dbt/adapters/snowflake/__init__.py b/plugins/snowflake/dbt/adapters/snowflake/__init__.py similarity index 55% rename from dbt/adapters/snowflake/__init__.py rename to plugins/snowflake/dbt/adapters/snowflake/__init__.py index c2b982df79a..1ac7dcbdf2f 100644 --- a/dbt/adapters/snowflake/__init__.py +++ b/plugins/snowflake/dbt/adapters/snowflake/__init__.py @@ -3,6 +3,10 @@ from dbt.adapters.snowflake.relation import SnowflakeRelation from dbt.adapters.snowflake.impl import SnowflakeAdapter +from dbt.adapters.base import AdapterPlugin +from dbt.include import snowflake -Adapter = SnowflakeAdapter -Credentials = SnowflakeCredentials +Plugin = AdapterPlugin( + adapter=SnowflakeAdapter, + credentials=SnowflakeCredentials, + include_path=snowflake.PACKAGE_PATH) diff --git a/dbt/adapters/snowflake/connections.py b/plugins/snowflake/dbt/adapters/snowflake/connections.py similarity index 100% rename from dbt/adapters/snowflake/connections.py rename to plugins/snowflake/dbt/adapters/snowflake/connections.py diff --git a/dbt/adapters/snowflake/impl.py b/plugins/snowflake/dbt/adapters/snowflake/impl.py similarity index 100% rename from dbt/adapters/snowflake/impl.py rename to plugins/snowflake/dbt/adapters/snowflake/impl.py diff --git a/dbt/adapters/snowflake/relation.py b/plugins/snowflake/dbt/adapters/snowflake/relation.py similarity index 100% rename from dbt/adapters/snowflake/relation.py rename to plugins/snowflake/dbt/adapters/snowflake/relation.py diff --git a/plugins/snowflake/dbt/include/__init__.py b/plugins/snowflake/dbt/include/__init__.py new file mode 100644 index 00000000000..69e3be50dac --- /dev/null +++ b/plugins/snowflake/dbt/include/__init__.py @@ -0,0 +1 @@ +__path__ = __import__('pkgutil').extend_path(__path__, __name__) diff --git a/plugins/snowflake/dbt/include/snowflake/__init__.py b/plugins/snowflake/dbt/include/snowflake/__init__.py new file mode 100644 index 00000000000..87098354afd --- /dev/null +++ b/plugins/snowflake/dbt/include/snowflake/__init__.py @@ -0,0 +1,2 @@ +import os +PACKAGE_PATH = os.path.dirname(os.path.dirname(__file__)) diff --git a/plugins/snowflake/dbt/include/snowflake/dbt_project.yml b/plugins/snowflake/dbt/include/snowflake/dbt_project.yml new file mode 100644 index 00000000000..587a22b5232 --- /dev/null +++ b/plugins/snowflake/dbt/include/snowflake/dbt_project.yml @@ -0,0 +1,5 @@ + +name: dbt_snowflake +version: 1.0 + +macro-paths: ["macros"] diff --git a/dbt/include/global_project/macros/adapters/snowflake.sql b/plugins/snowflake/dbt/include/snowflake/macros/adapters.sql similarity index 100% rename from dbt/include/global_project/macros/adapters/snowflake.sql rename to plugins/snowflake/dbt/include/snowflake/macros/adapters.sql diff --git a/dbt/include/global_project/macros/catalog/snowflake_catalog.sql b/plugins/snowflake/dbt/include/snowflake/macros/catalog.sql similarity index 100% rename from dbt/include/global_project/macros/catalog/snowflake_catalog.sql rename to plugins/snowflake/dbt/include/snowflake/macros/catalog.sql diff --git a/plugins/snowflake/dbt/include/snowflake/macros/materializations/merge.sql b/plugins/snowflake/dbt/include/snowflake/macros/materializations/merge.sql new file mode 100644 index 00000000000..ac92f2ef26e --- /dev/null +++ b/plugins/snowflake/dbt/include/snowflake/macros/materializations/merge.sql @@ -0,0 +1,3 @@ +{% macro snowflake__get_merge_sql(target, source, unique_key, dest_columns) %} + {{ common_get_merge_sql(target, source, unique_key, dest_columns) }} +{% endmacro %} diff --git a/dbt/include/global_project/macros/materializations/table/snowflake_table.sql b/plugins/snowflake/dbt/include/snowflake/macros/materializations/table.sql similarity index 100% rename from dbt/include/global_project/macros/materializations/table/snowflake_table.sql rename to plugins/snowflake/dbt/include/snowflake/macros/materializations/table.sql diff --git a/plugins/snowflake/dbt/include/snowflake/macros/materializations/view.sql b/plugins/snowflake/dbt/include/snowflake/macros/materializations/view.sql new file mode 100644 index 00000000000..d1dde6e052a --- /dev/null +++ b/plugins/snowflake/dbt/include/snowflake/macros/materializations/view.sql @@ -0,0 +1,3 @@ +{% materialization view, adapter='snowflake' -%} + {{ create_or_replace_view() }} +{%- endmaterialization %} diff --git a/plugins/snowflake/setup.py b/plugins/snowflake/setup.py new file mode 100644 index 00000000000..24be4e60ee1 --- /dev/null +++ b/plugins/snowflake/setup.py @@ -0,0 +1,31 @@ +#!/usr/bin/env python +from setuptools import find_packages +from distutils.core import setup + +package_name = "dbt-snowflake" +package_version = "0.13.0a1" +description = """The snowflake adapter plugin for dbt (data build tool)""" + + +setup( + name=package_name, + version=package_version, + description=description, + long_description_content_type=description, + author="Fishtown Analytics", + author_email="info@fishtownanalytics.com", + url="https://github.com/fishtown-analytics/dbt", + packages=find_packages(), + package_data={ + 'dbt': [ + 'include/snowflake/macros/*.sql', + 'include/snowflake/macros/**/*.sql', + ] + }, + install_requires=[ + 'dbt-core=={}'.format(package_version), + 'snowflake-connector-python>=1.4.9', + 'boto3>=1.6.23,<1.8.0', + 'botocore>=1.9.23,<1.11.0', + ] +) diff --git a/requirements.txt b/requirements.txt index c84b33a5a62..1c185b37d46 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1 +1,5 @@ --e .[postgres,snowflake,redshift,bigquery] +-e ./core +-e ./plugins/postgres +-e ./plugins/redshift +-e ./plugins/snowflake +-e ./plugins/bigquery diff --git a/test/integration/006_simple_dependency_test/test_local_dependency.py b/test/integration/006_simple_dependency_test/test_local_dependency.py index d09aa9de848..17c4c50e16f 100644 --- a/test/integration/006_simple_dependency_test/test_local_dependency.py +++ b/test/integration/006_simple_dependency_test/test_local_dependency.py @@ -63,7 +63,7 @@ def configured_schema(self): return 'configured_{}_macro'.format(self.unique_schema()) @attr(type='postgres') - @mock.patch('dbt.config.get_installed_version') + @mock.patch('dbt.config.project.get_installed_version') def test_postgres_local_dependency_out_of_date(self, mock_get): mock_get.return_value = dbt.semver.VersionSpecifier.from_version_string('0.0.1') self.run_dbt(['deps']) @@ -72,7 +72,7 @@ def test_postgres_local_dependency_out_of_date(self, mock_get): self.assertIn('--no-version-check', str(e.exception)) @attr(type='postgres') - @mock.patch('dbt.config.get_installed_version') + @mock.patch('dbt.config.project.get_installed_version') def test_postgres_local_dependency_out_of_date_no_check(self, mock_get): mock_get.return_value = dbt.semver.VersionSpecifier.from_version_string('0.0.1') self.run_dbt(['deps']) diff --git a/test/integration/029_docs_generate_tests/test_docs_generate.py b/test/integration/029_docs_generate_tests/test_docs_generate.py index 3e85e3122ce..979cf12f7b3 100644 --- a/test/integration/029_docs_generate_tests/test_docs_generate.py +++ b/test/integration/029_docs_generate_tests/test_docs_generate.py @@ -30,6 +30,19 @@ def _read_file(path): return fp.read() +def _normalize(path): + """On windows, neither is enough on its own: + + >>> normcase('C:\\documents/ALL CAPS/subdir\\..') + 'c:\\documents\\all caps\\subdir\\..' + >>> normpath('C:\\documents/ALL CAPS/subdir\\..') + 'C:\\documents\\ALL CAPS' + >>> normpath(normcase('C:\\documents/ALL CAPS/subdir\\..')) + 'c:\\documents\\all caps' + """ + return os.path.normcase(os.path.normpath(path)) + + class TestDocsGenerate(DBTIntegrationTest): def setUp(self): super(TestDocsGenerate,self).setUp() @@ -41,8 +54,9 @@ def schema(self): @staticmethod def dir(path): - return os.path.normpath( - os.path.join('test/integration/029_docs_generate_tests', path)) + return _normalize( + os.path.join('test/integration/029_docs_generate_tests', path) + ) @property def models(self): @@ -77,8 +91,8 @@ def run_and_generate(self, extra=None, seed_count=1, model_count=1): self.assertEqual(len(self.run_dbt(["seed"])), seed_count) self.assertEqual(len(self.run_dbt()), model_count) - os.remove(os.path.normpath('target/manifest.json')) - os.remove(os.path.normpath('target/run_results.json')) + os.remove(_normalize('target/manifest.json')) + os.remove(_normalize('target/run_results.json')) self.generate_start_time = datetime.utcnow() self.run_dbt(['docs', 'generate']) @@ -717,15 +731,16 @@ def verify_manifest_macros(self, manifest): self.assertTrue(len(macro['raw_sql']) > 10) without_sql = {k: v for k, v in macro.items() if k != 'raw_sql'} # Windows means we can't hard-code this. - helpers_path = os.path.normpath('macros/materializations/helpers.sql') + helpers_path = _normalize('macros/materializations/helpers.sql') self.assertEqual( without_sql, { 'path': helpers_path, 'original_file_path': helpers_path, 'package_name': 'dbt', - 'root_path': os.path.join(os.getcwd(), 'dbt','include', - 'global_project'), + 'root_path': _normalize(os.path.join( + os.getcwd(), 'core', 'dbt','include', 'global_project' + )), 'name': 'column_list', 'unique_id': 'macro.dbt.column_list', 'tags': [], @@ -843,7 +858,7 @@ def expected_seeded_manifest(self): 'name': 'not_null_model_id', 'original_file_path': self.dir('models/schema.yml'), 'package_name': 'test', - 'path': os.path.normpath('schema_test/not_null_model_id.sql'), + 'path': _normalize('schema_test/not_null_model_id.sql'), 'raw_sql': "{{ test_not_null(model=ref('model'), column_name='id') }}", 'refs': [['model']], 'resource_type': 'test', @@ -872,7 +887,7 @@ def expected_seeded_manifest(self): 'name': 'nothing_model_', 'original_file_path': self.dir('models/schema.yml'), 'package_name': 'test', - 'path': os.path.normpath('schema_test/nothing_model_.sql'), + 'path': _normalize('schema_test/nothing_model_.sql'), 'raw_sql': "{{ test_nothing(model=ref('model'), ) }}", 'refs': [['model']], 'resource_type': 'test', @@ -902,7 +917,7 @@ def expected_seeded_manifest(self): 'name': 'unique_model_id', 'original_file_path': self.dir('models/schema.yml'), 'package_name': 'test', - 'path': os.path.normpath('schema_test/unique_model_id.sql'), + 'path': _normalize('schema_test/unique_model_id.sql'), 'raw_sql': "{{ test_unique(model=ref('model'), column_name='id') }}", 'refs': [['model']], 'resource_type': 'test', @@ -1633,7 +1648,7 @@ def expected_run_results(self, quote_schema=True, quote_model=False): 'fail': None, 'node': { 'alias': 'model', - 'build_path': os.path.normpath( + 'build_path': _normalize( 'target/compiled/test/model.sql' ), 'columns': { @@ -1689,7 +1704,7 @@ def expected_run_results(self, quote_schema=True, quote_model=False): 'fail': None, 'node': { 'alias': 'seed', - 'build_path': os.path.normpath( + 'build_path': _normalize( 'target/compiled/test/seed.csv' ), 'columns': {}, @@ -1734,7 +1749,7 @@ def expected_run_results(self, quote_schema=True, quote_model=False): 'fail': None, 'node': { 'alias': 'not_null_model_id', - 'build_path': os.path.normpath('target/compiled/test/schema_test/not_null_model_id.sql'), + 'build_path': _normalize('target/compiled/test/schema_test/not_null_model_id.sql'), 'column_name': 'id', 'columns': {}, 'compiled': True, @@ -1759,7 +1774,7 @@ def expected_run_results(self, quote_schema=True, quote_model=False): 'name': 'not_null_model_id', 'original_file_path': self.dir('models/schema.yml'), 'package_name': 'test', - 'path': os.path.normpath('schema_test/not_null_model_id.sql'), + 'path': _normalize('schema_test/not_null_model_id.sql'), 'raw_sql': "{{ test_not_null(model=ref('model'), column_name='id') }}", 'refs': [['model']], 'resource_type': 'test', @@ -1778,7 +1793,7 @@ def expected_run_results(self, quote_schema=True, quote_model=False): 'fail': None, 'node': { 'alias': 'nothing_model_', - 'build_path': os.path.normpath('target/compiled/test/schema_test/nothing_model_.sql'), + 'build_path': _normalize('target/compiled/test/schema_test/nothing_model_.sql'), 'columns': {}, 'compiled': True, 'compiled_sql': AnyStringWith('select 0'), @@ -1802,7 +1817,7 @@ def expected_run_results(self, quote_schema=True, quote_model=False): 'name': 'nothing_model_', 'original_file_path': self.dir('models/schema.yml'), 'package_name': 'test', - 'path': os.path.normpath('schema_test/nothing_model_.sql'), + 'path': _normalize('schema_test/nothing_model_.sql'), 'raw_sql': "{{ test_nothing(model=ref('model'), ) }}", 'refs': [['model']], 'resource_type': 'test', @@ -1821,7 +1836,7 @@ def expected_run_results(self, quote_schema=True, quote_model=False): 'fail': None, 'node': { 'alias': 'unique_model_id', - 'build_path': os.path.normpath('target/compiled/test/schema_test/unique_model_id.sql'), + 'build_path': _normalize('target/compiled/test/schema_test/unique_model_id.sql'), 'column_name': 'id', 'columns': {}, 'compiled': True, @@ -1846,7 +1861,7 @@ def expected_run_results(self, quote_schema=True, quote_model=False): 'name': 'unique_model_id', 'original_file_path': self.dir('models/schema.yml'), 'package_name': 'test', - 'path': os.path.normpath('schema_test/unique_model_id.sql'), + 'path': _normalize('schema_test/unique_model_id.sql'), 'raw_sql': "{{ test_unique(model=ref('model'), column_name='id') }}", 'refs': [['model']], 'resource_type': 'test', @@ -1890,7 +1905,7 @@ def expected_postgres_references_run_results(self): 'fail': None, 'node': { 'alias': 'ephemeral_summary', - 'build_path': os.path.normpath( + 'build_path': _normalize( 'target/compiled/test/ephemeral_summary.sql' ), 'columns': { @@ -1973,7 +1988,7 @@ def expected_postgres_references_run_results(self): 'fail': None, 'node': { 'alias': 'view_summary', - 'build_path': os.path.normpath( + 'build_path': _normalize( 'target/compiled/test/view_summary.sql' ), 'alias': 'view_summary', @@ -2055,7 +2070,7 @@ def expected_postgres_references_run_results(self): 'fail': None, 'node': { 'alias': 'seed', - 'build_path': os.path.normpath( + 'build_path': _normalize( 'target/compiled/test/seed.csv' ), 'columns': {}, diff --git a/test/unit/test_config.py b/test/unit/test_config.py index 7f924e02adf..92f268c33fa 100644 --- a/test/unit/test_config.py +++ b/test/unit/test_config.py @@ -475,7 +475,7 @@ def test_invalid_env_vars(self): self.env_override['env_value_port'] = 'hello' self.args.target = 'with-vars' with mock.patch.dict(os.environ, self.env_override): - with self.assertRaises(dbt.config.DbtProfileError) as exc: + with self.assertRaises(dbt.exceptions.DbtProfileError) as exc: self.from_args() self.assertIn("not of type 'integer'", str(exc.exception)) @@ -800,7 +800,7 @@ def test__get_unused_resource_config_paths_empty(self): ))}, []) self.assertEqual(len(unused), 0) - @mock.patch.object(dbt.config, 'logger') + @mock.patch.object(dbt.config.project, 'logger') def test__warn_for_unused_resource_config_paths_empty(self, mock_logger): project = dbt.config.Project.from_project_config( self.default_project_data @@ -884,7 +884,7 @@ def test__get_unused_resource_config_paths(self): self.assertEqual(len(unused), 1) self.assertEqual(unused[0], ('models', 'my_test_project', 'baz')) - @mock.patch.object(dbt.config, 'logger') + @mock.patch.object(dbt.config.project, 'logger') def test__warn_for_unused_resource_config_paths(self, mock_logger): project = dbt.config.Project.from_project_config( self.default_project_data @@ -892,7 +892,7 @@ def test__warn_for_unused_resource_config_paths(self, mock_logger): unused = project.warn_for_unused_resource_config_paths(self.used, []) mock_logger.info.assert_called_once() - @mock.patch.object(dbt.config, 'logger') + @mock.patch.object(dbt.config.project, 'logger') def test__warn_for_unused_resource_config_paths_disabled(self, mock_logger): project = dbt.config.Project.from_project_config( self.default_project_data diff --git a/test/unit/test_graph.py b/test/unit/test_graph.py index dc63b0e3b83..f989d2a167e 100644 --- a/test/unit/test_graph.py +++ b/test/unit/test_graph.py @@ -9,7 +9,6 @@ import dbt.flags import dbt.linker import dbt.config -import dbt.templates import dbt.utils try: diff --git a/tox.ini b/tox.ini index 366bf7a3e4a..4feae5dc355 100644 --- a/tox.ini +++ b/tox.ini @@ -4,7 +4,7 @@ envlist = unit-py27, unit-py36, integration-postgres-py27, integration-postgres- [testenv:pep8] basepython = python3.6 -commands = /bin/bash -c '$(which pep8) dbt/ --exclude dbt/templates.py' +commands = /bin/bash -c '$(which pep8) core/dbt plugins/*/dbt' deps = -r{toxinidir}/dev_requirements.txt @@ -12,14 +12,22 @@ deps = basepython = python2.7 commands = /bin/bash -c '$(which nosetests) -v {posargs} test/unit' deps = - -e .[postgres,snowflake,redshift,bigquery] + -e {toxinidir}/core + -e {toxinidir}/plugins/postgres + -e {toxinidir}/plugins/snowflake + -e {toxinidir}/plugins/bigquery + -e {toxinidir}/plugins/redshift -r{toxinidir}/dev_requirements.txt [testenv:unit-py36] basepython = python3.6 commands = /bin/bash -c '{envpython} $(which nosetests) -v {posargs} test/unit' deps = - -e .[postgres,snowflake,redshift,bigquery] + -e {toxinidir}/core + -e {toxinidir}/plugins/postgres + -e {toxinidir}/plugins/snowflake + -e {toxinidir}/plugins/bigquery + -e {toxinidir}/plugins/redshift -r{toxinidir}/dev_requirements.txt [testenv:integration-postgres-py27] @@ -29,7 +37,8 @@ setenv = HOME=/home/dbt_test_user commands = /bin/bash -c '{envpython} $(which nosetests) -v -a type=postgres {posargs} --with-coverage --cover-branches --cover-html --cover-html-dir=htmlcov test/integration/*' deps = - -e .[postgres] + -e {toxinidir}/core + -e {toxinidir}/plugins/postgres -r{toxinidir}/dev_requirements.txt [testenv:integration-snowflake-py27] @@ -39,7 +48,8 @@ setenv = HOME=/home/dbt_test_user commands = /bin/bash -c '{envpython} $(which nosetests) -v -a type=snowflake {posargs} --with-coverage --cover-branches --cover-html --cover-html-dir=htmlcov test/integration/*' deps = - -e .[snowflake] + -e {toxinidir}/core + -e {toxinidir}/plugins/snowflake -r{toxinidir}/dev_requirements.txt [testenv:integration-bigquery-py27] @@ -49,7 +59,8 @@ setenv = HOME=/home/dbt_test_user commands = /bin/bash -c '{envpython} $(which nosetests) -v -a type=bigquery {posargs} --with-coverage --cover-branches --cover-html --cover-html-dir=htmlcov test/integration/*' deps = - -e .[bigquery] + -e {toxinidir}/core + -e {toxinidir}/plugins/bigquery -r{toxinidir}/dev_requirements.txt [testenv:integration-redshift-py27] @@ -59,7 +70,9 @@ setenv = HOME=/home/dbt_test_user commands = /bin/bash -c '{envpython} $(which nosetests) -v -a type=redshift {posargs} --with-coverage --cover-branches --cover-html --cover-html-dir=htmlcov test/integration/*' deps = - -e .[redshift] + -e {toxinidir}/core + -e {toxinidir}/plugins/postgres + -e {toxinidir}/plugins/redshift -r{toxinidir}/dev_requirements.txt [testenv:integration-postgres-py36] @@ -69,7 +82,8 @@ setenv = HOME=/home/dbt_test_user commands = /bin/bash -c '{envpython} $(which nosetests) -v -a type=postgres --with-coverage --cover-branches --cover-html --cover-html-dir=htmlcov {posargs} test/integration/*' deps = - -e .[postgres] + -e {toxinidir}/core + -e {toxinidir}/plugins/postgres -r{toxinidir}/dev_requirements.txt [testenv:integration-snowflake-py36] @@ -79,7 +93,8 @@ setenv = HOME=/home/dbt_test_user commands = /bin/bash -c '{envpython} $(which nosetests) -v -a type=snowflake {posargs} --with-coverage --cover-branches --cover-html --cover-html-dir=htmlcov test/integration/*' deps = - -e .[snowflake] + -e {toxinidir}/core + -e {toxinidir}/plugins/snowflake -r{toxinidir}/dev_requirements.txt [testenv:integration-bigquery-py36] @@ -89,7 +104,8 @@ setenv = HOME=/home/dbt_test_user commands = /bin/bash -c '{envpython} $(which nosetests) -v -a type=bigquery {posargs} --with-coverage --cover-branches --cover-html --cover-html-dir=htmlcov test/integration/*' deps = - -e .[bigquery] + -e {toxinidir}/core + -e {toxinidir}/plugins/bigquery -r{toxinidir}/dev_requirements.txt [testenv:integration-redshift-py36] @@ -99,7 +115,9 @@ setenv = HOME=/home/dbt_test_user commands = /bin/bash -c '{envpython} $(which nosetests) -v -a type=redshift {posargs} --with-coverage --cover-branches --cover-html --cover-html-dir=htmlcov test/integration/*' deps = - -e .[redshift] + -e {toxinidir}/core + -e {toxinidir}/plugins/postgres + -e {toxinidir}/plugins/redshift -r{toxinidir}/dev_requirements.txt [testenv:explicit-py27] @@ -109,7 +127,11 @@ setenv = HOME=/home/dbt_test_user commands = /bin/bash -c '{envpython} $(which nosetests) -v {posargs}' deps = - -e .[postgres,snowflake,redshift,bigquery] + -e {toxinidir}/core + -e {toxinidir}/plugins/postgres + -e {toxinidir}/plugins/snowflake + -e {toxinidir}/plugins/bigquery + -e {toxinidir}/plugins/redshift -r{toxinidir}/dev_requirements.txt [testenv:explicit-py36] @@ -119,7 +141,11 @@ setenv = HOME=/home/dbt_test_user commands = /bin/bash -c '{envpython} $(which nosetests) -v {posargs}' deps = - -e .[postgres,snowflake,redshift,bigquery] + -e {toxinidir}/core + -e {toxinidir}/plugins/postgres + -e {toxinidir}/plugins/snowflake + -e {toxinidir}/plugins/bigquery + -e {toxinidir}/plugins/redshift -r{toxinidir}/dev_requirements.txt [testenv:pywin] @@ -130,5 +156,9 @@ setenv = DBT_INVOCATION_ENV = ci-appveyor commands = nosetests -v -a type=postgres -a type=snowflake -a type=bigquery --with-coverage --cover-branches --cover-html --cover-html-dir=htmlcov test/integration test/unit deps = - -e .[postgres,snowflake,redshift,bigquery] - -rdev_requirements.txt + -e {toxinidir}/core + -e {toxinidir}/plugins/postgres + -e {toxinidir}/plugins/snowflake + -e {toxinidir}/plugins/bigquery + -e {toxinidir}/plugins/redshift + -r{toxinidir}/dev_requirements.txt From 33ffafc7d6c8aacbf71954ebbbc2394b3f5f5e34 Mon Sep 17 00:00:00 2001 From: Jacob Beck Date: Wed, 5 Dec 2018 14:30:42 -0700 Subject: [PATCH 09/16] run_operation -> execute_macro --- core/dbt/adapters/base/impl.py | 26 ++++++++------- core/dbt/clients/jinja.py | 28 +--------------- core/dbt/context/common.py | 32 +++++++------------ core/dbt/contracts/graph/manifest.py | 7 ---- core/dbt/contracts/graph/parsed.py | 1 - core/dbt/contracts/graph/unparsed.py | 3 -- .../macros/operations/catalog/get_catalog.sql | 4 --- .../operations/relations/get_relations.sql | 4 --- core/dbt/parser/base.py | 7 +--- core/dbt/parser/macros.py | 4 --- core/dbt/utils.py | 12 ------- .../postgres/dbt/adapters/postgres/impl.py | 6 ++-- test/unit/test_postgres_adapter.py | 8 ++--- 13 files changed, 36 insertions(+), 106 deletions(-) delete mode 100644 core/dbt/include/global_project/macros/operations/catalog/get_catalog.sql delete mode 100644 core/dbt/include/global_project/macros/operations/relations/get_relations.sql diff --git a/core/dbt/adapters/base/impl.py b/core/dbt/adapters/base/impl.py index c3eb71c938d..b6a26485c08 100644 --- a/core/dbt/adapters/base/impl.py +++ b/core/dbt/adapters/base/impl.py @@ -21,7 +21,7 @@ from dbt.adapters.base import BaseRelation from dbt.adapters.cache import RelationsCache -GET_CATALOG_OPERATION_NAME = 'get_catalog_data' +GET_CATALOG_MACRO_NAME = 'get_catalog' def _expect_row_value(key, row): @@ -655,25 +655,29 @@ def convert_agate_type(cls, agate_table, col_idx): ### # Operations involving the manifest ### - def run_operation(self, manifest, operation_name): - """Look the operation identified by operation_name up in the manifest - and run it. + def execute_macro(self, manifest, macro_name, project=None): + """Look macro_name up in the manifest and execute its results. Return an an AttrDict with three attributes: 'table', 'data', and 'status'. 'table' is an agate.Table. """ - operation = manifest.find_operation_by_name(operation_name, 'dbt') + macro = manifest.find_macro_by_name(macro_name, project) + if macro is None: + raise dbt.exceptions.RuntimeException( + 'Could not find macro with name {} in project {}' + .format(macro_name, project) + ) # This causes a reference cycle, as dbt.context.runtime.generate() # ends up calling get_adapter, so the import has to be here. import dbt.context.runtime context = dbt.context.runtime.generate( - operation, + macro, self.config, manifest, ) - result = operation.generator(context)() + result = macro.generator(context)() return result @classmethod @@ -684,13 +688,13 @@ def _catalog_filter_table(cls, table, manifest): return table.where(_catalog_filter_schemas(manifest)) def get_catalog(self, manifest): - """Get the catalog for this manifest by running the get catalog - operation. Returns an agate.Table of catalog information. + """Get the catalog for this manifest by running the get catalog macro. + Returns an agate.Table of catalog information. """ try: - table = self.run_operation(manifest, GET_CATALOG_OPERATION_NAME) + table = self.execute_macro(manifest, GET_CATALOG_MACRO_NAME) finally: - self.release_connection(GET_CATALOG_OPERATION_NAME) + self.release_connection(GET_CATALOG_MACRO_NAME) results = self._catalog_filter_table(table, manifest) return results diff --git a/core/dbt/clients/jinja.py b/core/dbt/clients/jinja.py index 40cf1ae5950..c82180a798f 100644 --- a/core/dbt/clients/jinja.py +++ b/core/dbt/clients/jinja.py @@ -92,10 +92,7 @@ def call(*args, **kwargs): template = template_cache.get_node_template(node) module = template.make_module(context, False, context) - if node['resource_type'] == NodeType.Operation: - macro = module.__dict__[dbt.utils.get_dbt_operation_name(name)] - else: - macro = module.__dict__[dbt.utils.get_dbt_macro_name(name)] + macro = module.__dict__[dbt.utils.get_dbt_macro_name(name)] module.__dict__.update(context) try: @@ -148,28 +145,6 @@ def parse(self, parser): return node -class OperationExtension(jinja2.ext.Extension): - tags = ['operation'] - - def parse(self, parser): - node = jinja2.nodes.Macro(lineno=next(parser.stream).lineno) - operation_name = \ - parser.parse_assign_target(name_only=True).name - - node.args = [] - node.defaults = [] - - while parser.stream.skip_if('comma'): - target = parser.parse_assign_target(name_only=True) - - node.name = dbt.utils.get_operation_macro_name(operation_name) - - node.body = parser.parse_statements(('name:endoperation',), - drop_needle=True) - - return node - - class DocumentationExtension(jinja2.ext.Extension): tags = ['docs'] @@ -253,7 +228,6 @@ def get_environment(node=None, capture_macros=False): args['undefined'] = create_macro_capture_env(node) args['extensions'].append(MaterializationExtension) - args['extensions'].append(OperationExtension) args['extensions'].append(DocumentationExtension) return MacroFuzzEnvironment(**args) diff --git a/core/dbt/context/common.py b/core/dbt/context/common.py index 61b7aeab66d..2fb7088877b 100644 --- a/core/dbt/context/common.py +++ b/core/dbt/context/common.py @@ -393,22 +393,6 @@ def generate_base(model, model_dict, config, manifest, source_config, "try_or_compiler_error": try_or_compiler_error(model) }) - # Operations do not represent database relations, so there should be no - # 'this' variable in the context for operations. The Operation branch - # below should be removed in a future release. The fake relation below - # mirrors the historical implementation, without causing errors around - # the missing 'alias' attribute for operations - # - # https://github.com/fishtown-analytics/dbt/issues/878 - if model.resource_type == NodeType.Operation: - this = db_wrapper.adapter.Relation.create( - schema=config.credentials.schema, - identifier=model.name - ) - else: - this = get_this_relation(db_wrapper, config, model_dict) - - context["this"] = this return context @@ -431,9 +415,13 @@ def modify_generated_context(context, model, model_dict, config, manifest): return context -def generate_operation_macro(model, config, manifest, provider): - """This is an ugly hack to support the fact that the `docs generate` - operation ends up in here, and macros are not nodes. +def generate_execute_macro(model, config, manifest, provider): + """Internally, macros can be executed like nodes, with some restrictions: + + - they don't have have all values available that nodes do: + - 'this', 'pre_hooks', 'post_hooks', and 'sql' are missing + - 'schema' does not use any 'model' information + - they can't be configured with config() directives """ model_dict = model.serialize() context = generate_base(model, model_dict, config, manifest, @@ -447,6 +435,10 @@ def generate_model(model, config, manifest, source_config, provider): model_dict = model.to_dict() context = generate_base(model, model_dict, config, manifest, source_config, provider) + # operations (hooks) don't get a 'this' + if model.resource_type != NodeType.Operation: + this = get_this_relation(context['adapter'], config, model_dict) + context['this'] = this # overwrite schema if we have it, and hooks + sql context.update({ 'schema': model.get('schema', context['schema']), @@ -467,7 +459,7 @@ def generate(model, config, manifest, source_config=None, provider=None): dbt.context.runtime.generate """ if isinstance(model, ParsedMacro): - return generate_operation_macro(model, config, manifest, provider) + return generate_execute_macro(model, config, manifest, provider) else: return generate_model(model, config, manifest, source_config, provider) diff --git a/core/dbt/contracts/graph/manifest.py b/core/dbt/contracts/graph/manifest.py index 815f42fc7ac..456c288906e 100644 --- a/core/dbt/contracts/graph/manifest.py +++ b/core/dbt/contracts/graph/manifest.py @@ -256,13 +256,6 @@ def find_docs_by_name(self, name, package=None): return doc return None - def find_operation_by_name(self, name, package): - """Find a macro in the graph by its name and package name, or None for - any package. - """ - return self._find_by_name(name, package, 'macros', - [NodeType.Operation]) - def find_macro_by_name(self, name, package): """Find a macro in the graph by its name and package name, or None for any package. diff --git a/core/dbt/contracts/graph/parsed.py b/core/dbt/contracts/graph/parsed.py index f59c209c8ff..d0a77d2f795 100644 --- a/core/dbt/contracts/graph/parsed.py +++ b/core/dbt/contracts/graph/parsed.py @@ -405,7 +405,6 @@ class ParsedNodePatch(APIObject): 'resource_type': { 'enum': [ NodeType.Macro, - NodeType.Operation, ], }, 'unique_id': { diff --git a/core/dbt/contracts/graph/unparsed.py b/core/dbt/contracts/graph/unparsed.py index b9abf31c427..788f3359af9 100644 --- a/core/dbt/contracts/graph/unparsed.py +++ b/core/dbt/contracts/graph/unparsed.py @@ -62,9 +62,6 @@ NodeType.Model, NodeType.Test, NodeType.Analysis, - # Note: Hooks fail if you remove this, even though it's - # also allowed in ParsedMacro, which seems wrong. - # Maybe need to move hook operations into macros? NodeType.Operation, NodeType.Seed, # we need this if parse_node is going to handle archives. diff --git a/core/dbt/include/global_project/macros/operations/catalog/get_catalog.sql b/core/dbt/include/global_project/macros/operations/catalog/get_catalog.sql deleted file mode 100644 index 4371416adc6..00000000000 --- a/core/dbt/include/global_project/macros/operations/catalog/get_catalog.sql +++ /dev/null @@ -1,4 +0,0 @@ -{% operation get_catalog_data %} - {% set catalog = dbt.get_catalog() %} - {{ return(catalog) }} -{% endoperation %} diff --git a/core/dbt/include/global_project/macros/operations/relations/get_relations.sql b/core/dbt/include/global_project/macros/operations/relations/get_relations.sql deleted file mode 100644 index ad943c2a84b..00000000000 --- a/core/dbt/include/global_project/macros/operations/relations/get_relations.sql +++ /dev/null @@ -1,4 +0,0 @@ -{% operation get_relations_data %} - {% set relations = dbt.get_relations() %} - {{ return(relations) }} -{% endoperation %} diff --git a/core/dbt/parser/base.py b/core/dbt/parser/base.py index 0bf18a7df5d..fa9c100de06 100644 --- a/core/dbt/parser/base.py +++ b/core/dbt/parser/base.py @@ -83,13 +83,8 @@ def get_schema_func(self): def get_schema(_): return self.default_schema else: - # use the macro itself as the 'parsed node' to pass into - # parser.generate() to get a context. - macro_node = get_schema_macro.incorporate( - resource_type=NodeType.Operation - ) root_context = dbt.context.parser.generate( - macro_node, self.root_project_config, + get_schema_macro, self.root_project_config, self.macro_manifest, self.root_project_config ) get_schema = get_schema_macro.generator(root_context) diff --git a/core/dbt/parser/macros.py b/core/dbt/parser/macros.py index 5e7969fccb7..c03713dae03 100644 --- a/core/dbt/parser/macros.py +++ b/core/dbt/parser/macros.py @@ -53,10 +53,6 @@ def parse_macro_file(self, macro_file_path, macro_file_contents, root_path, node_type = NodeType.Macro name = macro_name.replace(dbt.utils.MACRO_PREFIX, '') - elif macro_name.startswith(dbt.utils.OPERATION_PREFIX): - node_type = NodeType.Operation - name = macro_name.replace(dbt.utils.OPERATION_PREFIX, '') - if node_type != resource_type: continue diff --git a/core/dbt/utils.py b/core/dbt/utils.py index b5c2001edaf..144431f0935 100644 --- a/core/dbt/utils.py +++ b/core/dbt/utils.py @@ -151,7 +151,6 @@ def find_in_list_by_name(haystack, target_name, target_package, nodetype): MACRO_PREFIX = 'dbt_macro__' -OPERATION_PREFIX = 'dbt_operation__' DOCS_PREFIX = 'dbt_docs__' @@ -159,10 +158,6 @@ def get_dbt_macro_name(name): return '{}{}'.format(MACRO_PREFIX, name) -def get_dbt_operation_name(name): - return '{}{}'.format(OPERATION_PREFIX, name) - - def get_dbt_docs_name(name): return '{}{}'.format(DOCS_PREFIX, name) @@ -180,13 +175,6 @@ def get_materialization_macro_name(materialization_name, adapter_type=None, return name -def get_operation_macro_name(operation_name, with_prefix=True): - if with_prefix: - return get_dbt_operation_name(operation_name) - else: - return operation_name - - def get_docs_macro_name(docs_name, with_prefix=True): if with_prefix: return get_dbt_docs_name(docs_name) diff --git a/plugins/postgres/dbt/adapters/postgres/impl.py b/plugins/postgres/dbt/adapters/postgres/impl.py index 673fbf55ebb..6f809dc6827 100644 --- a/plugins/postgres/dbt/adapters/postgres/impl.py +++ b/plugins/postgres/dbt/adapters/postgres/impl.py @@ -11,7 +11,7 @@ from dbt.logger import GLOBAL_LOGGER as logger -GET_RELATIONS_OPERATION_NAME = 'get_relations_data' +GET_RELATIONS_MACRO_NAME = 'get_relations' class PostgresAdapter(SQLAdapter): @@ -24,9 +24,9 @@ def date_function(cls): def _link_cached_relations(self, manifest): schemas = manifest.get_used_schemas() try: - table = self.run_operation(manifest, GET_RELATIONS_OPERATION_NAME) + table = self.execute_macro(manifest, GET_RELATIONS_MACRO_NAME) finally: - self.release_connection(GET_RELATIONS_OPERATION_NAME) + self.release_connection(GET_RELATIONS_MACRO_NAME) table = self._relations_filter_table(table, schemas) for (refed_schema, refed_name, dep_schema, dep_name) in table: diff --git a/test/unit/test_postgres_adapter.py b/test/unit/test_postgres_adapter.py index db131714f3d..de438f03a7b 100644 --- a/test/unit/test_postgres_adapter.py +++ b/test/unit/test_postgres_adapter.py @@ -133,8 +133,8 @@ def test_set_zero_keepalive(self, psycopg2): port=5432, connect_timeout=10) - @mock.patch.object(PostgresAdapter, 'run_operation') - def test_get_catalog_various_schemas(self, mock_run): + @mock.patch.object(PostgresAdapter, 'execute_macro') + def test_get_catalog_various_schemas(self, mock_execute): column_names = ['table_schema', 'table_name'] rows = [ ('foo', 'bar'), @@ -143,8 +143,8 @@ def test_get_catalog_various_schemas(self, mock_run): ('quux', 'bar'), ('skip', 'bar') ] - mock_run.return_value = agate.Table(rows=rows, - column_names=column_names) + mock_execute.return_value = agate.Table(rows=rows, + column_names=column_names) mock_manifest = mock.MagicMock() mock_manifest.get_used_schemas.return_value = {'foo', 'quux'} From 4cbff8e1a195d8660eb4b9ec39431522f55c79ee Mon Sep 17 00:00:00 2001 From: Jacob Beck Date: Tue, 18 Dec 2018 08:28:08 -0700 Subject: [PATCH 10/16] update changelog --- core/CHANGELOG.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/core/CHANGELOG.md b/core/CHANGELOG.md index 9a8e32c2b54..3bbf8b9457e 100644 --- a/core/CHANGELOG.md +++ b/core/CHANGELOG.md @@ -1,3 +1,12 @@ +## dbt dev/stephen-girard (0.13.0? - To be released) + +## Overview + +This release makes dbt and its adapters into a core-and-plugin architecture. + +### Breaking Changes +- '{{this}}' is no longer respected in hooks [#1176](https://github.com/fishtown-analytics/dbt/pull/1176), implementing [#878](https://github.com/fishtown-analytics/dbt/issues/878) + ## dbt 0.12.1 - (November 15, 2018) ### Overview From b263ba7df2738e270ac470508a3453bd3d183540 Mon Sep 17 00:00:00 2001 From: Brian Hartsock Date: Tue, 18 Dec 2018 22:47:02 -0500 Subject: [PATCH 11/16] Ensure character columns are treated as string types. --- dbt/schema.py | 2 +- test/unit/test_schema.py | 11 +++++++++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/dbt/schema.py b/dbt/schema.py index 3a34903a867..f4b75e7b6a1 100644 --- a/dbt/schema.py +++ b/dbt/schema.py @@ -45,7 +45,7 @@ def data_type(self): return self.dtype def is_string(self): - return self.dtype.lower() in ['text', 'character varying'] + return self.dtype.lower() in ['text', 'character varying', 'character'] def is_numeric(self): return self.dtype.lower() in ['numeric', 'number'] diff --git a/test/unit/test_schema.py b/test/unit/test_schema.py index a7c3d94fff0..6c065a422d7 100644 --- a/test/unit/test_schema.py +++ b/test/unit/test_schema.py @@ -2,6 +2,17 @@ import dbt.schema +class TestStringType(unittest.TestCase): + + def test__character_type(self): + col = dbt.schema.Column( + 'fieldname', + 'character', + char_size=10 + ) + + self.assertEqual(col.data_type, 'character varying(10)') + class TestNumericType(unittest.TestCase): From f64e33573547647dd16388a483cd6373c490d953 Mon Sep 17 00:00:00 2001 From: pgoss Date: Wed, 19 Dec 2018 12:32:32 -0500 Subject: [PATCH 12/16] split the relationship CTE in order to speed the dependency query on large dbs --- .../macros/relations/postgres_relations.sql | 29 ++++++++++++------- 1 file changed, 19 insertions(+), 10 deletions(-) diff --git a/dbt/include/global_project/macros/relations/postgres_relations.sql b/dbt/include/global_project/macros/relations/postgres_relations.sql index e6ef11f93b0..78e14c5f1c2 100644 --- a/dbt/include/global_project/macros/relations/postgres_relations.sql +++ b/dbt/include/global_project/macros/relations/postgres_relations.sql @@ -4,7 +4,7 @@ -- in pg_depend, objid is the dependent, refobjid is the referenced object -- "a pg_depend entry indicates that the referenced object cannot be dropped without also dropping the dependent object." -- #} - with relation as ( +with relation as ( select pg_rewrite.ev_class as class, pg_rewrite.oid as id @@ -31,21 +31,29 @@ from pg_namespace where nspname != 'information_schema' and nspname not like 'pg_%' ), + referenced as ( + select + relation.id AS id, + referenced_class.name , + referenced_class.schema , + referenced_class.kind + from relation + join class as referenced_class on relation.class=referenced_class.id + where referenced_class.kind in ('r', 'v') + ), relationships as ( select - referenced_class.name as referenced_name, - referenced_class.schema as referenced_schema_id, + referenced.name as referenced_name, + referenced.schema as referenced_schema_id, dependent_class.name as dependent_name, dependent_class.schema as dependent_schema_id, - referenced_class.kind as kind - from relation - join class as referenced_class on relation.class=referenced_class.id - join dependency on relation.id=dependency.id + referenced.kind as kind + from referenced + join dependency on referenced.id=dependency.id join class as dependent_class on dependency.ref=dependent_class.id where - referenced_class.kind in ('r', 'v') and - (referenced_class.name != dependent_class.name or - referenced_class.schema != dependent_class.schema) + (referenced.name != dependent_class.name or + referenced.schema != dependent_class.schema) ) select @@ -58,6 +66,7 @@ join schema as referenced_schema on relationships.referenced_schema_id=referenced_schema.id group by referenced_schema, referenced_name, dependent_schema, dependent_name order by referenced_schema, referenced_name, dependent_schema, dependent_name; + {%- endcall -%} {{ return(load_result('relations').table) }} From d8c46d94df5508b48d697e3c766f6301b54376fa Mon Sep 17 00:00:00 2001 From: Jacob Beck Date: Thu, 20 Dec 2018 08:40:13 -0700 Subject: [PATCH 13/16] fix the issue on bigquery where tests executed with a connection name of "master" --- core/dbt/node_runners.py | 2 +- plugins/bigquery/dbt/adapters/bigquery/connections.py | 11 ++++++----- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/core/dbt/node_runners.py b/core/dbt/node_runners.py index 93224161809..e87c3bcf865 100644 --- a/core/dbt/node_runners.py +++ b/core/dbt/node_runners.py @@ -493,7 +493,7 @@ def print_start_line(self): def execute_test(self, test): res, table = self.adapter.execute( test.wrapped_sql, - test.name, + model_name=test.name, auto_begin=True, fetch=True) diff --git a/plugins/bigquery/dbt/adapters/bigquery/connections.py b/plugins/bigquery/dbt/adapters/bigquery/connections.py index d59ffc01feb..3c1d2e7f486 100644 --- a/plugins/bigquery/dbt/adapters/bigquery/connections.py +++ b/plugins/bigquery/dbt/adapters/bigquery/connections.py @@ -174,11 +174,11 @@ def get_table_from_response(cls, resp): rows = [dict(row.items()) for row in resp] return dbt.clients.agate_helper.table_from_data(rows, column_names) - def raw_execute(self, sql, model_name=None, fetch=False, **kwargs): - conn = self.get(model_name) + def raw_execute(self, sql, name=None, fetch=False): + conn = self.get(name) client = conn.handle - logger.debug('On %s: %s', model_name, sql) + logger.debug('On %s: %s', name, sql) job_config = google.cloud.bigquery.QueryJobConfig() job_config.use_legacy_sql = False @@ -190,8 +190,9 @@ def raw_execute(self, sql, model_name=None, fetch=False, **kwargs): return query_job, iterator - def execute(self, sql, model_name=None, fetch=None, **kwargs): - _, iterator = self.raw_execute(sql, model_name, fetch, **kwargs) + def execute(self, sql, name=None, auto_begin=False, fetch=None): + # auto_begin is ignored on bigquery, and only included for consistency + _, iterator = self.raw_execute(sql, name=name, fetch=fetch) if fetch: res = self.get_table_from_response(iterator) From f558516f40d288a8ce649d4008ef848b4389a722 Mon Sep 17 00:00:00 2001 From: Jacob Beck Date: Thu, 20 Dec 2018 08:41:04 -0700 Subject: [PATCH 14/16] remove extra script --- core/scripts/create_adapter_plugins.py | 162 ------------------------- 1 file changed, 162 deletions(-) delete mode 100644 core/scripts/create_adapter_plugins.py diff --git a/core/scripts/create_adapter_plugins.py b/core/scripts/create_adapter_plugins.py deleted file mode 100644 index 9b0349f1876..00000000000 --- a/core/scripts/create_adapter_plugins.py +++ /dev/null @@ -1,162 +0,0 @@ -#!/usr/bin/env python -import argparse -import os -import sys - -pj = os.path.join - -PROJECT_TEMPLATE = ''' -name: dbt_{adapter} -version: {version} - -macro-paths: ["macros"] -''' - -NAMESPACE_INIT_TEMPLATE = ''' -__path__ = __import__('pkgutil').extend_path(__path__, __name__) -'''.lstrip() - - -# TODO: make this not default to fishtown for everything! -SETUP_PY_TEMPLATE = ''' -#!/usr/bin/env python -from setuptools import find_packages -from distutils.core import setup - -package_name = "dbt-{adapter}" -package_version = "{version}" -description = """The {adapter} adpter plugin for dbt (data build tool)""" - -setup( - name=package_name, - version=package_version, - description=description, - long_description_content_type=description, - author={author_name}, - author_email={author_email}, - url={url}, - packages=find_packages(), - install_requires=[ - 'dbt-core=={dbt_core_version}', - {dependencies} - ] -) -'''.lstrip() - - - -ADAPTER_INIT_TEMPLATE = ''' -from dbt.adapters.{adapter}.connections import {title_adapter}ConnectionManager -from dbt.adapters.{adapter}.connections import {title_adapter}Credentials -from dbt.adapters.{adapter}.impl import {title_adapter}Adapter - -from dbt.adapters.base import AdapterPlugin -from dbt.include import {adapter} - -Plugin = AdapterPlugin( - adapter={title_adapter}Adapter, - credentials={title_adapter}Credentials, - include_path={adapter}.PACKAGE_PATH) -'''.lstrip() - - -INCLUDE_INIT_TEMPLATE = ''' -import os -PACKAGE_PATH = os.path.dirname(os.path.dirname(__file__)) -'''.lstrip() - - -def parse_args(argv=None): - if argv is None: - argv = sys.argv[1:] - parser = argparse.ArgumentParser() - parser.add_argument('root') - parser.add_argument('adapter') - parser.add_argument('--title-case', '-t', default=None) - parser.add_argument('--dependency', action='append') - parser.add_argument('--dbt-core-version', default='0.13.0') - parser.add_argument('--email') - parser.add_argument('--author') - parser.add_argument('--url') - parser.add_argument('--package-version', default='0.0.1') - parser.add_argument('--project-version', default='1.0') - parsed = parser.parse_args() - - if parsed.title_case is None: - parsed.title_case = parsed.adapter.title() - - if parsed.dependency: - #['a', 'b'] => "'a',\n 'b'"; ['a'] -> "'a'," - parsed.dependency = '\n '.join( - "'{}',".format(d) for d in parsed.dependency - ) - else: - parsed.dependency = '' - - if parsed.email is not None: - parsed.email = "'{}'".format(parsed.email) - else: - parsed.email = '' - if parsed.author is not None: - parsed.author = "'{}'".format(parsed.author) - else: - parsed.author = '' - if parsed.url is not None: - parsed.url = "'{}'".format(parsed.url) - else: - parsed.url = '' - return parsed - - - -def main(): - parsed = parse_args() - dest = pj(parsed.root, parsed.adapter) - if os.path.exists(dest): - raise Exception('path exists') - - adapters_path = pj(dest, 'dbt', 'adapters', parsed.adapter) - include_path = pj(dest, 'dbt', 'include', parsed.adapter) - os.makedirs(adapters_path) - os.makedirs(pj(include_path, 'macros')) - - # namespaces! - with open(pj(dest, 'dbt', '__init__.py'), 'w') as fp: - fp.write(NAMESPACE_INIT_TEMPLATE) - with open(pj(dest, 'dbt', 'adapters', '__init__.py'), 'w') as fp: - fp.write(NAMESPACE_INIT_TEMPLATE) - with open(pj(dest, 'dbt', 'include', '__init__.py'), 'w') as fp: - fp.write(NAMESPACE_INIT_TEMPLATE) - - # setup script! - with open(pj(dest, 'setup.py'), 'w') as fp: - fp.write(SETUP_PY_TEMPLATE.format(adapter=parsed.adapter, - version=parsed.package_version, - author_name=parsed.author, - author_email=parsed.email, - url=parsed.url, - dbt_core_version=parsed.dbt_core_version, - dependencies=parsed.dependency)) - - - # adapter stuff! - with open(pj(adapters_path, '__init__.py'), 'w') as fp: - fp.write(ADAPTER_INIT_TEMPLATE.format(adapter=parsed.adapter, - title_adapter=parsed.title_case)) - - # macro/project stuff! - with open(pj(include_path, '__init__.py'), 'w') as fp: - fp.write(INCLUDE_INIT_TEMPLATE) - - with open(pj(include_path, 'dbt_project.yml'), 'w') as fp: - fp.write(PROJECT_TEMPLATE.format(adapter=parsed.adapter, - version=parsed.project_version)) - - # TODO: - # - bare class impls for mandatory subclasses - # (ConnectionManager, Credentials, Adapter) - # - impls of mandatory abstract methods w/explicit NotImplementedErrors - - -if __name__ == '__main__': - main() From 7786175d32235bc1b435491842b4768ea043b5cc Mon Sep 17 00:00:00 2001 From: Vijay Kiran Date: Fri, 21 Dec 2018 17:58:35 +0100 Subject: [PATCH 15/16] Print dbt version before every task is run resolves fishtown-analytics/dbt#1134 --- dbt/main.py | 1 + 1 file changed, 1 insertion(+) diff --git a/dbt/main.py b/dbt/main.py index 248745c9476..71d8d22d6ca 100644 --- a/dbt/main.py +++ b/dbt/main.py @@ -236,6 +236,7 @@ def invoke_dbt(parsed): cfg = None log_cache_events(getattr(parsed, 'log_cache_events', False)) + logger.info("Running with dbt{}".format(dbt.version.installed)) try: if parsed.which in {'deps', 'clean'}: From 09fbe288d86253a640dcd04eb05b1111cd6abc90 Mon Sep 17 00:00:00 2001 From: Vijay Kiran Date: Fri, 21 Dec 2018 19:02:57 +0100 Subject: [PATCH 16/16] Update environment setup in CONTRIBUTING.md - Document command to activate the virtualenv - Fix minor typo --- CONTRIBUTING.md | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index c08e719ee8c..20f10704723 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -50,6 +50,7 @@ Set up a fresh virtualenv with pyenv-virtualenv for dbt: pyenv virtualenv 3.6.5 dbt36 cd ~/git/dbt pyenv local dbt36 +pyenv activate ``` This makes a new virtualenv based on python 3.6.5 named `dbt36`, and tells pyenv that when you're in the `dbt` directory it should automatically use that virtualenv. @@ -131,7 +132,11 @@ Sometimes, you're going to have to pretend to be an end user to reproduce bugs a ### installation -First, from the `dbt` directory, install dbt in 'editable' mode. There are a couple ways to do it, but I'm in the habit of `pip install -e .`, which tells pip to install the package in the current directory in "editable" mode. What's cool about this mode is any changes you make to the current dbt directory will be reflected immediately in your next `dbt` run. +First make sure that you setup your `virtualenv` as described in section _Setting up your environment_. + +From the `dbt` directory, install dbt in 'editable' mode. There are a couple ways to do it, but I'm in the habit of `pip install -e .`, which tells pip to install the package in the current directory in "editable" mode. Since you are running `pip install` in virtualenv, this will not change your normal dbt installation, if you have one. + +What's cool about this mode is any changes you make to the current dbt directory will be reflected immediately in your next `dbt` run. ### Profile @@ -204,7 +209,7 @@ Found 2 models, 0 tests, 0 archives, 0 analyses, 59 macros, 1 operations, 1 seed So what does that mean? Well: - `2 models` refers to the contents of the `models` directory -- `59 macros` are the builtin global macros defind by dbt itself +- `59 macros` are the builtin global macros defined by dbt itself - `1 operations` is the catalog generation operation that runs by default - `1 seed files` refers to the seed data in `data/moby_dick.csv`