diff --git a/lib/fun_core/basic_signup_whitelist.ex b/lib/fun_core/basic_signup_whitelist.ex deleted file mode 100644 index 33dc034..0000000 --- a/lib/fun_core/basic_signup_whitelist.ex +++ /dev/null @@ -1,19 +0,0 @@ -defmodule FunCore.BasicSignupAllowlist do - def normalize(email) do - email |> String.trim() |> String.downcase() - end - - def addresses_as_list(addresses_str) do - addresses_str - |> String.split(",") - |> Enum.map(&normalize/1) - end - - def mail_allowlisted_fun(signups_allowed, email_received) do - case signups_allowed do - nil -> false - "*" -> true - list_str -> normalize(email_received) in addresses_as_list(list_str) - end - end -end diff --git a/plan.md b/plan.md index 50e0770..46db377 100644 --- a/plan.md +++ b/plan.md @@ -1,17 +1,17 @@ -# whitelist sketch +# allowlist sketch -Here's a complete Mix project structure with the email whitelist functionality and tests: +Here's a complete Mix project structure with the email allowlist functionality and tests: ## Project Structure ``` -email_whitelist_test/ +email_allowlist_test/ ├── config │ └── config.exs ├── lib -│ └── email_whitelist.ex +│ └── email_allowlist.ex ├── test -│ ├── email_whitelist_test.exs +│ ├── email_allowlist_test.exs │ └── test_helper.exs ├── mix.exs └── README.md @@ -25,7 +25,7 @@ defmodule EmailWhitelistTest.MixProject do def project do [ - app: :email_whitelist_test, + app: :email_allowlist_test, version: "0.1.0", elixir: "~> 1.14", start_permanent: Mix.env() == :prod, @@ -47,11 +47,11 @@ end import Config # Configure your application -config :email_whitelist_test, :allowed_emails, +config :email_allowlist_test, :allowed_emails, ["user@domain.com", "admin@example.org"] ``` -## 3. `lib/email_whitelist.ex` - Main Implementation +## 3. `lib/email_allowlist.ex` - Main Implementation ```elixir defmodule EmailWhitelist do @@ -64,10 +64,10 @@ defmodule EmailWhitelist do - Returns false if: * Environment variable doesn't exist * Environment variable is empty string - * Email not found in whitelist + * Email not found in allowlist """ - def mail_whitelisted(email) do + def mail_allowlisted(email) do normalized_email = String.downcase(email) env_var = System.get_env("ALLOWED_EMAILS") @@ -94,13 +94,13 @@ end ExUnit.start() ``` -## 5. `test/email_whitelist_test.exs` - Test Cases +## 5. `test/email_allowlist_test.exs` - Test Cases ```elixir defmodule EmailWhitelistTest do use ExUnit.Case, async: true - describe "mail_whitelisted/1" do + describe "mail_allowlisted/1" do setup do # Save original env var original_env = System.get_env("ALLOWED_EMAILS") @@ -119,59 +119,59 @@ defmodule EmailWhitelistTest do test "allows all emails when ALLOWED_EMAILS is '*'" do System.put_env("ALLOWED_EMAILS", "*") - assert EmailWhitelist.mail_whitelisted("any@example.com") == true - assert EmailWhitelist.mail_whitelisted("user@domain.com") == true - assert EmailWhitelist.mail_whitelisted("test@test.co.uk") == true + assert EmailWhitelist.mail_allowlisted("any@example.com") == true + assert EmailWhitelist.mail_allowlisted("user@domain.com") == true + assert EmailWhitelist.mail_allowlisted("test@test.co.uk") == true end - test "allows whitelisted emails" do + test "allows allowlisted emails" do System.put_env("ALLOWED_EMAILS", "user@domain.com,admin@example.org") - assert EmailWhitelist.mail_whitelisted("user@domain.com") == true - assert EmailWhitelist.mail_whitelisted("ADMIN@EXAMPLE.ORG") == true - assert EmailWhitelist.mail_whitelisted("User@Domain.Com") == true + assert EmailWhitelist.mail_allowlisted("user@domain.com") == true + assert EmailWhitelist.mail_allowlisted("ADMIN@EXAMPLE.ORG") == true + assert EmailWhitelist.mail_allowlisted("User@Domain.Com") == true end - test "rejects non-whitelisted emails" do + test "rejects non-allowlisted emails" do System.put_env("ALLOWED_EMAILS", "user@domain.com,admin@example.org") - assert EmailWhitelist.mail_whitelisted("invalid@example.com") == false - assert EmailWhitelist.mail_whitelisted("test@test.co.uk") == false + assert EmailWhitelist.mail_allowlisted("invalid@example.com") == false + assert EmailWhitelist.mail_allowlisted("test@test.co.uk") == false end test "rejects when ALLOWED_EMAILS is nil" do System.delete_env("ALLOWED_EMAILS") - assert EmailWhitelist.mail_whitelisted("any@example.com") == false + assert EmailWhitelist.mail_allowlisted("any@example.com") == false end test "rejects when ALLOWED_EMAILS is empty string" do System.put_env("ALLOWED_EMAILS", "") - assert EmailWhitelist.mail_whitelisted("any@example.com") == false + assert EmailWhitelist.mail_allowlisted("any@example.com") == false end - test "handles whitespace in email list" do + test "handles allowspace in email list" do System.put_env("ALLOWED_EMAILS", " user@domain.com , admin@example.org , test@test.co.uk ") - assert EmailWhitelist.mail_whitelisted("user@domain.com") == true - assert EmailWhitelist.mail_whitelisted("ADMIN@EXAMPLE.ORG") == true - assert EmailWhitelist.mail_whitelisted("test@test.co.uk") == true - assert EmailWhitelist.mail_whitelisted("invalid@example.com") == false + assert EmailWhitelist.mail_allowlisted("user@domain.com") == true + assert EmailWhitelist.mail_allowlisted("ADMIN@EXAMPLE.ORG") == true + assert EmailWhitelist.mail_allowlisted("test@test.co.uk") == true + assert EmailWhitelist.mail_allowlisted("invalid@example.com") == false end test "case insensitive matching works" do System.put_env("ALLOWED_EMAILS", "User@Domain.Com,ADMIN@EXAMPLE.ORG") - assert EmailWhitelist.mail_whitelisted("user@domain.com") == true - assert EmailWhitelist.mail_whitelisted("USER@DOMAIN.COM") == true - assert EmailWhitelist.mail_whitelisted("admin@example.org") == true + assert EmailWhitelist.mail_allowlisted("user@domain.com") == true + assert EmailWhitelist.mail_allowlisted("USER@DOMAIN.COM") == true + assert EmailWhitelist.mail_allowlisted("admin@example.org") == true end test "empty email returns false" do System.put_env("ALLOWED_EMAILS", "user@domain.com") - assert EmailWhitelist.mail_whitelisted("") == false + assert EmailWhitelist.mail_allowlisted("") == false end end end @@ -182,24 +182,24 @@ end ```markdown # EmailWhitelistTest -A simple Mix project demonstrating email whitelist functionality. +A simple Mix project demonstrating email allowlist functionality. ## Installation If [available in Hex](https://hex.pm/docs/publish), the package can be installed -by adding `email_whitelist_test` to your list of dependencies in `mix.exs`: +by adding `email_allowlist_test` to your list of dependencies in `mix.exs`: ```elixir def deps do [ - {:email_whitelist_test, "~> 0.1.0"} + {:email_allowlist_test, "~> 0.1.0"} ] end ``` ## Usage -The main function is `EmailWhitelist.mail_whitelisted/1` which checks if an email address is allowed. +The main function is `EmailWhitelist.mail_allowlisted/1` which checks if an email address is allowed. Environment variable configuration: - `ALLOWED_EMAILS="*"` - Allow all emails @@ -221,8 +221,8 @@ MIT 1. **Create the project structure:** ```bash - mkdir email_whitelist_test - cd email_whitelist_test + mkdir email_allowlist_test + cd email_allowlist_test ``` 2. **Create all files with the content above** @@ -251,7 +251,7 @@ Finished in 0.05 seconds (0.04s async, 0.01s sync) The tests cover all your specified requirements: - ✅ All emails allowed when `ALLOWED_EMAILS="*"` - ✅ Specific emails allowed when in list -- ✅ Non-whitelisted emails rejected +- ✅ Non-allowlisted emails rejected - ✅ Missing environment variable handled properly - ✅ Empty environment variable handled properly - ✅ Whitespace trimming in email lists @@ -272,7 +272,7 @@ You can easily switch from a local path dependency to a git dependency by simply ```elixir def deps do [ - {:email_whitelist_test, path: "../email_whitelist_test"} + {:email_allowlist_test, path: "../email_allowlist_test"} ] end ``` @@ -281,7 +281,7 @@ end ```elixir def deps do [ - {:email_whitelist_test, git: "https://github.com/yourusername/email_whitelist_test.git"} + {:email_allowlist_test, git: "https://github.com/yourusername/email_allowlist_test.git"} ] end ``` @@ -292,7 +292,7 @@ After changing the dependency specification: ```bash # Remove the old dependency -mix deps.clean email_whitelist_test +mix deps.clean email_allowlist_test # Fetch the new git dependency mix deps.get @@ -302,21 +302,21 @@ mix deps.get ### Specify a Branch or Tag: ```elixir -{:email_whitelist_test, - git: "https://github.com/yourusername/email_whitelist_test.git", +{:email_allowlist_test, + git: "https://github.com/yourusername/email_allowlist_test.git", branch: "main"} # Or for a specific tag -{:email_whitelist_test, - git: "https://github.com/yourusername/email_whitelist_test.git", +{:email_allowlist_test, + git: "https://github.com/yourusername/email_allowlist_test.git", tag: "v1.0.0"} ``` ### For Private Repositories: ```elixir -{:email_whitelist_test, - git: "https://github.com/yourusername/email_whitelist_test.git", - github: "yourusername/email_whitelist_test", +{:email_allowlist_test, + git: "https://github.com/yourusername/email_allowlist_test.git", + github: "yourusername/email_allowlist_test", branch: "main"} ``` @@ -326,7 +326,7 @@ mix deps.get ```elixir def deps do [ - {:email_whitelist_test, path: "../email_whitelist_test"} + {:email_allowlist_test, path: "../email_allowlist_test"} ] end ``` @@ -335,8 +335,8 @@ end ```elixir def deps do [ - {:email_whitelist_test, - git: "https://github.com/yourusername/email_whitelist_test.git", + {:email_allowlist_test, + git: "https://github.com/yourusername/email_allowlist_test.git", branch: "main"} ] end @@ -352,7 +352,7 @@ end ## Important Notes: - **No code changes needed** - your existing imports and usage remain identical -- **Same module names** - `EmailWhitelist.mail_whitelisted/1` works the same +- **Same module names** - `EmailWhitelist.mail_allowlisted/1` works the same - **Same function signatures** - no API changes required - **Cache cleared** - you'll need to run `mix deps.get` to fetch the new version @@ -360,7 +360,7 @@ end ```bash # Edit your mix.exs file, then: -mix deps.clean email_whitelist_test +mix deps.clean email_allowlist_test mix deps.get ``` diff --git a/rename_module.sh b/rename_module.sh index 8e6b5e8..579052f 100755 --- a/rename_module.sh +++ b/rename_module.sh @@ -2,45 +2,101 @@ # Script to rename BasicSignupWhitelist module to BasicSignupAllowlist # This includes renaming files, module names, function names, and all references +# Works recursively through all subdirectories echo "Starting module rename from Whitelist to Allowlist..." +echo "" -# 1. Rename the files -echo "Renaming files..." -if [ -f "lib/basic_signup_whitelist.ex" ]; then - mv lib/basic_signup_whitelist.ex lib/basic_signup_allowlist.ex - echo " ✓ Renamed lib/basic_signup_whitelist.ex to lib/basic_signup_allowlist.ex" -fi +# Counter for renamed files +renamed_count=0 -if [ -f "test/basic_signup_whitelist_test.exs" ]; then - mv test/basic_signup_whitelist_test.exs test/basic_signup_allowlist_test.exs - echo " ✓ Renamed test/basic_signup_whitelist_test.exs to test/basic_signup_allowlist_test.exs" -fi +# 1. Find and rename ALL files containing "whitelist" recursively +echo "Finding and renaming files recursively..." +echo "----------------------------------------" -# 2. Replace all occurrences of BasicSignupWhitelist with BasicSignupAllowlist -echo "Updating module names..." -find . -type f \( -name "*.ex" -o -name "*.exs" \) -exec sed -i 's/BasicSignupWhitelist/BasicSignupAllowlist/g' {} + -echo " ✓ Updated module names from BasicSignupWhitelist to BasicSignupAllowlist" +# Use find to locate all files with whitelist in the name +# Process deepest files first to avoid path issues +while IFS= read -r -d '' file; do + dir=$(dirname "$file") + filename=$(basename "$file") + newname="${filename//whitelist/allowlist}" + newname="${newname//Whitelist/Allowlist}" -# 3. Replace function names (mail_whitelisted -> mail_allowlisted) -echo "Updating function names..." -find . -type f \( -name "*.ex" -o -name "*.exs" \) -exec sed -i 's/mail_whitelisted/mail_allowlisted/g' {} + -echo " ✓ Updated function names from mail_whitelisted to mail_allowlisted" + if [ "$filename" != "$newname" ]; then + mv "$file" "$dir/$newname" + echo " ✓ Renamed: $file → $dir/$newname" + ((renamed_count++)) + fi +done < <(find . -type f \( -name "*whitelist*" -o -name "*Whitelist*" \) \( -name "*.ex" -o -name "*.exs" \) -print0 | sort -zr) -# 4. Replace any remaining "whitelist" references in comments/docs with "allowlist" -echo "Updating remaining whitelist references..." -find . -type f \( -name "*.ex" -o -name "*.exs" \) -exec sed -i 's/whitelist/allowlist/g' {} + -echo " ✓ Updated all remaining references from whitelist to allowlist" - -# 5. Update any references to the old filenames in mix.exs or other config files -echo "Checking for filename references in config files..." -if [ -f "mix.exs" ]; then - sed -i 's/basic_signup_whitelist/basic_signup_allowlist/g' mix.exs - echo " ✓ Updated references in mix.exs" +if [ $renamed_count -eq 0 ]; then + echo " No files needed renaming" fi echo "" -echo "Module rename complete! You may want to:" -echo " 1. Run 'mix test' to ensure all tests still pass" -echo " 2. Run 'mix compile --force' to recompile with the new module names" -echo " 3. Check any documentation or README files for references to update" \ No newline at end of file + +# 2. Replace all occurrences of BasicSignupWhitelist with BasicSignupAllowlist +echo "Updating module names in all .ex and .exs files..." +echo "---------------------------------------------------" +find . -type f \( -name "*.ex" -o -name "*.exs" \) ! -path "./_build/*" ! -path "./deps/*" -exec sed -i 's/BasicSignupWhitelist/BasicSignupAllowlist/g' {} + +echo " ✓ Updated module names from BasicSignupWhitelist to BasicSignupAllowlist" + +# 3. Replace function names (mail_whitelisted -> mail_allowlisted) +echo "" +echo "Updating function names..." +echo "--------------------------" +find . -type f \( -name "*.ex" -o -name "*.exs" \) ! -path "./_build/*" ! -path "./deps/*" -exec sed -i 's/mail_whitelisted/mail_allowlisted/g' {} + +echo " ✓ Updated function names from mail_whitelisted to mail_allowlisted" + +# 4. Replace case-sensitive variations of whitelist/allowlist +echo "" +echo "Updating all whitelist references (case-sensitive)..." +echo "-----------------------------------------------------" +find . -type f \( -name "*.ex" -o -name "*.exs" \) ! -path "./_build/*" ! -path "./deps/*" -exec sed -i 's/whitelist/allowlist/g' {} + +find . -type f \( -name "*.ex" -o -name "*.exs" \) ! -path "./_build/*" ! -path "./deps/*" -exec sed -i 's/Whitelist/Allowlist/g' {} + +find . -type f \( -name "*.ex" -o -name "*.exs" \) ! -path "./_build/*" ! -path "./deps/*" -exec sed -i 's/WHITELIST/ALLOWLIST/g' {} + +echo " ✓ Updated all case variations of whitelist to allowlist" + +# 5. Update references in config files (mix.exs, README.md, etc.) +echo "" +echo "Updating references in configuration and documentation files..." +echo "--------------------------------------------------------------" +for file in mix.exs README.md CLAUDE.md .formatter.exs; do + if [ -f "$file" ]; then + sed -i 's/whitelist/allowlist/g' "$file" + sed -i 's/Whitelist/Allowlist/g' "$file" + sed -i 's/WHITELIST/ALLOWLIST/g' "$file" + echo " ✓ Updated references in $file" + fi +done + +# 6. Clean up old build artifacts +echo "" +echo "Cleaning up old build artifacts..." +echo "----------------------------------" +if [ -d "_build" ]; then + # Find and remove directories with whitelist in the name + find _build -type d -name "*whitelist*" -exec rm -rf {} + 2>/dev/null + echo " ✓ Removed old build directories containing 'whitelist'" + echo " Note: Run 'mix clean' and 'mix compile' to rebuild completely" +else + echo " No _build directory found" +fi + +# 7. Show summary of changes +echo "" +echo "============================================" +echo "Module rename complete!" +echo "============================================" +echo "" +echo "Summary:" +echo " - Renamed $renamed_count file(s)" +echo " - Updated all module and function references" +echo " - Cleaned build artifacts" +echo "" +echo "Recommended next steps:" +echo " 1. Run 'mix clean' to clean all build artifacts" +echo " 2. Run 'mix deps.get' if you have dependencies" +echo " 3. Run 'mix compile --force' to recompile with new module names" +echo " 4. Run 'mix test' to ensure all tests still pass" +echo " 5. Commit these changes to version control" \ No newline at end of file diff --git a/test/fun_core/basic_signup_whitelist_test.exs b/test/fun_core/basic_signup_whitelist_test.exs deleted file mode 100644 index 4e2018e..0000000 --- a/test/fun_core/basic_signup_whitelist_test.exs +++ /dev/null @@ -1,40 +0,0 @@ -defmodule FunCore.BasicSignupAllowlistTest do - use ExUnit.Case - import FunCore.BasicSignupAllowlist - - test "addresses_as_list" do - assert addresses_as_list("joe@example.com, jane@example.com") == [ - "joe@example.com", - "jane@example.com" - ] - end - - test "jane in list" do - lst = addresses_as_list("joe@example.com, jane@example.com") - assert "jane@example.com" in lst - end - - describe "Not allowlisted when allowed list is" do - test "not set" do - refute(mail_allowlisted_fun(nil, "joe@example.com")) - end - - test "empty" do - refute(mail_allowlisted_fun("j", "joe@example.com")) - end - end - - describe "Whitelisted when" do - test "*" do - assert(mail_allowlisted_fun("*", "jane@example.com")) - end - - test "Multiple set and one match" do - assert(mail_allowlisted_fun("joe@example.com, jane@example.com", "jane@example.com")) - end - - test "Matches with different casings" do - assert(mail_allowlisted_fun("joe@Example.com, jane@example.com", "Joe@example.com")) - end - end -end