mime-types-mini 0.1.0 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/benchmark/content_type_lookup.rb +32 -0
- data/ext/MimeTypeMiniDatabase/MimeTypes.gperf +1976 -0
- data/ext/MimeTypeMiniDatabase/MimeTypes.h +10097 -0
- data/ext/MimeTypeMiniDatabase/MimeTypes.trenni +13 -12
- data/ext/MimeTypeMiniDatabase/MimeTypesMiniDatabase.c +54 -2
- data/ext/MimeTypeMiniDatabase/Rakefile +18 -19
- data/lib/mime/types.rb +18 -0
- data/lib/mime/types/mini/version.rb +1 -1
- metadata +5 -1
@@ -1,13 +1,14 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
},
|
12
|
-
<?r end ?>
|
1
|
+
%language=ANSI-C
|
2
|
+
%define slot-name content_type
|
3
|
+
%define hash-function-name mime_type_hash
|
4
|
+
%define lookup-function-name lookup_mime_type_by_content_type
|
5
|
+
%enum
|
6
|
+
%switch=4
|
7
|
+
struct MimeType {
|
8
|
+
const char * content_type;
|
9
|
+
const char * encoding;
|
10
|
+
const char * extensions;
|
13
11
|
};
|
12
|
+
%%<?r mime_types.each do |mime_type|
|
13
|
+
content_type, encoding, extensions = mime_type.values_at('content-type', 'encoding', 'extensions') ?>
|
14
|
+
#{content_type}, #{encoding.inspect}, #{extensions_struct(extensions)}<?r end ?>
|
@@ -2,16 +2,17 @@
|
|
2
2
|
#include "ruby.h"
|
3
3
|
|
4
4
|
#include "Extensions.h"
|
5
|
+
#include "MimeTypes.h"
|
5
6
|
|
6
7
|
VALUE MimeTypesMiniDatabase = Qnil;
|
7
8
|
|
8
9
|
void Init_MimeTypesMiniDatabase();
|
9
10
|
|
10
11
|
static VALUE method_content_type_for_extension(VALUE self, VALUE extension) {
|
11
|
-
|
12
|
+
long len = RSTRING_LEN(extension);
|
12
13
|
char* str = RSTRING_PTR(extension);
|
13
14
|
|
14
|
-
const struct ContentTypeExtension * result = lookup_content_type_by_extension(str, len);
|
15
|
+
const struct ContentTypeExtension * result = lookup_content_type_by_extension(str, (unsigned)len);
|
15
16
|
|
16
17
|
if (result) {
|
17
18
|
return rb_str_new_cstr(result->content_type);
|
@@ -20,12 +21,63 @@ static VALUE method_content_type_for_extension(VALUE self, VALUE extension) {
|
|
20
21
|
}
|
21
22
|
}
|
22
23
|
|
24
|
+
VALUE MimeType = Qnil;
|
25
|
+
|
26
|
+
static VALUE method_mime_type_for_content_type(VALUE self, VALUE content_type) {
|
27
|
+
long len = RSTRING_LEN(content_type);
|
28
|
+
char* str = RSTRING_PTR(content_type);
|
29
|
+
|
30
|
+
const struct MimeType * result = lookup_mime_type_by_content_type(str, (unsigned)len);
|
31
|
+
|
32
|
+
if (result) {
|
33
|
+
VALUE args[3] = {
|
34
|
+
rb_str_new_cstr(result->content_type),
|
35
|
+
rb_str_new_cstr(result->encoding),
|
36
|
+
Qnil,
|
37
|
+
};
|
38
|
+
|
39
|
+
if (result->extensions) {
|
40
|
+
args[2] = rb_str_split(
|
41
|
+
rb_str_new_cstr(result->extensions),
|
42
|
+
" "
|
43
|
+
);
|
44
|
+
}
|
45
|
+
|
46
|
+
return rb_class_new_instance(3, args, MimeType);
|
47
|
+
} else {
|
48
|
+
return Qnil;
|
49
|
+
}
|
50
|
+
}
|
51
|
+
|
52
|
+
static ID id_content_type, id_encoding, id_extensions;
|
53
|
+
|
54
|
+
static VALUE MimeType_initialize(VALUE self, VALUE content_type, VALUE encoding, VALUE extensions) {
|
55
|
+
rb_ivar_set(self, id_content_type, content_type);
|
56
|
+
rb_ivar_set(self, id_encoding, encoding);
|
57
|
+
rb_ivar_set(self, id_extensions, extensions);
|
58
|
+
|
59
|
+
return self;
|
60
|
+
}
|
61
|
+
|
23
62
|
void Init_MimeTypesMiniDatabase() {
|
63
|
+
id_content_type = rb_intern("@content_type");
|
64
|
+
id_encoding = rb_intern("@encoding");
|
65
|
+
id_extensions = rb_intern("@extensions");
|
66
|
+
|
24
67
|
VALUE Mime = rb_define_module("Mime");
|
68
|
+
|
69
|
+
MimeType = rb_define_class_under(Mime, "Type", rb_cObject);
|
70
|
+
rb_define_attr(MimeType, "content_type", 1, 0);
|
71
|
+
rb_define_attr(MimeType, "encoding", 1, 0);
|
72
|
+
rb_define_attr(MimeType, "extensions", 1, 0);
|
73
|
+
rb_define_method(MimeType, "initialize", MimeType_initialize, 3);
|
74
|
+
|
25
75
|
VALUE MimeTypes = rb_define_module_under(Mime, "Types");
|
76
|
+
|
26
77
|
VALUE MimeTypesMini = rb_define_module_under(MimeTypes, "Mini");
|
27
78
|
|
28
79
|
MimeTypesMiniDatabase = rb_define_module_under(MimeTypesMini, "Database");
|
29
80
|
|
30
81
|
rb_define_module_function(MimeTypesMiniDatabase, "content_type_for_extension", method_content_type_for_extension, 1);
|
82
|
+
rb_define_module_function(MimeTypesMiniDatabase, "mime_type_for_content_type", method_mime_type_for_content_type, 1);
|
31
83
|
}
|
@@ -4,18 +4,6 @@ require 'trenni'
|
|
4
4
|
require 'json'
|
5
5
|
require 'ostruct'
|
6
6
|
|
7
|
-
class TemplateState < Struct.new(:mime_types)
|
8
|
-
NULL = 'NULL'
|
9
|
-
|
10
|
-
def extensions_struct(extensions)
|
11
|
-
if extensions
|
12
|
-
'(const char*[]){' + (extensions.collect(&:inspect) + [0]).join(', ') + '}'
|
13
|
-
else
|
14
|
-
0
|
15
|
-
end
|
16
|
-
end
|
17
|
-
end
|
18
|
-
|
19
7
|
task :load_mime_types do
|
20
8
|
mime_types_json_path = File.join(MIME::Types::Data::PATH, "mime-types.json")
|
21
9
|
@mime_types = JSON::load(File.open mime_types_json_path)
|
@@ -45,17 +33,28 @@ task :generate_extensions => :generate_extensions_hashtable do
|
|
45
33
|
sh 'gperf', '-CD', '-t', 'Extensions.gperf', '--output-file', 'Extensions.h'
|
46
34
|
end
|
47
35
|
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
36
|
+
class TemplateState < Struct.new(:mime_types)
|
37
|
+
def extensions_struct(extensions)
|
38
|
+
if extensions
|
39
|
+
extensions.join(' ').inspect
|
40
|
+
else
|
41
|
+
0
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
task :generate_mime_types_hashtable => :load_mime_types do
|
52
47
|
template_path = File.expand_path("MimeTypes.trenni", __dir__)
|
53
48
|
template = Trenni::Template.load_file(template_path)
|
54
49
|
|
55
|
-
template_state = TemplateState.new(mime_types)
|
50
|
+
template_state = TemplateState.new(@mime_types)
|
56
51
|
result = template.to_string(template_state)
|
57
52
|
|
58
|
-
File.write("MimeTypes.
|
53
|
+
File.write("MimeTypes.gperf", result)
|
54
|
+
end
|
55
|
+
|
56
|
+
task :generate_mime_types => :generate_mime_types_hashtable do
|
57
|
+
sh 'gperf', '-C', '-t', 'MimeTypes.gperf', '--output-file', 'MimeTypes.h'
|
59
58
|
end
|
60
59
|
|
61
|
-
task :default => :
|
60
|
+
task :default => [:generate_extensions, :generate_mime_types]
|
data/lib/mime/types.rb
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
|
2
|
+
module MIME
|
3
|
+
module Types
|
4
|
+
def self.type_for(filename)
|
5
|
+
# Return mime types
|
6
|
+
end
|
7
|
+
|
8
|
+
def self.[](content_type)
|
9
|
+
# Return mime types
|
10
|
+
end
|
11
|
+
|
12
|
+
def self.content_type_for(extension)
|
13
|
+
end
|
14
|
+
|
15
|
+
def self.extensions_for(content_type)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mime-types-mini
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Samuel Williams
|
@@ -62,13 +62,17 @@ extra_rdoc_files: []
|
|
62
62
|
files:
|
63
63
|
- Gemfile
|
64
64
|
- Rakefile
|
65
|
+
- benchmark/content_type_lookup.rb
|
65
66
|
- ext/MimeTypeMiniDatabase/Extensions.gperf
|
66
67
|
- ext/MimeTypeMiniDatabase/Extensions.h
|
67
68
|
- ext/MimeTypeMiniDatabase/Extensions.trenni
|
69
|
+
- ext/MimeTypeMiniDatabase/MimeTypes.gperf
|
70
|
+
- ext/MimeTypeMiniDatabase/MimeTypes.h
|
68
71
|
- ext/MimeTypeMiniDatabase/MimeTypes.trenni
|
69
72
|
- ext/MimeTypeMiniDatabase/MimeTypesMiniDatabase.c
|
70
73
|
- ext/MimeTypeMiniDatabase/Rakefile
|
71
74
|
- ext/MimeTypeMiniDatabase/extconf.rb
|
75
|
+
- lib/mime/types.rb
|
72
76
|
- lib/mime/types/mini.rb
|
73
77
|
- lib/mime/types/mini/version.rb
|
74
78
|
- mime-types-mini.gemspec
|