Error "required key is missing from config" for provided key

What is the current bug behavior?

Setting the password of target-postgres to the empty string results in Meltano erroring due to the password not having been set.

What is the expected correct behavior?

meltano config target-postgres set password '' should set the password to the empty string, and Meltano should not error due to this config element not being set. If raising an error because of this value is appropriate, then it should be distinguished from an error that comes from the value being unset.

Steps to reproduce

meltano init example
cd example

meltano add extractor tap-gitlab
meltano config tap-gitlab set projects meltano/meltano
meltano config tap-gitlab set start_date 2022-01-01T00:00:00Z
meltano select tap-gitlab tags

meltano add loader target-postgres
meltano config target-postgres set user <username>
meltano config target-postgres set password ''
meltano config target-postgres set dbname <database name>

meltano elt tap-gitlab target-postgres

Relevant logs and/or screenshots

Please use code blocks (```) to format console output

(meltano) will ~/speedrun $ meltano elt tap-gitlab target-postgres
2022-05-28T19:50:53.677462Z [info     ] Environment 'dev' is active
2022-05-28T19:50:54.514570Z [info     ] Running extract & load...      job_id=2022-05-28T195053--tap-gitlab--target-postgres name=meltano run_id=905e6da3-d8d6-4b07-81d1-74d60ff82616
2022-05-28T19:50:54.630216Z [warning  ] No state was found, complete import.
2022-05-28T19:50:54.862929Z [info     ] INFO Starting sync             cmd_type=extractor job_id=2022-05-28T195053--tap-gitlab--target-postgres name=tap-gitlab run_id=905e6da3-d8d6-4b07-81d1-74d60ff82616 stdio=stderr
2022-05-28T19:50:54.863280Z [info     ] INFO Skipping stream: projects cmd_type=extractor job_id=2022-05-28T195053--tap-gitlab--target-postgres name=tap-gitlab run_id=905e6da3-d8d6-4b07-81d1-74d60ff82616 stdio=stderr
2022-05-28T19:50:54.863406Z [info     ] INFO Skipping stream: branches cmd_type=extractor job_id=2022-05-28T195053--tap-gitlab--target-postgres name=tap-gitlab run_id=905e6da3-d8d6-4b07-81d1-74d60ff82616 stdio=stderr
2022-05-28T19:50:54.863545Z [info     ] INFO Skipping stream: commits  cmd_type=extractor job_id=2022-05-28T195053--tap-gitlab--target-postgres name=tap-gitlab run_id=905e6da3-d8d6-4b07-81d1-74d60ff82616 stdio=stderr
2022-05-28T19:50:54.863652Z [info     ] INFO Skipping stream: issues   cmd_type=extractor job_id=2022-05-28T195053--tap-gitlab--target-postgres name=tap-gitlab run_id=905e6da3-d8d6-4b07-81d1-74d60ff82616 stdio=stderr
2022-05-28T19:50:54.863761Z [info     ] INFO Skipping stream: jobs     cmd_type=extractor job_id=2022-05-28T195053--tap-gitlab--target-postgres name=tap-gitlab run_id=905e6da3-d8d6-4b07-81d1-74d60ff82616 stdio=stderr
2022-05-28T19:50:54.863868Z [info     ] INFO Skipping stream: merge_requests cmd_type=extractor job_id=2022-05-28T195053--tap-gitlab--target-postgres name=tap-gitlab run_id=905e6da3-d8d6-4b07-81d1-74d60ff82616 stdio=stderr
2022-05-28T19:50:54.863971Z [info     ] INFO Skipping stream: merge_request_commits cmd_type=extractor job_id=2022-05-28T195053--tap-gitlab--target-postgres name=tap-gitlab run_id=905e6da3-d8d6-4b07-81d1-74d60ff82616 stdio=stderr
2022-05-28T19:50:54.864073Z [info     ] INFO Skipping stream: project_milestones cmd_type=extractor job_id=2022-05-28T195053--tap-gitlab--target-postgres name=tap-gitlab run_id=905e6da3-d8d6-4b07-81d1-74d60ff82616 stdio=stderr
2022-05-28T19:50:54.864181Z [info     ] INFO Skipping stream: group_milestones cmd_type=extractor job_id=2022-05-28T195053--tap-gitlab--target-postgres name=tap-gitlab run_id=905e6da3-d8d6-4b07-81d1-74d60ff82616 stdio=stderr
2022-05-28T19:50:54.864286Z [info     ] INFO Skipping stream: users    cmd_type=extractor job_id=2022-05-28T195053--tap-gitlab--target-postgres name=tap-gitlab run_id=905e6da3-d8d6-4b07-81d1-74d60ff82616 stdio=stderr
2022-05-28T19:50:54.864388Z [info     ] INFO Skipping stream: site_users cmd_type=extractor job_id=2022-05-28T195053--tap-gitlab--target-postgres name=tap-gitlab run_id=905e6da3-d8d6-4b07-81d1-74d60ff82616 stdio=stderr
2022-05-28T19:50:54.864487Z [info     ] INFO Skipping stream: groups   cmd_type=extractor job_id=2022-05-28T195053--tap-gitlab--target-postgres name=tap-gitlab run_id=905e6da3-d8d6-4b07-81d1-74d60ff82616 stdio=stderr
2022-05-28T19:50:54.864589Z [info     ] INFO Skipping stream: project_members cmd_type=extractor job_id=2022-05-28T195053--tap-gitlab--target-postgres name=tap-gitlab run_id=905e6da3-d8d6-4b07-81d1-74d60ff82616 stdio=stderr
2022-05-28T19:50:54.864690Z [info     ] INFO Skipping stream: group_members cmd_type=extractor job_id=2022-05-28T195053--tap-gitlab--target-postgres name=tap-gitlab run_id=905e6da3-d8d6-4b07-81d1-74d60ff82616 stdio=stderr
2022-05-28T19:50:54.864790Z [info     ] INFO Skipping stream: group_projects cmd_type=extractor job_id=2022-05-28T195053--tap-gitlab--target-postgres name=tap-gitlab run_id=905e6da3-d8d6-4b07-81d1-74d60ff82616 stdio=stderr
2022-05-28T19:50:54.864888Z [info     ] INFO Skipping stream: releases cmd_type=extractor job_id=2022-05-28T195053--tap-gitlab--target-postgres name=tap-gitlab run_id=905e6da3-d8d6-4b07-81d1-74d60ff82616 stdio=stderr
2022-05-28T19:50:54.864987Z [info     ] INFO Skipping stream: project_labels cmd_type=extractor job_id=2022-05-28T195053--tap-gitlab--target-postgres name=tap-gitlab run_id=905e6da3-d8d6-4b07-81d1-74d60ff82616 stdio=stderr
2022-05-28T19:50:54.865092Z [info     ] INFO Skipping stream: group_labels cmd_type=extractor job_id=2022-05-28T195053--tap-gitlab--target-postgres name=tap-gitlab run_id=905e6da3-d8d6-4b07-81d1-74d60ff82616 stdio=stderr
2022-05-28T19:50:54.865194Z [info     ] INFO Skipping stream: epics    cmd_type=extractor job_id=2022-05-28T195053--tap-gitlab--target-postgres name=tap-gitlab run_id=905e6da3-d8d6-4b07-81d1-74d60ff82616 stdio=stderr
2022-05-28T19:50:54.865292Z [info     ] INFO Skipping stream: epic_issues cmd_type=extractor job_id=2022-05-28T195053--tap-gitlab--target-postgres name=tap-gitlab run_id=905e6da3-d8d6-4b07-81d1-74d60ff82616 stdio=stderr
2022-05-28T19:50:54.865390Z [info     ] INFO Skipping stream: pipelines cmd_type=extractor job_id=2022-05-28T195053--tap-gitlab--target-postgres name=tap-gitlab run_id=905e6da3-d8d6-4b07-81d1-74d60ff82616 stdio=stderr
2022-05-28T19:50:54.865487Z [info     ] INFO Skipping stream: pipelines_extended cmd_type=extractor job_id=2022-05-28T195053--tap-gitlab--target-postgres name=tap-gitlab run_id=905e6da3-d8d6-4b07-81d1-74d60ff82616 stdio=stderr
2022-05-28T19:50:54.865611Z [info     ] INFO Skipping stream: vulnerabilities cmd_type=extractor job_id=2022-05-28T195053--tap-gitlab--target-postgres name=tap-gitlab run_id=905e6da3-d8d6-4b07-81d1-74d60ff82616 stdio=stderr
2022-05-28T19:50:54.865714Z [info     ] INFO Skipping stream: project_variables cmd_type=extractor job_id=2022-05-28T195053--tap-gitlab--target-postgres name=tap-gitlab run_id=905e6da3-d8d6-4b07-81d1-74d60ff82616 stdio=stderr
2022-05-28T19:50:54.865815Z [info     ] INFO Skipping stream: group_variables cmd_type=extractor job_id=2022-05-28T195053--tap-gitlab--target-postgres name=tap-gitlab run_id=905e6da3-d8d6-4b07-81d1-74d60ff82616 stdio=stderr
2022-05-28T19:50:54.871555Z [info     ] time=2022-05-28 15:50:54 name=target_postgres level=ERROR message=Invalid configuration: cmd_type=loader job_id=2022-05-28T195053--tap-gitlab--target-postgres name=target-postgres run_id=905e6da3-d8d6-4b07-81d1-74d60ff82616 stdio=stderr
2022-05-28T19:50:54.871679Z [info     ]    * Required key is missing from config: [password] cmd_type=loader job_id=2022-05-28T195053--tap-gitlab--target-postgres name=target-postgres run_id=905e6da3-d8d6-4b07-81d1-74d60ff82616 stdio=stderr
2022-05-28T19:50:54.884273Z [error    ] Loading failed                 code=1 job_id=2022-05-28T195053--tap-gitlab--target-postgres message=   * Required key is missing from config: [password] name=meltano run_id=905e6da3-d8d6-4b07-81d1-74d60ff82616
2022-05-28T19:50:54.884724Z [info     ] ELT could not be completed: Loader failed. cmd_type=elt job_id=2022-05-28T195053--tap-gitlab--target-postgres name=meltano run_id=905e6da3-d8d6-4b07-81d1-74d60ff82616 stdio=stderr
2022-05-28T19:50:54.884883Z [info     ] For more detailed log messages re-run the command using 'meltano --log-level=debug ...' CLI flag. cmd_type=elt job_id=2022-05-28T195053--tap-gitlab--target-postgres name=meltano run_id=905e6da3-d8d6-4b07-81d1-74d60ff82616 stdio=stderr
2022-05-28T19:50:54.885021Z [info     ] Note that you can also check the generated log file at '/home/will/speedrun/.meltano/logs/elt/2022-05-28T195053--tap-gitlab--target-postgres/905e6da3-d8d6-4b07-81d1-74d60ff82616/elt.log'. cmd_type=elt job_id=2022-05-28T195053--tap-gitlab--target-postgres name=meltano run_id=905e6da3-d8d6-4b07-81d1-74d60ff82616 stdio=stderr
2022-05-28T19:50:54.885162Z [info     ] For more information on debugging and logging: https://docs.meltano.com/reference/command-line-interface#debugging cmd_type=elt job_id=2022-05-28T195053--tap-gitlab--target-postgres name=meltano run_id=905e6da3-d8d6-4b07-81d1-74d60ff82616 stdio=stderr
ELT could not be completed: Loader failed.
For more detailed log messages re-run the command using 'meltano --log-level=debug ...' CLI flag.
Note that you can also check the generated log file at '/home/will/speedrun/.meltano/logs/elt/2022-05-28T195053--tap-gitlab--target-postgres/905e6da3-d8d6-4b07-81d1-74d60ff82616/elt.log'.
For more information on debugging and logging: https://docs.meltano.com/reference/command-line-interface#debugging

Possible fixes

Distinguish between '' and nothing having been set. My guess is that there's a check like if not settings['password']: raise ..., when it ought to be more like this: if settings['password'] is not None: raise ....