From 98136567ac81dc84d2138fc9946c4542af50fa30 Mon Sep 17 00:00:00 2001 From: gehrhorn Date: Tue, 28 Sep 2021 12:27:25 -0400 Subject: [PATCH] Updated documentation Added better comparison of pattern with dotenv vs not. Updated file read operation to use readlines() --- .env | 4 +- .gitignore | 58 +++--- README.md | 110 +++++++----- config/.env | 6 +- config/README.md | 43 +++++ config/blanklines.env | 10 +- config/bottomcomment.env | 6 +- config/dotenv-compare.png | Bin 0 -> 99829 bytes config/empty.env | 2 +- config/equalPassword.env | 6 +- config/middlecomment.env | 6 +- config/specialchars.env | 2 +- config/topcomment.env | 6 +- config/whitespace.env | 4 +- dotenv for MATLAB.prj | 4 +- dotenv.m | 167 ++++++++++-------- license.txt | 20 +-- .../Information.type.Extension.xml | 2 +- resources/project/Project.xml | 2 +- resources/project/ProjectData.type.Info.xml | 2 +- .../FileClassCategory.type.Category.xml | 2 +- .../artifact.type.Label.xml | 2 +- .../convenience.type.Label.xml | 2 +- .../derived.type.Label.xml | 2 +- .../design.type.Label.xml | 2 +- .../none.type.Label.xml | 2 +- .../other.type.Label.xml | 2 +- .../test.type.Label.xml | 2 +- ...8a84-2325ec11a40f.type.EntryPointGroup.xml | 2 +- .../Root.type.Files/.env.type.File.xml | 10 +- .../Root.type.Files/.gitignore.type.File.xml | 2 +- .../Root.type.Files/README.md.type.File.xml | 2 +- .../Root.type.Files/config.type.File.xml | 2 +- .../config.type.File/.env.type.File.xml | 10 +- .../config.type.File/1.type.DIR_SIGNIFIER.xml | 2 +- .../blanklines.env.type.File.xml | 10 +- .../bottomcomment.env.type.File.xml | 10 +- .../dotenv-screenshot.png.type.File.xml | 2 +- .../config.type.File/empty.env.type.File.xml | 10 +- .../equalPassword.env.type.File.xml | 10 +- .../middlecomment.env.type.File.xml | 10 +- .../config.type.File/single.env.type.File.xml | 2 +- .../specialchars.env.type.File.xml | 10 +- .../topcomment.env.type.File.xml | 10 +- .../whitespace.env.type.File.xml | 10 +- .../Root.type.Files/dotenv.m.type.File.xml | 10 +- .../Root.type.Files/license.txt.type.File.xml | 2 +- .../Root.type.Files/tests.type.File.xml | 10 +- .../tests.type.File/.env.type.File.xml | 2 +- .../tests.type.File/1.type.DIR_SIGNIFIER.xml | 2 +- .../tests.type.File/fileTest.m.type.File.xml | 10 +- .../tests.type.File/rulesTest.m.type.File.xml | 10 +- .../valueRetrieveTest.m.type.File.xml | 10 +- ...-492f-a597-59001c2d4176.type.Reference.xml | 2 +- ...-49be-8727-c90cc30c4ae9.type.Reference.xml | 2 +- ...-4f87-b435-d9f5e2bb0dbe.type.Reference.xml | 2 +- ...d-f9b4998b-e6e6-4342-90ba-a1b77c2a87b2.xml | 2 +- tests/.env | 4 +- tests/fileTest.m | 42 ++--- tests/rulesTest.m | 132 +++++++------- tests/valueRetrieveTest.m | 34 ++-- 61 files changed, 469 insertions(+), 397 deletions(-) create mode 100644 config/README.md create mode 100644 config/dotenv-compare.png diff --git a/.env b/.env index 56c4a3a..cec224b 100644 --- a/.env +++ b/.env @@ -1,3 +1,3 @@ -DB_HOST=localhost -DB_USER=db_user +DB_HOST=localhost +DB_USER=db_user DB_PASS=s1mpl3 \ No newline at end of file diff --git a/.gitignore b/.gitignore index 79a071e..194c7ff 100644 --- a/.gitignore +++ b/.gitignore @@ -1,29 +1,29 @@ -# Created by https://www.gitignore.io/api/matlab -# Edit at https://www.gitignore.io/?templates=matlab - -### MATLAB ### -# Windows default autosave extension -*.asv - -# OSX / *nix default autosave extension -*.m~ - -# Compiled MEX binaries (all platforms) -*.mex* - -# Packaged app and toolbox files -*.mlappinstall -*.mltbx - -# Generated helpsearch folders -helpsearch*/ - -# Simulink code generation folders -slprj/ -sccprj/ - -# Matlab code generation folders -codegen/ - -# Simulink autosave extension -*.autosave +# Created by https://www.gitignore.io/api/matlab +# Edit at https://www.gitignore.io/?templates=matlab + +### MATLAB ### +# Windows default autosave extension +*.asv + +# OSX / *nix default autosave extension +*.m~ + +# Compiled MEX binaries (all platforms) +*.mex* + +# Packaged app and toolbox files +*.mlappinstall +*.mltbx + +# Generated helpsearch folders +helpsearch*/ + +# Simulink code generation folders +slprj/ +sccprj/ + +# Matlab code generation folders +codegen/ + +# Simulink autosave extension +*.autosave diff --git a/README.md b/README.md index ddf244b..aa54937 100644 --- a/README.md +++ b/README.md @@ -1,47 +1,63 @@ -# dotenv for MATLAB -> A MATLAB implementation of the dotenv pattern. - -Storing configuration in the environment separate from code is based on [The Twelve-Factor App](https://12factor.net/config) methodology. dotenv for MATLAB® lets you store configuration data (passwords, API keys, server names, etc.) outside of your code. This lets you share your code without sharing your configuration data. - -![screenshot](config/dotenv-screenshot.png "MATLAB Screenshot") - -[![mathworks](https://circleci.com/gh/mathworks/dotenv-for-MATLAB.svg?style=shield)](https://circleci.com/gh/mathworks/dotenv-for-MATLAB) - -[![View dotenv-for-MATLAB on File Exchange](https://www.mathworks.com/matlabcentral/images/matlab-file-exchange.svg)](https://www.mathworks.com/matlabcentral/fileexchange/73988-dotenv-for-matlab) -## Installation -Put `dotenv.m` somewhere on your [search path](https://www.mathworks.com/help/matlab/ref/path.html). - -## Usage Example -`dotenv()` will try and load a file named `.env` from the current working folder. Alternatively, you can specify the path with `dotenv('path/to/file.env')`. - -`.env` -```text -API_KEY=ybvxtzwaxa:r42DtRhuUT7TywYpzBABOFZ0IIomwuIEXnfFVq2VSXjRC -``` - -`file.m` -```matlab -d = dotenv(); -opts = weboptions('HeaderField', ["accept", "any"; "authorization", d.env.API_KEY]) -url = "https://myurl.com" -response = webread(url, opts); -``` -Common places you may need to do this are [`weboptions()`](https://www.mathworks.com/help/matlab/ref/weboptions.html), the [Database Toolbox](https://www.mathworks.com/help/database/ug/database.odbc.connection.html), or [`ftp()`](https://www.mathworks.com/help/matlab/ref/ftp.html). - -## Rules -The parsing engine currently supports the following rules: -* empty lines are skipped -* lines beginning with `#` are treated as comments -* empty values become empty strings (`DB_HOST=` becomes `DBHOST: ''`) -* whitespace is removed from both ends of unquoted values (`DB_HOST=some server` becomes `DB_HOST:'some server'`) -* quoted values are escaped (`DB_PASS=" some password "` becomes `DB_PASS:' some password '`) - -## FAQ -### Should I commit my `.env` file? -No. You should put `*.env` in your `.gitignore` file. - -## Development Setup -Clone the repository. You can run `runtests('tests')` from the project root to run the unit test suite. - -## Bugs? -I would love to hear if this breaks on any weird strings or doesn't work the way you expected. +# dotenv for MATLAB + +> A MATLAB implementation of dotenv + +Storing [configuration in the environment](https://12factor.net/config) is one of the tenets of a [12-factor app](https://12factor.net/). dotenv for MATLAB® lets you store configuration data (passwords, API keys, server names, etc.) outside of your code. This lets you share your code without sharing your configuration data. + +![screenshot](config/dotenv-compare.png "MATLAB Screenshot") + +[![mathworks](https://circleci.com/gh/mathworks/dotenv-for-MATLAB.svg?style=shield)](https://circleci.com/gh/mathworks/dotenv-for-MATLAB) + +[![View dotenv-for-MATLAB on File Exchange](https://www.mathworks.com/matlabcentral/images/matlab-file-exchange.svg)](https://www.mathworks.com/matlabcentral/fileexchange/73988-dotenv-for-matlab) + +## Installation + +Put `dotenv.m` somewhere on your [search path](https://www.mathworks.com/help/matlab/ref/path.html). + +## Usage Example + +`dotenv()` will try and load a file named `.env` from the current working folder. Alternatively, you can specify the path with `dotenv('path/to/file.env')`. + +`.env` + +```perl +# Obligatory XKCD https://xkcd.com/936/ +password=correct-horse-battery-staple +``` + +`file.m` + +```matlab +d = dotenv(); +opts = weboptions('HeaderField', ["accept", "any"; "authorization", d.env.password]) +url = "https://myurl.com" +response = webread(url, opts); +``` + +Common places you may need to do this are [`weboptions()`](https://www.mathworks.com/help/matlab/ref/weboptions.html), [working with remote data like S3 buckets](https://www.mathworks.com/help/matlab/import_export/work-with-remote-data.html), the [Database Toolbox](https://www.mathworks.com/help/database/ug/database.odbc.connection.html), or [`ftp()`](https://www.mathworks.com/help/matlab/ref/ftp.html). + +## Rules + +The parsing engine currently supports the following rules: + +* empty lines are skipped +* lines beginning with `#` are treated as comments +* empty values become empty strings (`DB_HOST=` becomes `DBHOST: ''`) +* whitespace is removed from both ends of unquoted values (`DB_HOST=some server` becomes `DB_HOST:'some server'`) +* quoted values are escaped (`DB_PASS=" some password "` becomes `DB_PASS:' some password '`) + +Examples are in the [config](config/) directory. + +## FAQ + +### Should I commit my `.env` file? + +No. You should put `*.env` in your `.gitignore` file. [MATLAB.gitignore](https://github.com/github/gitignore/blob/master/Global/MATLAB.gitignore) plus `*.env` is a good start. + +## Development Setup + +Clone the repository. You can run `runtests('tests')` from the project root to run the [unit test suite](tests/). + +## Bugs? + +I would love to hear if this breaks on any weird strings or doesn't work the way you expected. diff --git a/config/.env b/config/.env index b8050ea..7416ffc 100644 --- a/config/.env +++ b/config/.env @@ -1,4 +1,4 @@ -DB_HOST=localhost -DB_USER=root -DB_PASS=s1mpl3 +DB_HOST=localhost +DB_USER=root +DB_PASS=s1mpl3 #DB_COMMENT=comment \ No newline at end of file diff --git a/config/README.md b/config/README.md new file mode 100644 index 0000000..6e60a84 --- /dev/null +++ b/config/README.md @@ -0,0 +1,43 @@ +# Config files + +## [.env](.env) + +Shows basic functionality including the ability to comment out entries. + +## [blanklines.env](blanklines.env) + +Blank lines should be skipped. + +## [bottomcomment.env](bottomcomment.env) + +Comments should be ignored even if they're they last entry. + +## [empty.env](empty.env) + +A key doesn't have to have a value. `MYHOST=` should resolve to a kv pair of `'MYHOST': ''` + +## [equalPassword.env](equalPassword.env) + +If there is more than one `=` in an entry the kv pair splits on the first `=`. + +`DB_PASS=s1mpl3=123` resolves to a kv pair of `DB_PASS:s1mpl3=123`. **Not** `DB_PASS=s1mpl3: 123` + +## [middleComment.env](middleComment.env) + +Comments in the middle of a set of entries have no effect. Tests to ensure that succeeding entries still get processed. + +## [single.env](single.env) + +To test functonality for a single entry. + +## [specialchars.env](specialchars.env) + +Values with a space preserve the space. `DB_HOST=some server` becomes `DB_HOST:'some server'`. + +## [topcomment.env](topcomment.env) + +Comments should have no effect. Tests functionality if the first entry is commented out. + +## [whitespace.env](whitespace.env) + +Whitespace is ignored. diff --git a/config/blanklines.env b/config/blanklines.env index 56ad8df..c6eb1da 100644 --- a/config/blanklines.env +++ b/config/blanklines.env @@ -1,6 +1,6 @@ -DB_HOST=localhost - - -DB_USER=root -DB_PASS=s1mpl3 +DB_HOST=localhost + + +DB_USER=root +DB_PASS=s1mpl3 DB_COMMENT=comment \ No newline at end of file diff --git a/config/bottomcomment.env b/config/bottomcomment.env index b8050ea..7416ffc 100644 --- a/config/bottomcomment.env +++ b/config/bottomcomment.env @@ -1,4 +1,4 @@ -DB_HOST=localhost -DB_USER=root -DB_PASS=s1mpl3 +DB_HOST=localhost +DB_USER=root +DB_PASS=s1mpl3 #DB_COMMENT=comment \ No newline at end of file diff --git a/config/dotenv-compare.png b/config/dotenv-compare.png new file mode 100644 index 0000000000000000000000000000000000000000..2ec5d17af66bc3c1f7b59ce365496a2cea02f454 GIT binary patch literal 99829 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 z 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 - + + diff --git a/dotenv.m b/dotenv.m index d9a7fc1..1429447 100644 --- a/dotenv.m +++ b/dotenv.m @@ -1,77 +1,90 @@ -classdef dotenv - % Dotenv Implementation of common dotenv pattern - % dotenv allows you to load environment variables at runtime without - % committing your .env file to source control. A common reason for - % doing this is that you need a password or API key but don't want to - % embed that in your code or in source control. - % See https://github.com/motdotla/dotenv for inspiration - % Copyright 2019-2019 The MathWorks, Inc. - - properties (SetAccess = immutable) - env % Structure to hold key/value pairs. Access via d.env.key. - end - - properties (Access = private) - fname - end - - - methods - function obj = dotenv(location) - % d = dotenv([path/to/file.env]) -- load .env file from current working directory or specified via path. - obj.env = struct; - switch nargin - case 1 % if there is an argument load that file - obj.fname = location; - case 0 % otherwise load the file from the current directory - obj.fname = '.env'; - end - - % ensure we can open the file - try - fid = fopen(obj.fname, 'r'); - assert(fid ~= -1); - catch - throw( MException('DOTENV:CannotOpenFile', "Cannot open file: " + obj.fname + ". Code: " + fid) ); - end - fclose(fid); - - % load the .env file with name=value pairs into the 'env' struct - lines = string(splitlines(fileread(obj.fname))); - - notOK = startsWith(lines, '#'); - lines(notOK) = []; - - expr = "(?.+?)=(?.*)"; - kvpair = regexp(lines, expr, 'names'); - - % Deal with single entry case where regexp does not return a - % cell array - if iscell(kvpair) - kvpair(cellfun(@isempty, kvpair)) = []; - kvpair = cellfun(@(x) struct('key', x.key, 'value', x.value), kvpair); - end - - obj.env = cell2struct(strtrim({kvpair.value}), [kvpair.key], 2); - - end - - function val = subsref(obj, s) - % Overload subsref to handle d.env (all key/value pairs vs. d.env.key (the value specified by the supplied key) - if size(s, 2) == 1 - % this handles the case of d.env - val=obj.env; - else - % this handles the case of d.env.KEY_NAME - if isfield(obj.env, s(2).subs) - val = obj.env.(s(2).subs); - else - val = ""; - end - end - end - - end - -end - +classdef dotenv + % Dotenv Implementation of dotenv pattern + % dotenv allows you to load environment variables at runtime without + % committing your .env file to source control. A common reason for + % doing this is that you need a password or API key but don't want to + % embed that in your code or in source control. + % See https://github.com/motdotla/dotenv for inspiration + % Copyright 2019-2021 The MathWorks, Inc. + + properties (SetAccess = immutable) + env % Structure to hold key/value pairs. Access via d.env.key. + end + + properties (Access = private) + fname + end + + + methods + function obj = dotenv(location) + % d = dotenv([path/to/file.env]) -- load .env file from current working directory or specified via path. + obj.env = struct; + switch nargin + case 1 % if there is an argument load that file + obj.fname = location; + case 0 % otherwise load the file from the current directory + obj.fname = '.env'; + end + + % ensure we can open the file + try + fid = fopen(obj.fname, 'r'); + assert(fid ~= -1); + catch + throw( MException('DOTENV:CannotOpenFile', "Cannot open file: " + obj.fname + ". Code: " + fid) ); + end + fclose(fid); + + % load the .env file with name=value pairs into the 'env' struct + % 20b (v9.10) introduced readlines() + if verLessThan('matlab', '9.10') + lines = string(splitlines(fileread(obj.fname))); + else + % I put in the feature request for readlines() so I better + % use it :) + lines = readlines(obj.fname); + end + + notOK = startsWith(lines, '#'); + lines(notOK) = []; + + % expr splits the line into a key / value pairs with regex + % capture. It captures one or more characters up to the first + % instance of an '=' in 'key' and then zero or more characters + % into 'value'. + expr = "(?.+?)=(?.*)"; + kvpair = regexp(lines, expr, 'names'); + + % Deal with single entry case where regexp does not return a + % cell array + if iscell(kvpair) + kvpair(cellfun(@isempty, kvpair)) = []; + kvpair = cellfun(@(x) struct('key', x.key, 'value', x.value), kvpair); + end + + % to be able to use dot reference we need to convert it to a + % structure + obj.env = cell2struct(strtrim({kvpair.value}), [kvpair.key], 2); + + end + + function val = subsref(obj, s) + % Overload subsref to handle d.env (all key/value pairs) vs. d.env.key (the value specified by the supplied key) + if size(s, 2) == 1 + % this handles the case of d.env + val=obj.env; + else + % this handles the case of d.env.KEY_NAME + if isfield(obj.env, s(2).subs) + val = obj.env.(s(2).subs); + else + val = ""; + end + end + end + + end + +end + diff --git a/license.txt b/license.txt index a51adaa..2bfd3ea 100644 --- a/license.txt +++ b/license.txt @@ -1,10 +1,10 @@ -Copyright (c) 2019, The MathWorks, Inc. -All rights reserved. -Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: -1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. -2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. -3. In all cases, the software is, and all modifications and derivatives of the software shall be, licensed to you solely for use in conjunction with MathWorks products and service offerings. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - - +Copyright (c) 2019, The MathWorks, Inc. +All rights reserved. +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: +1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. +2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. +3. In all cases, the software is, and all modifications and derivatives of the software shall be, licensed to you solely for use in conjunction with MathWorks products and service offerings. +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + + diff --git a/resources/project/Extensions.type.Root/Information.type.Extension.xml b/resources/project/Extensions.type.Root/Information.type.Extension.xml index f1c0cca..50af6b3 100644 --- a/resources/project/Extensions.type.Root/Information.type.Extension.xml +++ b/resources/project/Extensions.type.Root/Information.type.Extension.xml @@ -1,2 +1,2 @@ - + \ No newline at end of file diff --git a/resources/project/Project.xml b/resources/project/Project.xml index 9806406..4a9e34e 100644 --- a/resources/project/Project.xml +++ b/resources/project/Project.xml @@ -1,2 +1,2 @@ - + \ No newline at end of file diff --git a/resources/project/ProjectData.type.Info.xml b/resources/project/ProjectData.type.Info.xml index b00922f..3f56bfd 100644 --- a/resources/project/ProjectData.type.Info.xml +++ b/resources/project/ProjectData.type.Info.xml @@ -1,2 +1,2 @@ - + \ No newline at end of file diff --git a/resources/project/Root.type.Categories/FileClassCategory.type.Category.xml b/resources/project/Root.type.Categories/FileClassCategory.type.Category.xml index 04b80f5..ef38945 100644 --- a/resources/project/Root.type.Categories/FileClassCategory.type.Category.xml +++ b/resources/project/Root.type.Categories/FileClassCategory.type.Category.xml @@ -1,2 +1,2 @@ - + \ No newline at end of file diff --git a/resources/project/Root.type.Categories/FileClassCategory.type.Category/artifact.type.Label.xml b/resources/project/Root.type.Categories/FileClassCategory.type.Category/artifact.type.Label.xml index a0b6797..b56f659 100644 --- a/resources/project/Root.type.Categories/FileClassCategory.type.Category/artifact.type.Label.xml +++ b/resources/project/Root.type.Categories/FileClassCategory.type.Category/artifact.type.Label.xml @@ -1,2 +1,2 @@ - + \ No newline at end of file diff --git a/resources/project/Root.type.Categories/FileClassCategory.type.Category/convenience.type.Label.xml b/resources/project/Root.type.Categories/FileClassCategory.type.Category/convenience.type.Label.xml index 894805d..5272801 100644 --- a/resources/project/Root.type.Categories/FileClassCategory.type.Category/convenience.type.Label.xml +++ b/resources/project/Root.type.Categories/FileClassCategory.type.Category/convenience.type.Label.xml @@ -1,2 +1,2 @@ - + \ No newline at end of file diff --git a/resources/project/Root.type.Categories/FileClassCategory.type.Category/derived.type.Label.xml b/resources/project/Root.type.Categories/FileClassCategory.type.Category/derived.type.Label.xml index a357dc8..5a873c8 100644 --- a/resources/project/Root.type.Categories/FileClassCategory.type.Category/derived.type.Label.xml +++ b/resources/project/Root.type.Categories/FileClassCategory.type.Category/derived.type.Label.xml @@ -1,2 +1,2 @@ - + \ No newline at end of file diff --git a/resources/project/Root.type.Categories/FileClassCategory.type.Category/design.type.Label.xml b/resources/project/Root.type.Categories/FileClassCategory.type.Category/design.type.Label.xml index bc411bf..59cb0be 100644 --- a/resources/project/Root.type.Categories/FileClassCategory.type.Category/design.type.Label.xml +++ b/resources/project/Root.type.Categories/FileClassCategory.type.Category/design.type.Label.xml @@ -1,2 +1,2 @@ - + \ No newline at end of file diff --git a/resources/project/Root.type.Categories/FileClassCategory.type.Category/none.type.Label.xml b/resources/project/Root.type.Categories/FileClassCategory.type.Category/none.type.Label.xml index 7622146..27ca3e7 100644 --- a/resources/project/Root.type.Categories/FileClassCategory.type.Category/none.type.Label.xml +++ b/resources/project/Root.type.Categories/FileClassCategory.type.Category/none.type.Label.xml @@ -1,2 +1,2 @@ - + \ No newline at end of file diff --git a/resources/project/Root.type.Categories/FileClassCategory.type.Category/other.type.Label.xml b/resources/project/Root.type.Categories/FileClassCategory.type.Category/other.type.Label.xml index 968d69b..14d104f 100644 --- a/resources/project/Root.type.Categories/FileClassCategory.type.Category/other.type.Label.xml +++ b/resources/project/Root.type.Categories/FileClassCategory.type.Category/other.type.Label.xml @@ -1,2 +1,2 @@ - + \ No newline at end of file diff --git a/resources/project/Root.type.Categories/FileClassCategory.type.Category/test.type.Label.xml b/resources/project/Root.type.Categories/FileClassCategory.type.Category/test.type.Label.xml index 8c2b952..5a6f802 100644 --- a/resources/project/Root.type.Categories/FileClassCategory.type.Category/test.type.Label.xml +++ b/resources/project/Root.type.Categories/FileClassCategory.type.Category/test.type.Label.xml @@ -1,2 +1,2 @@ - + \ No newline at end of file diff --git a/resources/project/Root.type.EntryPointGroups/f8c886b5-f8d3-4640-8a84-2325ec11a40f.type.EntryPointGroup.xml b/resources/project/Root.type.EntryPointGroups/f8c886b5-f8d3-4640-8a84-2325ec11a40f.type.EntryPointGroup.xml index 25e0e47..04d16e1 100644 --- a/resources/project/Root.type.EntryPointGroups/f8c886b5-f8d3-4640-8a84-2325ec11a40f.type.EntryPointGroup.xml +++ b/resources/project/Root.type.EntryPointGroups/f8c886b5-f8d3-4640-8a84-2325ec11a40f.type.EntryPointGroup.xml @@ -1,2 +1,2 @@ - + \ No newline at end of file diff --git a/resources/project/Root.type.Files/.env.type.File.xml b/resources/project/Root.type.Files/.env.type.File.xml index 89f7222..d9a9e30 100644 --- a/resources/project/Root.type.Files/.env.type.File.xml +++ b/resources/project/Root.type.Files/.env.type.File.xml @@ -1,6 +1,6 @@ - - - - + + + + \ No newline at end of file diff --git a/resources/project/Root.type.Files/.gitignore.type.File.xml b/resources/project/Root.type.Files/.gitignore.type.File.xml index f14960e..1c0844e 100644 --- a/resources/project/Root.type.Files/.gitignore.type.File.xml +++ b/resources/project/Root.type.Files/.gitignore.type.File.xml @@ -1,2 +1,2 @@ - + \ No newline at end of file diff --git a/resources/project/Root.type.Files/README.md.type.File.xml b/resources/project/Root.type.Files/README.md.type.File.xml index f14960e..1c0844e 100644 --- a/resources/project/Root.type.Files/README.md.type.File.xml +++ b/resources/project/Root.type.Files/README.md.type.File.xml @@ -1,2 +1,2 @@ - + \ No newline at end of file diff --git a/resources/project/Root.type.Files/config.type.File.xml b/resources/project/Root.type.Files/config.type.File.xml index f14960e..1c0844e 100644 --- a/resources/project/Root.type.Files/config.type.File.xml +++ b/resources/project/Root.type.Files/config.type.File.xml @@ -1,2 +1,2 @@ - + \ No newline at end of file diff --git a/resources/project/Root.type.Files/config.type.File/.env.type.File.xml b/resources/project/Root.type.Files/config.type.File/.env.type.File.xml index 89f7222..d9a9e30 100644 --- a/resources/project/Root.type.Files/config.type.File/.env.type.File.xml +++ b/resources/project/Root.type.Files/config.type.File/.env.type.File.xml @@ -1,6 +1,6 @@ - - - - + + + + \ No newline at end of file diff --git a/resources/project/Root.type.Files/config.type.File/1.type.DIR_SIGNIFIER.xml b/resources/project/Root.type.Files/config.type.File/1.type.DIR_SIGNIFIER.xml index f14960e..1c0844e 100644 --- a/resources/project/Root.type.Files/config.type.File/1.type.DIR_SIGNIFIER.xml +++ b/resources/project/Root.type.Files/config.type.File/1.type.DIR_SIGNIFIER.xml @@ -1,2 +1,2 @@ - + \ No newline at end of file diff --git a/resources/project/Root.type.Files/config.type.File/blanklines.env.type.File.xml b/resources/project/Root.type.Files/config.type.File/blanklines.env.type.File.xml index 89f7222..d9a9e30 100644 --- a/resources/project/Root.type.Files/config.type.File/blanklines.env.type.File.xml +++ b/resources/project/Root.type.Files/config.type.File/blanklines.env.type.File.xml @@ -1,6 +1,6 @@ - - - - + + + + \ No newline at end of file diff --git a/resources/project/Root.type.Files/config.type.File/bottomcomment.env.type.File.xml b/resources/project/Root.type.Files/config.type.File/bottomcomment.env.type.File.xml index 89f7222..d9a9e30 100644 --- a/resources/project/Root.type.Files/config.type.File/bottomcomment.env.type.File.xml +++ b/resources/project/Root.type.Files/config.type.File/bottomcomment.env.type.File.xml @@ -1,6 +1,6 @@ - - - - + + + + \ No newline at end of file diff --git a/resources/project/Root.type.Files/config.type.File/dotenv-screenshot.png.type.File.xml b/resources/project/Root.type.Files/config.type.File/dotenv-screenshot.png.type.File.xml index f14960e..1c0844e 100644 --- a/resources/project/Root.type.Files/config.type.File/dotenv-screenshot.png.type.File.xml +++ b/resources/project/Root.type.Files/config.type.File/dotenv-screenshot.png.type.File.xml @@ -1,2 +1,2 @@ - + \ No newline at end of file diff --git a/resources/project/Root.type.Files/config.type.File/empty.env.type.File.xml b/resources/project/Root.type.Files/config.type.File/empty.env.type.File.xml index 89f7222..d9a9e30 100644 --- a/resources/project/Root.type.Files/config.type.File/empty.env.type.File.xml +++ b/resources/project/Root.type.Files/config.type.File/empty.env.type.File.xml @@ -1,6 +1,6 @@ - - - - + + + + \ No newline at end of file diff --git a/resources/project/Root.type.Files/config.type.File/equalPassword.env.type.File.xml b/resources/project/Root.type.Files/config.type.File/equalPassword.env.type.File.xml index 89f7222..d9a9e30 100644 --- a/resources/project/Root.type.Files/config.type.File/equalPassword.env.type.File.xml +++ b/resources/project/Root.type.Files/config.type.File/equalPassword.env.type.File.xml @@ -1,6 +1,6 @@ - - - - + + + + \ No newline at end of file diff --git a/resources/project/Root.type.Files/config.type.File/middlecomment.env.type.File.xml b/resources/project/Root.type.Files/config.type.File/middlecomment.env.type.File.xml index 89f7222..d9a9e30 100644 --- a/resources/project/Root.type.Files/config.type.File/middlecomment.env.type.File.xml +++ b/resources/project/Root.type.Files/config.type.File/middlecomment.env.type.File.xml @@ -1,6 +1,6 @@ - - - - + + + + \ No newline at end of file diff --git a/resources/project/Root.type.Files/config.type.File/single.env.type.File.xml b/resources/project/Root.type.Files/config.type.File/single.env.type.File.xml index f14960e..1c0844e 100644 --- a/resources/project/Root.type.Files/config.type.File/single.env.type.File.xml +++ b/resources/project/Root.type.Files/config.type.File/single.env.type.File.xml @@ -1,2 +1,2 @@ - + \ No newline at end of file diff --git a/resources/project/Root.type.Files/config.type.File/specialchars.env.type.File.xml b/resources/project/Root.type.Files/config.type.File/specialchars.env.type.File.xml index 89f7222..d9a9e30 100644 --- a/resources/project/Root.type.Files/config.type.File/specialchars.env.type.File.xml +++ b/resources/project/Root.type.Files/config.type.File/specialchars.env.type.File.xml @@ -1,6 +1,6 @@ - - - - + + + + \ No newline at end of file diff --git a/resources/project/Root.type.Files/config.type.File/topcomment.env.type.File.xml b/resources/project/Root.type.Files/config.type.File/topcomment.env.type.File.xml index 89f7222..d9a9e30 100644 --- a/resources/project/Root.type.Files/config.type.File/topcomment.env.type.File.xml +++ b/resources/project/Root.type.Files/config.type.File/topcomment.env.type.File.xml @@ -1,6 +1,6 @@ - - - - + + + + \ No newline at end of file diff --git a/resources/project/Root.type.Files/config.type.File/whitespace.env.type.File.xml b/resources/project/Root.type.Files/config.type.File/whitespace.env.type.File.xml index 89f7222..d9a9e30 100644 --- a/resources/project/Root.type.Files/config.type.File/whitespace.env.type.File.xml +++ b/resources/project/Root.type.Files/config.type.File/whitespace.env.type.File.xml @@ -1,6 +1,6 @@ - - - - + + + + \ No newline at end of file diff --git a/resources/project/Root.type.Files/dotenv.m.type.File.xml b/resources/project/Root.type.Files/dotenv.m.type.File.xml index afaafcc..80b5b16 100644 --- a/resources/project/Root.type.Files/dotenv.m.type.File.xml +++ b/resources/project/Root.type.Files/dotenv.m.type.File.xml @@ -1,6 +1,6 @@ - - - - + + + + \ No newline at end of file diff --git a/resources/project/Root.type.Files/license.txt.type.File.xml b/resources/project/Root.type.Files/license.txt.type.File.xml index f14960e..1c0844e 100644 --- a/resources/project/Root.type.Files/license.txt.type.File.xml +++ b/resources/project/Root.type.Files/license.txt.type.File.xml @@ -1,2 +1,2 @@ - + \ No newline at end of file diff --git a/resources/project/Root.type.Files/tests.type.File.xml b/resources/project/Root.type.Files/tests.type.File.xml index c62f4b0..d8fadf3 100644 --- a/resources/project/Root.type.Files/tests.type.File.xml +++ b/resources/project/Root.type.Files/tests.type.File.xml @@ -1,6 +1,6 @@ - - - - + + + + \ No newline at end of file diff --git a/resources/project/Root.type.Files/tests.type.File/.env.type.File.xml b/resources/project/Root.type.Files/tests.type.File/.env.type.File.xml index f14960e..1c0844e 100644 --- a/resources/project/Root.type.Files/tests.type.File/.env.type.File.xml +++ b/resources/project/Root.type.Files/tests.type.File/.env.type.File.xml @@ -1,2 +1,2 @@ - + \ No newline at end of file diff --git a/resources/project/Root.type.Files/tests.type.File/1.type.DIR_SIGNIFIER.xml b/resources/project/Root.type.Files/tests.type.File/1.type.DIR_SIGNIFIER.xml index f14960e..1c0844e 100644 --- a/resources/project/Root.type.Files/tests.type.File/1.type.DIR_SIGNIFIER.xml +++ b/resources/project/Root.type.Files/tests.type.File/1.type.DIR_SIGNIFIER.xml @@ -1,2 +1,2 @@ - + \ No newline at end of file diff --git a/resources/project/Root.type.Files/tests.type.File/fileTest.m.type.File.xml b/resources/project/Root.type.Files/tests.type.File/fileTest.m.type.File.xml index c62f4b0..d8fadf3 100644 --- a/resources/project/Root.type.Files/tests.type.File/fileTest.m.type.File.xml +++ b/resources/project/Root.type.Files/tests.type.File/fileTest.m.type.File.xml @@ -1,6 +1,6 @@ - - - - + + + + \ No newline at end of file diff --git a/resources/project/Root.type.Files/tests.type.File/rulesTest.m.type.File.xml b/resources/project/Root.type.Files/tests.type.File/rulesTest.m.type.File.xml index c62f4b0..d8fadf3 100644 --- a/resources/project/Root.type.Files/tests.type.File/rulesTest.m.type.File.xml +++ b/resources/project/Root.type.Files/tests.type.File/rulesTest.m.type.File.xml @@ -1,6 +1,6 @@ - - - - + + + + \ No newline at end of file diff --git a/resources/project/Root.type.Files/tests.type.File/valueRetrieveTest.m.type.File.xml b/resources/project/Root.type.Files/tests.type.File/valueRetrieveTest.m.type.File.xml index c62f4b0..d8fadf3 100644 --- a/resources/project/Root.type.Files/tests.type.File/valueRetrieveTest.m.type.File.xml +++ b/resources/project/Root.type.Files/tests.type.File/valueRetrieveTest.m.type.File.xml @@ -1,6 +1,6 @@ - - - - + + + + \ No newline at end of file diff --git a/resources/project/Root.type.ProjectPath/077101fe-d6c5-492f-a597-59001c2d4176.type.Reference.xml b/resources/project/Root.type.ProjectPath/077101fe-d6c5-492f-a597-59001c2d4176.type.Reference.xml index dd31cfb..9a74e6c 100644 --- a/resources/project/Root.type.ProjectPath/077101fe-d6c5-492f-a597-59001c2d4176.type.Reference.xml +++ b/resources/project/Root.type.ProjectPath/077101fe-d6c5-492f-a597-59001c2d4176.type.Reference.xml @@ -1,2 +1,2 @@ - + \ No newline at end of file diff --git a/resources/project/Root.type.ProjectPath/b715ba8c-e48c-49be-8727-c90cc30c4ae9.type.Reference.xml b/resources/project/Root.type.ProjectPath/b715ba8c-e48c-49be-8727-c90cc30c4ae9.type.Reference.xml index 4951d26..aa25c75 100644 --- a/resources/project/Root.type.ProjectPath/b715ba8c-e48c-49be-8727-c90cc30c4ae9.type.Reference.xml +++ b/resources/project/Root.type.ProjectPath/b715ba8c-e48c-49be-8727-c90cc30c4ae9.type.Reference.xml @@ -1,2 +1,2 @@ - + \ No newline at end of file diff --git a/resources/project/Root.type.ProjectPath/cd9851d8-0174-4f87-b435-d9f5e2bb0dbe.type.Reference.xml b/resources/project/Root.type.ProjectPath/cd9851d8-0174-4f87-b435-d9f5e2bb0dbe.type.Reference.xml index b1d8e4e..59b7a5d 100644 --- a/resources/project/Root.type.ProjectPath/cd9851d8-0174-4f87-b435-d9f5e2bb0dbe.type.Reference.xml +++ b/resources/project/Root.type.ProjectPath/cd9851d8-0174-4f87-b435-d9f5e2bb0dbe.type.Reference.xml @@ -1,2 +1,2 @@ - + \ No newline at end of file diff --git a/resources/project/uuid-f9b4998b-e6e6-4342-90ba-a1b77c2a87b2.xml b/resources/project/uuid-f9b4998b-e6e6-4342-90ba-a1b77c2a87b2.xml index f14960e..1c0844e 100644 --- a/resources/project/uuid-f9b4998b-e6e6-4342-90ba-a1b77c2a87b2.xml +++ b/resources/project/uuid-f9b4998b-e6e6-4342-90ba-a1b77c2a87b2.xml @@ -1,2 +1,2 @@ - + \ No newline at end of file diff --git a/tests/.env b/tests/.env index ddc0820..4b2bcd7 100644 --- a/tests/.env +++ b/tests/.env @@ -1,3 +1,3 @@ -DB_HOST=localhost -DB_USER=root +DB_HOST=localhost +DB_USER=root DB_PASS=s1mple \ No newline at end of file diff --git a/tests/fileTest.m b/tests/fileTest.m index bcff494..42d324b 100644 --- a/tests/fileTest.m +++ b/tests/fileTest.m @@ -1,22 +1,22 @@ -% Copyright 2019-2019 The MathWorks, Inc. - -function tests = fileTest -tests = functiontests(localfunctions); -end - -function testFileNotFound(testCase) -testCase.verifyError(@() dotenv('config/dotenv'), 'DOTENV:CannotOpenFile', ... - 'Should error properly for file that doesn''t exist'); -end - -function testDefaultLocation(testCase) -%% Opens default ./.env file -d = dotenv(); -testCase.verifyEqual(d.env.DB_HOST, "localhost"); -end - -function testNamedLocation(testCase) -%% Opens nested .env file -d = dotenv('../config/.env'); -testCase.verifyEqual(d.env.DB_HOST, "localhost"); +% Copyright 2019-2019 The MathWorks, Inc. + +function tests = fileTest +tests = functiontests(localfunctions); +end + +function testFileNotFound(testCase) +testCase.verifyError(@() dotenv('config/dotenv'), 'DOTENV:CannotOpenFile', ... + 'Should error properly for file that doesn''t exist'); +end + +function testDefaultLocation(testCase) +%% Opens default ./.env file +d = dotenv(); +testCase.verifyEqual(d.env.DB_HOST, "localhost"); +end + +function testNamedLocation(testCase) +%% Opens nested .env file +d = dotenv('../config/.env'); +testCase.verifyEqual(d.env.DB_HOST, "localhost"); end \ No newline at end of file diff --git a/tests/rulesTest.m b/tests/rulesTest.m index 6000c18..1d3e477 100644 --- a/tests/rulesTest.m +++ b/tests/rulesTest.m @@ -1,66 +1,66 @@ -% Copyright 2019-2019 The MathWorks, Inc. - -function tests = rulesTest() -%Rules Test tests expected behavoir of .env config -% See https://github.com/motdotla/dotenv#rules -tests = functiontests(localfunctions); -end - -function testTopComment(testCase) -% Tests that lines starting with # are skipped -% specifically tests first line comment -d = dotenv('../config/topcomment.env'); -testCase.verifyNumElements(fieldnames(d.env), 3); -end - -function testMiddleComment(testCase) -% Tests that lines starting with # are skipped -% specifically tests interior comment -d = dotenv('../config/middlecomment.env'); -testCase.verifyNumElements(fieldnames(d.env), 3); -end - -function testBottomComment(testCase) -% Tests that lines starting with # are skipped -% specifically tests last line comment -d = dotenv('../config/bottomcomment.env'); -testCase.verifyNumElements(fieldnames(d.env), 3); -end - -function testBlankLines(testCase) -d = dotenv('../config/blanklines.env'); -testCase.verifyNumElements(fieldnames(d.env), 4); -end - -function testEqualsInPassword(testCase) -d = dotenv('../config/equalPassword.env'); -testCase.verifyEqual("s1mpl3=123", d.env.DB_PASS); -end - -function testWhitespaceValue(testCase) -d = dotenv('../config/whitespace.env'); -testCase.verifyEqual("localhost server", d.env.DB_HOST); -end - -function testEmptyValue(testCase) -d = dotenv('../config/empty.env'); -testCase.verifyEqual(d.env.DB_HOST,""); -end - -function testUnquotedWhitespace(testCase) -% D.configure should trim leading and trailing whitespace for whitespace values -d = dotenv('../config/whitespace.env'); -testCase.verifyEqual(d.env.DB_USER, "george"); -end - -function testQuotedValues(testCase) -d = dotenv('../config/whitespace.env'); -testCase.verifyEqual(d.env.DB_PASS, """ mypass """); -end - -function testSingleValue(testCase) -d = dotenv('../config/single.env'); -testCase.verifyEqual(d.env.DB_HOST, "localhost"); -end - - +% Copyright 2019-2019 The MathWorks, Inc. + +function tests = rulesTest() +% Rules Test tests expected behavoir of .env config +% See https://github.com/motdotla/dotenv#rules +tests = functiontests(localfunctions); +end + +function testTopComment(testCase) +% Tests that lines starting with # are skipped +% specifically tests first line comment +d = dotenv('../config/topcomment.env'); +testCase.verifyNumElements(fieldnames(d.env), 3); +end + +function testMiddleComment(testCase) +% Tests that lines starting with # are skipped +% specifically tests interior comment +d = dotenv('../config/middlecomment.env'); +testCase.verifyNumElements(fieldnames(d.env), 3); +end + +function testBottomComment(testCase) +% Tests that lines starting with # are skipped +% specifically tests last line comment +d = dotenv('../config/bottomcomment.env'); +testCase.verifyNumElements(fieldnames(d.env), 3); +end + +function testBlankLines(testCase) +d = dotenv('../config/blanklines.env'); +testCase.verifyNumElements(fieldnames(d.env), 4); +end + +function testEqualsInPassword(testCase) +d = dotenv('../config/equalPassword.env'); +testCase.verifyEqual("s1mpl3=123", d.env.DB_PASS); +end + +function testWhitespaceValue(testCase) +d = dotenv('../config/whitespace.env'); +testCase.verifyEqual("localhost server", d.env.DB_HOST); +end + +function testEmptyValue(testCase) +d = dotenv('../config/empty.env'); +testCase.verifyEqual(d.env.DB_HOST,""); +end + +function testUnquotedWhitespace(testCase) +% D.configure should trim leading and trailing whitespace for whitespace values +d = dotenv('../config/whitespace.env'); +testCase.verifyEqual(d.env.DB_USER, "george"); +end + +function testQuotedValues(testCase) +d = dotenv('../config/whitespace.env'); +testCase.verifyEqual(d.env.DB_PASS, """ mypass """); +end + +function testSingleValue(testCase) +d = dotenv('../config/single.env'); +testCase.verifyEqual(d.env.DB_HOST, "localhost"); +end + + diff --git a/tests/valueRetrieveTest.m b/tests/valueRetrieveTest.m index 409bcb2..2eecb76 100644 --- a/tests/valueRetrieveTest.m +++ b/tests/valueRetrieveTest.m @@ -1,17 +1,17 @@ -% Copyright 2019-2019 The MathWorks, Inc. - -function tests = valueRetrieveTest -tests = functiontests(localfunctions); -end - - -function testValidData(testCase) -d = dotenv(); -testCase.verifyEqual(d.env.DB_HOST,"localhost"); -end - - -function testInvalidName(testCase) -d = dotenv(); -testCase.verifyEqual(d.env.DB_HOSED, "", 'DB_HOSED variable doesn''t exist'); -end +% Copyright 2019-2019 The MathWorks, Inc. + +function tests = valueRetrieveTest +tests = functiontests(localfunctions); +end + + +function testValidData(testCase) +d = dotenv(); +testCase.verifyEqual(d.env.DB_HOST,"localhost"); +end + + +function testInvalidName(testCase) +d = dotenv(); +testCase.verifyEqual(d.env.DB_HOSED, "", 'DB_HOSED variable doesn''t exist'); +end