| Conditions | 3 |
| Total Lines | 110 |
| Code Lines | 81 |
| Lines | 0 |
| Ratio | 0 % |
| Changes | 0 | ||
Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.
For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.
Commonly applied refactorings include:
If many parameters/temporary variables are present:
| 1 | #!/usr/bin/python3 |
||
| 129 | def test_12factor_config_sourcing(self): |
||
| 130 | """Test config sourcing precendence should adhere to 12-factor app expectations""" |
||
| 131 | tmpdir = tempfile.mkdtemp(prefix='param-') |
||
| 132 | atexit.register(shutil.rmtree, tmpdir) |
||
| 133 | |||
| 134 | for item in ['dev', 'prod', 'stage']: |
||
| 135 | cdir = os.path.join(tmpdir, item) |
||
| 136 | os.mkdir(cdir) |
||
| 137 | for file in 'a.yml', 'b.yaml', 'c.yaml': |
||
| 138 | fqn = os.path.join(cdir, file) |
||
| 139 | file_from_text(f"zoo: {file}\nitem: {item}", dir=cdir, name=fqn) |
||
| 140 | |||
| 141 | cfg_file = file_from_text( |
||
| 142 | f"zar: bella\nzoo: cfg", |
||
| 143 | dir=tmpdir, name='inji.yml' ) |
||
| 144 | |||
| 145 | param_file = file_from_text( |
||
| 146 | f"zar: zella\nzoo: zorg", |
||
| 147 | dir=tmpdir, name='vars.yaml' ) |
||
| 148 | |||
| 149 | # needed to source the default config from ./inji.y?ml |
||
| 150 | OLDPWD=os.getcwd() |
||
| 151 | os.chdir(tmpdir) |
||
| 152 | |||
| 153 | # test we are able to recursively source params |
||
| 154 | # but also source from the default (low-precedence) config file relative to PWD |
||
| 155 | assert re.search('Hola \w+ from bella', |
||
| 156 | check_output( |
||
| 157 | inji, |
||
| 158 | '-o', f"{tmpdir}/dev", |
||
| 159 | input=b"Hola {{ item }} from {{ zar }}" |
||
| 160 | ) |
||
| 161 | ) |
||
| 162 | |||
| 163 | # dev/c.yaml should be last file sourced |
||
| 164 | assert check_output( |
||
| 165 | inji, '-o', f"{tmpdir}/dev", |
||
| 166 | input=b"Hola {{ zoo }}" |
||
| 167 | ) == "Hola c.yaml\n" |
||
| 168 | |||
| 169 | # prod/ should be the last overlay sourced |
||
| 170 | assert check_output( |
||
| 171 | inji, |
||
| 172 | '-o', f"{tmpdir}/stage", |
||
| 173 | '-o', f"{tmpdir}/dev", |
||
| 174 | '-o', f"{tmpdir}/prod", |
||
| 175 | input=b"Hola {{ item }}" |
||
| 176 | ) == "Hola prod\n" |
||
| 177 | |||
| 178 | # named config file trumps overlays, arg position is irrelevant |
||
| 179 | assert check_output( |
||
| 180 | inji, |
||
| 181 | '-o', f"{tmpdir}/stage", |
||
| 182 | '-o', f"{tmpdir}/prod", |
||
| 183 | '-v', param_file, |
||
| 184 | '-o', f"{tmpdir}/dev", |
||
| 185 | input=b"Hola {{ zar }} from {{ zoo }}" |
||
| 186 | ) == "Hola zella from zorg\n" |
||
| 187 | |||
| 188 | # env vars trump named config files |
||
| 189 | os.environ['zoo']='env' |
||
| 190 | assert check_output( |
||
| 191 | inji, |
||
| 192 | '-o', f"{tmpdir}/stage", |
||
| 193 | '-o', f"{tmpdir}/prod", |
||
| 194 | '-v', param_file, |
||
| 195 | '-o', f"{tmpdir}/dev", |
||
| 196 | input=b"Hola {{ zar }} from {{ zoo }}" |
||
| 197 | ) == "Hola zella from env\n" |
||
| 198 | |||
| 199 | # cli params passed in as JSON strings at the CLI trump all files |
||
| 200 | assert check_output( |
||
| 201 | inji, |
||
| 202 | '-o', f"{tmpdir}/stage", |
||
| 203 | '-j', '{"zoo": "world!"}', |
||
| 204 | '-o', f"{tmpdir}/prod", |
||
| 205 | '-v', param_file, |
||
| 206 | '-o', f"{tmpdir}/dev", |
||
| 207 | input=b"Hola {{ zar }} from {{ zoo }}" |
||
| 208 | ) == "Hola zella from world!\n" |
||
| 209 | |||
| 210 | # cli params passed in as KV pairs take ultimate precendence |
||
| 211 | # Q: why do KV pairs take precendece over JSON? |
||
| 212 | # A: the use-case is overriding particular values from a JSON blurb sourced |
||
| 213 | # from a file or external system. |
||
| 214 | assert check_output( |
||
| 215 | inji, |
||
| 216 | '-k', 'zar=della', |
||
| 217 | '-o', f"{tmpdir}/stage", |
||
| 218 | '-j', '{"zoo": "world!"}', |
||
| 219 | '-o', f"{tmpdir}/prod", |
||
| 220 | '-v', param_file, |
||
| 221 | '-o', f"{tmpdir}/dev", |
||
| 222 | input=b"Hola {{ zar }} from {{ zoo }}" |
||
| 223 | ) == "Hola della from world!\n" |
||
| 224 | |||
| 225 | # except when params are defined in the templates themselves, off course! |
||
| 226 | assert check_output( |
||
| 227 | inji, |
||
| 228 | '-k', 'zar=della', |
||
| 229 | '-o', f"{tmpdir}/stage", |
||
| 230 | '-j', '{"zoo": "mars"}', |
||
| 231 | '-o', f"{tmpdir}/prod", |
||
| 232 | '-v', param_file, |
||
| 233 | '-o', f"{tmpdir}/dev", |
||
| 234 | input=b"{% set zar='quux' %}Hola {{ zar }} from {{ zoo }}" |
||
| 235 | ) == "Hola quux from mars\n" |
||
| 236 | |||
| 237 | os.environ.pop('zoo') |
||
| 238 | os.chdir(OLDPWD) |
||
| 239 | |||
| 358 |