# MiniMime

Minimal mime type implementation for use with the mail and rest-client gem.

## Installation

Add this line to your application's Gemfile:

```ruby
gem 'mini_mime'
```

And then execute:

    $ bundle

Or install it yourself as:

    $ gem install mini_mime

## Usage

```
require 'mini_mime'

MiniMime.lookup_by_filename("a.txt").content_type
# => "text/plain"

MiniMime.lookup_by_content_type("text/plain").extension
# => "txt"

MiniMime.lookup_by_content_type("text/plain").binary?
# => false

```

## Configuration

If you'd like to add your own mime types, try using custom database files:

```
MiniMime::Configuration.ext_db_path = "path_to_file_extension_db"
MiniMime::Configuration.content_type_db_path = "path_to_content_type_db"
```

Check out the [default databases](lib/db) for proper formatting and structure hints.

## Performance

MiniMime is optimised to minimize memory usage. It keeps a cache of 100 mime type lookups (and 100 misses). There are benchmarks in the [bench directory](https://github.com/discourse/mini_mime/blob/master/bench/bench.rb)

```
Memory stats for requiring mime/types/columnar
Total allocated: 8712144 bytes (98242 objects)
Total retained:  3372545 bytes (33599 objects)

Memory stats for requiring mini_mime
Total allocated: 42625 bytes (369 objects)
Total retained:  8992 bytes (72 objects)
Warming up --------------------------------------
cached content_type lookup MiniMime
                        85.109k i/100ms
content_type lookup MIME::Types
                        17.879k i/100ms
Calculating -------------------------------------
cached content_type lookup MiniMime
                          1.105M (± 4.1%) i/s -      5.532M in   5.014895s
content_type lookup MIME::Types
                        193.528k (± 7.1%) i/s -    965.466k in   5.013925s
Warming up --------------------------------------
uncached content_type lookup MiniMime
                         1.410k i/100ms
content_type lookup MIME::Types
                        18.012k i/100ms
Calculating -------------------------------------
uncached content_type lookup MiniMime
                         14.689k (± 4.2%) i/s -     73.320k in   5.000779s
content_type lookup MIME::Types
                        193.459k (± 6.9%) i/s -    972.648k in   5.050731s
```

As a general guideline, cached lookups are 6x faster than MIME::Types equivalent. Uncached lookups are 10x slower.

Note: It was run on macOS 10.14.2, and versions of Ruby and gems are below.

- Ruby 2.6.0
- mini_mime (1.0.1)
- mime-types (3.2.2)
- mime-types-data (3.2018.0812)

## Development

MiniMime uses the officially maintained list of mime types at [mime-types-data](https://github.com/mime-types/mime-types-data) repo to build the internal database.

To update the database run:

```ruby
bundle exec rake rebuild_db
```

After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake test` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.

To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).

## Contributing

Bug reports and pull requests are welcome on GitHub at https://github.com/discourse/mini_mime. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [Contributor Covenant](http://contributor-covenant.org) code of conduct.

## License

The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).
