Here is a proof of concept for the tag-based solution: 
https://gist.github.com/wojtekmach/2c59fb3c3c1c274e35d164014662975a
Of course it would be slightly different as part of ExUnit, but you get the 
idea. (And you can play with _this_ in your projects right now!)

> On 27 Jun 2020, at 13:17, Wojtek Mach <woj...@wojtekmach.pl> wrote:
> 
> The downside of doing work in setup/0 is if you only need temp dir for one 
> test, unless you mess with tags which adds boilerplate, you’d unnecessarily 
> create dirs for tests that don’t need it. But then again you could argue that 
> if you need it in just one test, do it in that test :) still I think it’s 
> worth removing boilerplate.
> 
> Contrary to the above mentioned golang issue, I am not super concerned about 
> leaking temp directories, so I wasn’t planning to do that. Though being able 
> to automatically remove those is arguably the only reason for tight 
> integration with exunit. As you can see the implementation is currently 
> fairly generic.
> 
> I focused on the ex_unit case but a more general utility is interesting too.
> 
> About @tag tmp_dir:
> 
>     @tag tmp_dir: true
>      test “foo”, %{tmp_dir: tmp_dir} do
> 
> seems to strike a good balance between being explicit and easy enough to use. 
> 👍
> 
>> On 27 Jun 2020, at 12:47, Devon Estes <devon.c.es...@gmail.com> wrote:
>> 
>> 
>> What are the rules for deleting this directory after it’s done being used? 
>> Would it be deleted after the test finishes, or would it remain until the 
>> user deletes it?
>> 
>> In general this seems ok to me, but it’s also a bit limiting as you only get 
>> one directory per test. I’d personally prefer to see something where you get 
>> one directory per process instead of one directory per test, or when each 
>> call to temp_dir! returns a new, unique directory as this covers some other 
>> common use cases (like parallel processing of files in multiple folders) 
>> without having to first create the temp_dir for the test and then in that 
>> temp_dir additional directories per process. I do this generally using UUIDs 
>> to create temporary directories, and I haven’t (personally) had any issues 
>> with debugging or anything, but I can see how this might be confusing for 
>> folks.
>> 
>> Wojtek Mach <woj...@wojtekmach.pl <mailto:woj...@wojtekmach.pl>> schrieb am 
>> Sa. 27. Juni 2020 um 12:19:
>> It’s common to create temporary directories for tests, ideally a unique 
>> directory per test to run them concurrently.
>> 
>> I’d like to propose adding `ExUnit.Callbacks.tmp_dir!/0` and this is how we 
>> could use it:
>> 
>>     defmodule MyTest do
>>       use ExUnit.Case, async: true
>> 
>>       test "my test" do
>>         assert tmp_dir!() =~ "my test"
>>         assert File.dir?(tmp_dir!())
>>       end
>>     end
>> 
>> The directory is lazily created on the first call, the second call to that 
>> function within the same test simply returns the same path.
>> 
>> While the path must be unique per test, I believe it should also be 
>> predictable to ease debugging, I picked: tmp/<module>/<test>.
>> 
>> To extract the module & test name, we have two options:
>> 
>> 1. Define tmp_dir!/0 as a regular function and use stack trace
>> 2. Define tmp_dir!/0 as a macro
>> 
>> Here’s a proof of concept for option 1:
>> 
>> - the code: 
>> https://github.com/wojtekmach/elixir/commit/4c399540802a3cae583c086d865dc90d865df6c8
>>  
>> <https://github.com/wojtekmach/elixir/commit/4c399540802a3cae583c086d865dc90d865df6c8>
>> - example of usage in Elixir test suite: 
>> https://github.com/wojtekmach/elixir/commit/01df2551582dd9acdaa2f6ff982d6767763070f1
>>  
>> <https://github.com/wojtekmach/elixir/commit/01df2551582dd9acdaa2f6ff982d6767763070f1>
>> 
>> The downside of using stack trace is it can easily get mangled, people 
>> shouldn’t do this:
>> 
>>     test "my test" do
>>       tmp_dir!()
>> 
>>       Task.async(fn ->
>>         tmp_dir!()
>>       end)
>>       |> Task.await()
>>     end
>> 
>> And instead do that:
>> 
>>     test "my test" do
>>       tmp_dir = tmp_dir!()
>> 
>>       Task.async(fn ->
>>         tmp_dir
>>       end)
>>       |> Task.await()
>>     end
>> 
>> I believe documenting this might be enough.
>> 
>> This proposal is inspired by https://github.com/golang/go/issues/35998 
>> <https://github.com/golang/go/issues/35998>.
>> 
>> Any feedback appreciated!
>> 
>> -- 
>> You received this message because you are subscribed to the Google Groups 
>> "elixir-lang-core" group.
>> To unsubscribe from this group and stop receiving emails from it, send an 
>> email to elixir-lang-core+unsubscr...@googlegroups.com 
>> <mailto:elixir-lang-core%2bunsubscr...@googlegroups.com>.
>> To view this discussion on the web visit 
>> https://groups.google.com/d/msgid/elixir-lang-core/066A99E3-B470-44C3-9632-F52E97AB8791%40wojtekmach.pl
>>  
>> <https://groups.google.com/d/msgid/elixir-lang-core/066A99E3-B470-44C3-9632-F52E97AB8791%40wojtekmach.pl>.
>> -- 
>> 
>> _________________
>> Devon Estes
>> +49 176 2356 4717
>> www.devonestes.com <http://www.devonestes.com/>
>> 
>> 
>> -- 
>> You received this message because you are subscribed to the Google Groups 
>> "elixir-lang-core" group.
>> To unsubscribe from this group and stop receiving emails from it, send an 
>> email to elixir-lang-core+unsubscr...@googlegroups.com 
>> <mailto:elixir-lang-core+unsubscr...@googlegroups.com>.
>> To view this discussion on the web visit 
>> https://groups.google.com/d/msgid/elixir-lang-core/CAGowJcgGwFrF%2Btf%2BjmKnFSzntuVUX7pLb2Mj4jsvP6XyBXXo%2Bw%40mail.gmail.com
>>  
>> <https://groups.google.com/d/msgid/elixir-lang-core/CAGowJcgGwFrF%2Btf%2BjmKnFSzntuVUX7pLb2Mj4jsvP6XyBXXo%2Bw%40mail.gmail.com?utm_medium=email&utm_source=footer>.

-- 
You received this message because you are subscribed to the Google Groups 
"elixir-lang-core" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to elixir-lang-core+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/elixir-lang-core/82DDE90B-0A6E-4EE7-AB95-A4876B08C4B8%40wojtekmach.pl.

Reply via email to