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.
@@ -1,13 +1,14 @@
1
-
2
- extern const struct MimeType MIME_TYPES[] = {
3
- <?r mime_types.each do |mime_type|
4
- content_type, encoding, extensions, registered = mime_type.values_at('content-type', 'encoding', 'extensions', 'registered')
5
- ?>
6
- {
7
- .content_type = #{content_type.inspect},
8
- .encoding = #{encoding.inspect},
9
- .extensions = #{extensions_struct(extensions)},
10
- .registered = #{registered == true ? 1 : 0},
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
- int len = RSTRING_LEN(extension);
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
- task :generate_code do
49
- mime_types_json_path = File.join(MIME::Types::Data::PATH, "mime-types.json")
50
- mime_types = JSON::load(File.open mime_types_json_path)
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.c", result)
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 => :generate_code
60
+ task :default => [:generate_extensions, :generate_mime_types]
@@ -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
@@ -21,7 +21,7 @@
21
21
  module Mime
22
22
  module Types
23
23
  module Mini
24
- VERSION = "0.1.0"
24
+ VERSION = "0.2.0"
25
25
  end
26
26
  end
27
27
  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.1.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