# 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_extension("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).