-**GenMagic** provides supervised and customisable access to [libmagic](http://man7.org/linux/man-pages/man3/libmagic.3.html) using a supervised external process.
+**Majic** provides a robust integration of [libmagic](http://man7.org/linux/man-pages/man3/libmagic.3.html) for Elixir.
-With this library, you can start an one-off process to run a single check, or run the process as a daemon if you expect to run many checks.
+With this library, you can start an one-off process to run a single check, or run the process as a daemon if you expect to run
+many checks.
+
+It is a friendly fork of [gen_magic](https://github.com/evadne/gen_magic) featuring a (arguably) more robust C-code
+using erl_interface, built in pooling, unified/clean API, and an optional Plug.
+
+This package is regulary tested on multiple platforms (Debian, macOS, Fedora, Alpine, FreeBSD) to ensure it'll work fine
+in any environment.
## Installation
-The package can be installed by adding `gen_magic` to your list of dependencies in `mix.exs`:
+The package can be installed by adding `majic` to your list of dependencies in `mix.exs`:
```elixir
def deps do
[
- {:gen_magic, "~> 1.0.0"}
+ {:majic, "~> 1.0"}
]
end
```
You must also have [libmagic](http://man7.org/linux/man-pages/man3/libmagic.3.html) installed locally with headers, alongside common compilation tools (i.e. build-essential). These can be acquired by apt-get, yum, brew, etc.
Compilation of the underlying C program is automatic and handled by [elixir_make](https://github.com/elixir-lang/elixir_make).
## Usage
-Depending on the use case, you may utilise a single (one-off) GenMagic process without reusing it as a daemon, or utilise a connection pool (such as Poolboy) in your application to run multiple persistent GenMagic processes.
+Depending on the use case, you may utilise a single (one-off) Majic process without reusing it as a daemon, or utilise a connection pool (such as Poolboy) in your application to run multiple persistent Majic processes.
-To use GenMagic directly, you can use `GenMagic.Helpers.perform_once/1`:
+To use Majic directly, you can use `Majic.Helpers.perform_once/1`:
```elixir
-iex(1)> GenMagic.perform(".", once: true)
+iex(1)> Majic.perform(".", once: true)
{:ok,
- %GenMagic.Result{
+ %Majic.Result{
content: "directory",
encoding: "binary",
mime_type: "inode/directory"
}}
```
-To use the GenMagic server as a daemon, you can start it first, keep a reference, then feed messages to it as you require:
+To use the Majic server as a daemon, you can start it first, keep a reference, then feed messages to it as you require:
-See `GenMagic.Server.start_link/1` and `t:GenMagic.Server.option/0` for more information on startup parameters.
+See `Majic.Server.start_link/1` and `t:Majic.Server.option/0` for more information on startup parameters.
-See `GenMagic.Result` for details on the result provided.
+See `Majic.Result` for details on the result provided.
## Configuration
-When using `GenMagic.Server.start_link/1` to start a persistent server, or `GenMagic.Helpers.perform_once/2` to run an ad-hoc request, you can override specific options to suit your use case.
+When using `Majic.Server.start_link/1` to start a persistent server, or `Majic.Helpers.perform_once/2` to run an ad-hoc request, you can override specific options to suit your use case.
| Name | Default | Description |
| - | - | - |
| `:startup_timeout` | 1000 | Number of milliseconds to wait for client startup |
| `:process_timeout` | 30000 | Number of milliseconds to process each request |
| `:recycle_threshold` | 10 | Number of cycles before the C process is replaced |
| `:database_patterns` | `[:default]` | Databases to load |
-See `t:GenMagic.Server.option/0` for details.
+See `t:Majic.Server.option/0` for details.
### Use Cases
### Ad-Hoc Requests
-For ad-hoc requests, you can use the helper method `GenMagic.Helpers.perform_once/2`:
+For ad-hoc requests, you can use the helper method `Majic.Helpers.perform_once/2`:
text(conn, "Received your file containing #{result.content}")
end
```
-Obviously, it will be more ideal if you have wrapped `GenMagic.Server` in a pool such as Poolboy, to avoid constantly starting and stopping the underlying C program.
+Obviously, it will be more ideal if you have wrapped `Majic.Server` in a pool such as Poolboy, to avoid constantly starting and stopping the underlying C program.
## Notes
### Soak Test
Run an endless cycle to prove that the program is resilient:
```bash
find /usr/share/ -name *png | xargs mix run test/soak.exs
find . -name *ex | xargs mix run test/soak.exs
```
## Acknowledgements
-During design and prototype development of this library, the Author has drawn inspiration from the following individuals, and therefore thanks all contributors for their generosity:
+During design and prototype development of this library, the Author has drawn inspiration from the following individuals, and therefore
+thanks all contributors for their generosity:
+- [Evadne Wu](https://github.com/evadne)
+ - Original work
- Mr [James Every](https://github.com/devstopfix)
- Enhanced Elixir Wrapper (based on GenServer)
- Initial Hex packaging (v.0.22)
- Soak Testing
diff --git a/lib/gen_magic.ex b/lib/majic.ex
similarity index 74%
rename from lib/gen_magic.ex
rename to lib/majic.ex
index 292dfe8..0b1b2d0 100644
--- a/lib/gen_magic.ex
+++ b/lib/majic.ex
@@ -1,40 +1,34 @@
-defmodule GenMagic do
- @moduledoc """
- Top-level namespace for GenMagic, the libmagic client for Elixir.
-
- See `GenMagic.Server` or the README for usage.
- """
-
+defmodule Majic do
@doc """
Perform on `path`.
An option of `server: ServerName`, `pool: PoolName` or `once: true` must be passed.