exif 0.9.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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: e5f29f76bf91ba37f5eb1a1e0478b65552e5c82e
4
+ data.tar.gz: afce46bfa42cb13bdb7d59f80d3c069dbb054486
5
+ SHA512:
6
+ metadata.gz: 747ab5defb0329b534fec43e4312023352b92e370672814c9b6bdeff0a467874217ce2ed2d1325eb73d4b6f242d67ccb033cdd7960b263c0ab49ae7fcbe8d329
7
+ data.tar.gz: f6d9b9757c9148eb555f83450feeb417df157728bd3758d8476a7a20fa2dcca89df63c2daeec1900ac5caf70ccdc03e9cbd3bb73dc60745032809d07e5e8a75b
data/.gitignore ADDED
@@ -0,0 +1,14 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /Gemfile.lock
4
+ /_yardoc/
5
+ /coverage/
6
+ /doc/
7
+ /pkg/
8
+ /spec/reports/
9
+ /tmp/
10
+ *.bundle
11
+ *.so
12
+ *.o
13
+ *.a
14
+ mkmf.log
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --color
2
+ --require spec_helper
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in exif.gemspec
4
+ gemspec
data/LICENSE.txt ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2014 Tony Jian
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,178 @@
1
+ # Exif
2
+
3
+ Ruby wrapper for libexif
4
+
5
+ # Installation
6
+
7
+ $ gem install exif
8
+
9
+ # Usage
10
+
11
+ ```ruby
12
+ data = Exif::Data.new('sample.jpg')
13
+ data[:image_width] # => 4000
14
+ data[:gps_latitude] # => '24, 10.6817, 0'
15
+
16
+ # get all entries in an IFD
17
+ data[0] # => {image_width: 4000, image_length: 2670, ...}
18
+ data[1] # => {x_resolution: "72"}, y_resolution: "72", ...}
19
+ data[:exif] # => exposure_time: "1/125 sec.", f_number: "f/8.0"}
20
+ data[:gps] # => {gps_version_id: "2.2.0.0", gps_latitude_ref: "N", ...}
21
+ data[:interoperability] # => {...}
22
+ ```
23
+
24
+ ## Tag Rreference
25
+
26
+ - aperture_value
27
+ - artist
28
+ - battery_level
29
+ - bits_per_sample
30
+ - brightness_value
31
+ - cfa_pattern
32
+ - cfa_repeat_pattern_dim
33
+ - color_space
34
+ - components_configuration
35
+ - compressed_bits_per_pixel
36
+ - compression
37
+ - contrast
38
+ - copyright
39
+ - custom_rendered
40
+ - date_time
41
+ - date_time_digitized
42
+ - date_time_original
43
+ - device_setting_description
44
+ - digital_zoom_ratio
45
+ - document_name
46
+ - exif_ifd_pointer
47
+ - exif_version
48
+ - exposure_bias_value
49
+ - exposure_index
50
+ - exposure_mode
51
+ - exposure_program
52
+ - exposure_time
53
+ - file_source
54
+ - fill_order
55
+ - flash
56
+ - flash_energy
57
+ - flash_pix_version
58
+ - fnumber
59
+ - focal_length
60
+ - focal_length_in_35mm_film
61
+ - focal_plane_resolution_unit
62
+ - focal_plane_x_resolution
63
+ - focal_plane_y_resolution
64
+ - gain_control
65
+ - gamma
66
+ - gps_altitude
67
+ - gps_altitude_ref
68
+ - gps_area_information
69
+ - gps_date_stamp
70
+ - gps_dest_bearing
71
+ - gps_dest_bearing_ref
72
+ - gps_dest_distance
73
+ - gps_dest_distance_ref
74
+ - gps_dest_latitude
75
+ - gps_dest_latitude_ref
76
+ - gps_dest_longitude
77
+ - gps_dest_longitude_ref
78
+ - gps_differential
79
+ - gps_dop
80
+ - gps_img_direction
81
+ - gps_img_direction_ref
82
+ - gps_info_ifd_pointer
83
+ - gps_latitude
84
+ - gps_latitude_ref
85
+ - gps_longitude
86
+ - gps_longitude_ref
87
+ - gps_map_datum
88
+ - gps_measure_mode
89
+ - gps_processing_method
90
+ - gps_satellites
91
+ - gps_speed
92
+ - gps_speed_ref
93
+ - gps_status
94
+ - gps_time_stamp
95
+ - gps_track
96
+ - gps_track_ref
97
+ - gps_version_id
98
+ - image_description
99
+ - image_length
100
+ - image_resources
101
+ - image_unique_id
102
+ - image_width
103
+ - inter_color_profile
104
+ - interoperability_ifd_pointer
105
+ - interoperability_index
106
+ - interoperability_version
107
+ - iptc_naa
108
+ - iso_speed_ratings
109
+ - jpeg_interchange_format
110
+ - jpeg_interchange_format_length
111
+ - jpeg_proc
112
+ - light_source
113
+ - make
114
+ - maker_note
115
+ - max_aperture_value
116
+ - metering_mode
117
+ - model
118
+ - new_cfa_pattern
119
+ - new_subfile_type
120
+ - oecf
121
+ - orientation
122
+ - padding
123
+ - photometric_interpretation
124
+ - pixel_x_dimension
125
+ - pixel_y_dimension
126
+ - planar_configuration
127
+ - primary_chromaticities
128
+ - print_image_matching
129
+ - reference_black_white
130
+ - related_image_file_format
131
+ - related_image_length
132
+ - related_image_width
133
+ - related_sound_file
134
+ - resolution_unit
135
+ - rows_per_strip
136
+ - samples_per_pixel
137
+ - saturation
138
+ - scene_capture_type
139
+ - scene_type
140
+ - sensing_method
141
+ - sharpness
142
+ - shutter_speed_value
143
+ - software
144
+ - spatial_frequency_response
145
+ - spectral_sensitivity
146
+ - strip_byte_counts
147
+ - strip_offsets
148
+ - sub_ifds
149
+ - sub_sec_time
150
+ - sub_sec_time_digitized
151
+ - sub_sec_time_original
152
+ - subject_area
153
+ - subject_distance
154
+ - subject_distance_range
155
+ - subject_location
156
+ - tiff_ep_standard_id
157
+ - time_zone_offset
158
+ - transfer_function
159
+ - transfer_range
160
+ - user_comment
161
+ - white_balance
162
+ - white_point
163
+ - x_resolution
164
+ - xml_packet
165
+ - xp_author
166
+ - xp_comment
167
+ - xp_keywords
168
+ - xp_subject
169
+ - xp_title
170
+ - y_resolution
171
+ - ycbcr_coefficients
172
+ - ycbcr_positioning
173
+ - ycbcr_sub_sampling
174
+
175
+ # TODO
176
+
177
+ 1. `Exif.underscore!` is too slow
178
+ 2. Support reading from String.
data/Rakefile ADDED
@@ -0,0 +1,7 @@
1
+ require "bundler/gem_tasks"
2
+
3
+ require "rake/extensiontask"
4
+
5
+ Rake::ExtensionTask.new("exif") do |ext|
6
+ ext.lib_dir = "lib/exif"
7
+ end
data/exif.gemspec ADDED
@@ -0,0 +1,25 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'exif/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "exif"
8
+ spec.version = Exif::VERSION
9
+ spec.authors = ["Jian Weihang"]
10
+ spec.email = ["tonytonyjan@gmail.com"]
11
+ spec.extensions = ["ext/exif/extconf.rb"]
12
+ spec.summary = %q{Wrapper of libexif}
13
+ spec.description = %q{Wrapper of libexif}
14
+ spec.homepage = "https://github.com/tonytonyjan/exif"
15
+ spec.license = "MIT"
16
+
17
+ spec.files = `git ls-files -z`.split("\x0")
18
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
19
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
20
+ spec.require_paths = ["lib"]
21
+
22
+ spec.add_development_dependency "bundler", "~> 1.7"
23
+ spec.add_development_dependency "rake", "~> 10.0"
24
+ spec.add_development_dependency "rake-compiler"
25
+ end
data/ext/exif/data.c ADDED
@@ -0,0 +1,96 @@
1
+ #include <libexif/exif-data.h>
2
+ #include "data.h"
3
+
4
+ extern VALUE rb_mExif;
5
+ VALUE rb_cData;
6
+ static VALUE IFD2SYM[5];
7
+
8
+ void init_data(){
9
+ rb_cData = rb_define_class_under(rb_mExif, "Data", rb_cObject);
10
+ IFD2SYM[0] = INT2NUM(0); // EXIF_IFD_0
11
+ IFD2SYM[1] = INT2NUM(1); // EXIF_IFD_1
12
+ IFD2SYM[2] = ID2SYM(rb_intern("exif")); // EXIF_IFD_EXIF
13
+ IFD2SYM[3] = ID2SYM(rb_intern("gps")); // EXIF_IFD_GPS
14
+ IFD2SYM[4] = ID2SYM(rb_intern("interoperability")); // EXIF_IFD_INTEROPERABILITY
15
+ rb_define_singleton_method(rb_cData, "new", rb_new, 1);
16
+ rb_define_method(rb_cData, "dump", rb_dump, 0);
17
+ rb_define_method(rb_cData, "[]", rb_value, 1);
18
+ }
19
+
20
+ static VALUE rb_new(VALUE self, VALUE file_path){
21
+ Check_Type(file_path, T_STRING);
22
+ ExifData *ed = exif_data_new_from_file(StringValueCStr(file_path));
23
+ if(!ed) rb_raise(rb_eRuntimeError, "File not readable or no EXIF data in file.");
24
+ VALUE rb_data = Data_Wrap_Struct(self, NULL, exif_data_free, ed);
25
+ rb_define_attr(self, "contents", 1, 0);
26
+ VALUE rb_h = rb_hash_new();
27
+ exif_data_foreach_content(ed, each_content, &rb_h);
28
+ rb_iv_set(rb_data, "@contents", rb_h);
29
+ return rb_data;
30
+ }
31
+
32
+ static VALUE rb_dump(VALUE self){
33
+ ExifData *ed;
34
+ Data_Get_Struct(self, ExifData, ed);
35
+ exif_data_dump(ed);
36
+ return Qnil;
37
+ }
38
+
39
+ static VALUE rb_value(VALUE self, VALUE key){
40
+ VALUE rb_contents = rb_iv_get(self, "@contents");
41
+ return rb_hash_aref(rb_contents, key);
42
+ }
43
+
44
+ static void each_content(ExifContent *ec, void *rb_h_ptr){
45
+ VALUE *rb_h = (VALUE*)rb_h_ptr;
46
+ ExifIfd ifd = exif_content_get_ifd(ec);
47
+ VALUE ifd_name = IFD2SYM[ifd]; //rb_str_new_cstr(exif_ifd_get_name(ifd));
48
+ if(ifd == EXIF_IFD_COUNT) rb_raise(rb_eRuntimeError, "Con't get IFD.");
49
+ else rb_hash_aset(*rb_h, ifd_name, rb_hash_new());
50
+ exif_content_foreach_entry(ec, each_entry, rb_h_ptr);
51
+ }
52
+
53
+ static void each_entry(ExifEntry *ee, void *rb_h_ptr){
54
+ VALUE *rb_h = (VALUE*)rb_h_ptr;
55
+ ExifIfd ifd = exif_entry_get_ifd(ee);
56
+ VALUE tag_name = rb_str_new_cstr(exif_tag_get_name_in_ifd(ee->tag, ifd));
57
+ rb_funcall(rb_mExif, rb_intern("underscore!"), 1, tag_name);
58
+ tag_name = ID2SYM(rb_intern_str(tag_name));
59
+ char buf[500];
60
+ exif_entry_get_value(ee, buf, sizeof(buf));
61
+ VALUE value;
62
+ switch(ee->format){
63
+ // case EXIF_FORMAT_BYTE:
64
+ // break;
65
+ // case EXIF_FORMAT_ASCII:
66
+ // break;
67
+ case EXIF_FORMAT_SHORT:
68
+ value = INT2NUM(atoi(buf));
69
+ break;
70
+ case EXIF_FORMAT_LONG:
71
+ value = INT2NUM(atol(buf));
72
+ break;
73
+ // case EXIF_FORMAT_RATIONAL:
74
+ // break;
75
+ // case EXIF_FORMAT_SBYTE:
76
+ // break;
77
+ // case EXIF_FORMAT_UNDEFINED:
78
+ // break;
79
+ // case EXIF_FORMAT_SSHORT:
80
+ // break;
81
+ // case EXIF_FORMAT_SLONG:
82
+ // break;
83
+ // case EXIF_FORMAT_SRATIONAL:
84
+ // break;
85
+ case EXIF_FORMAT_FLOAT:
86
+ value = rb_float_new(atof(buf));
87
+ break;
88
+ case EXIF_FORMAT_DOUBLE:
89
+ value = rb_float_new(atof(buf));
90
+ break;
91
+ default:
92
+ value = rb_str_new_cstr(buf);
93
+ }
94
+ rb_hash_aset(rb_hash_aref(*rb_h, IFD2SYM[ifd]), tag_name, value);
95
+ if(NIL_P(rb_hash_aref(*rb_h, tag_name))) rb_hash_aset(*rb_h, tag_name, value);
96
+ }
data/ext/exif/data.h ADDED
@@ -0,0 +1,16 @@
1
+ #ifndef DATA_H
2
+ #define DATA_H 1
3
+
4
+ #include <libexif/exif-data.h>
5
+ #include "ruby.h"
6
+
7
+ void init_data();
8
+
9
+ static VALUE rb_new(VALUE self, VALUE file_path);
10
+ static VALUE rb_dump(VALUE self);
11
+ static VALUE rb_value(VALUE self, VALUE key);
12
+
13
+ static void each_content(ExifContent *ec, void *user_data);
14
+ static void each_entry(ExifEntry *, void *user_data);
15
+
16
+ #endif /* DATA_H */
data/ext/exif/exif.c ADDED
@@ -0,0 +1,9 @@
1
+ #include "exif.h"
2
+ #include "data.h"
3
+
4
+ VALUE rb_mExif;
5
+
6
+ void Init_exif(void){
7
+ rb_mExif = rb_define_module("Exif");
8
+ init_data();
9
+ }
data/ext/exif/exif.h ADDED
@@ -0,0 +1,6 @@
1
+ #ifndef EXIF_H
2
+ #define EXIF_H 1
3
+
4
+ #include "ruby.h"
5
+
6
+ #endif /* EXIF_H */
@@ -0,0 +1,4 @@
1
+ require 'mkmf'
2
+ have_library('exif')
3
+ have_header('libexif/exif-data.h')
4
+ create_makefile('exif/exif')
data/lib/exif.rb ADDED
@@ -0,0 +1,6 @@
1
+ require 'exif/version'
2
+ require 'exif/underscore'
3
+ require 'exif/exif'
4
+
5
+ module Exif
6
+ end
@@ -0,0 +1,12 @@
1
+ module Exif
2
+ module_function
3
+ def underscore!(word)
4
+ word.to_s.gsub!('::', '/')
5
+ word.gsub!(/(?:([A-Za-z\d])|^)((?=a)b)(?=\b|[^a-z])/) { "#{$1}#{$1 && '_'}#{$2.downcase}" }
6
+ word.gsub!(/([A-Z\d]+)([A-Z][a-z])/,'\1_\2')
7
+ word.gsub!(/([a-z\d])([A-Z])/,'\1_\2')
8
+ word.tr!("-", "_")
9
+ word.downcase!
10
+ word
11
+ end
12
+ end
@@ -0,0 +1,3 @@
1
+ module Exif
2
+ VERSION = "0.9.0"
3
+ end
data/spec/exif_spec.rb ADDED
@@ -0,0 +1,22 @@
1
+ require 'exif'
2
+
3
+ describe Exif do
4
+ before :all do
5
+ @data = Exif::Data.new(File.expand_path('../sample.jpg', __FILE__))
6
+ end
7
+
8
+ # it '#dump' do
9
+ # expect { @data.dump }.not_to raise_error
10
+ # end
11
+
12
+ it 'works' do
13
+ expect(@data.contents[0][:image_width]).to eq 4000
14
+ expect(@data.contents[:image_width]).to eq 4000
15
+ expect(@data[0][:image_width]).to eq 4000
16
+ expect(@data[:image_width]).to eq 4000
17
+ expect(@data.contents[:gps][:gps_latitude]).to eq '24, 10.6817, 0'
18
+ expect(@data.contents[:gps_latitude]).to eq '24, 10.6817, 0'
19
+ expect(@data[:gps][:gps_latitude]).to eq '24, 10.6817, 0'
20
+ expect(@data[:gps_latitude]).to eq '24, 10.6817, 0'
21
+ end
22
+ end
data/spec/sample.jpg ADDED
Binary file
@@ -0,0 +1,89 @@
1
+ # This file was generated by the `rspec --init` command. Conventionally, all
2
+ # specs live under a `spec` directory, which RSpec adds to the `$LOAD_PATH`.
3
+ # The generated `.rspec` file contains `--require spec_helper` which will cause this
4
+ # file to always be loaded, without a need to explicitly require it in any files.
5
+ #
6
+ # Given that it is always loaded, you are encouraged to keep this file as
7
+ # light-weight as possible. Requiring heavyweight dependencies from this file
8
+ # will add to the boot time of your test suite on EVERY test run, even for an
9
+ # individual file that may not need all of that loaded. Instead, consider making
10
+ # a separate helper file that requires the additional dependencies and performs
11
+ # the additional setup, and require it from the spec files that actually need it.
12
+ #
13
+ # The `.rspec` file also contains a few flags that are not defaults but that
14
+ # users commonly want.
15
+ #
16
+ # See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration
17
+ RSpec.configure do |config|
18
+ # rspec-expectations config goes here. You can use an alternate
19
+ # assertion/expectation library such as wrong or the stdlib/minitest
20
+ # assertions if you prefer.
21
+ config.expect_with :rspec do |expectations|
22
+ # This option will default to `true` in RSpec 4. It makes the `description`
23
+ # and `failure_message` of custom matchers include text for helper methods
24
+ # defined using `chain`, e.g.:
25
+ # be_bigger_than(2).and_smaller_than(4).description
26
+ # # => "be bigger than 2 and smaller than 4"
27
+ # ...rather than:
28
+ # # => "be bigger than 2"
29
+ expectations.include_chain_clauses_in_custom_matcher_descriptions = true
30
+ end
31
+
32
+ # rspec-mocks config goes here. You can use an alternate test double
33
+ # library (such as bogus or mocha) by changing the `mock_with` option here.
34
+ config.mock_with :rspec do |mocks|
35
+ # Prevents you from mocking or stubbing a method that does not exist on
36
+ # a real object. This is generally recommended, and will default to
37
+ # `true` in RSpec 4.
38
+ mocks.verify_partial_doubles = true
39
+ end
40
+
41
+ # The settings below are suggested to provide a good initial experience
42
+ # with RSpec, but feel free to customize to your heart's content.
43
+ =begin
44
+ # These two settings work together to allow you to limit a spec run
45
+ # to individual examples or groups you care about by tagging them with
46
+ # `:focus` metadata. When nothing is tagged with `:focus`, all examples
47
+ # get run.
48
+ config.filter_run :focus
49
+ config.run_all_when_everything_filtered = true
50
+
51
+ # Limits the available syntax to the non-monkey patched syntax that is recommended.
52
+ # For more details, see:
53
+ # - http://myronmars.to/n/dev-blog/2012/06/rspecs-new-expectation-syntax
54
+ # - http://teaisaweso.me/blog/2013/05/27/rspecs-new-message-expectation-syntax/
55
+ # - http://myronmars.to/n/dev-blog/2014/05/notable-changes-in-rspec-3#new__config_option_to_disable_rspeccore_monkey_patching
56
+ config.disable_monkey_patching!
57
+
58
+ # This setting enables warnings. It's recommended, but in some cases may
59
+ # be too noisy due to issues in dependencies.
60
+ config.warnings = true
61
+
62
+ # Many RSpec users commonly either run the entire suite or an individual
63
+ # file, and it's useful to allow more verbose output when running an
64
+ # individual spec file.
65
+ if config.files_to_run.one?
66
+ # Use the documentation formatter for detailed output,
67
+ # unless a formatter has already been configured
68
+ # (e.g. via a command-line flag).
69
+ config.default_formatter = 'doc'
70
+ end
71
+
72
+ # Print the 10 slowest examples and example groups at the
73
+ # end of the spec run, to help surface which specs are running
74
+ # particularly slow.
75
+ config.profile_examples = 10
76
+
77
+ # Run specs in random order to surface order dependencies. If you find an
78
+ # order dependency and want to debug it, you can fix the order by providing
79
+ # the seed, which is printed after each run.
80
+ # --seed 1234
81
+ config.order = :random
82
+
83
+ # Seed global randomization in this process using the `--seed` CLI option.
84
+ # Setting this allows you to use `--seed` to deterministically reproduce
85
+ # test failures related to randomization by passing the same `--seed` value
86
+ # as the one that triggered the failure.
87
+ Kernel.srand config.seed
88
+ =end
89
+ end
metadata ADDED
@@ -0,0 +1,108 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: exif
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.9.0
5
+ platform: ruby
6
+ authors:
7
+ - Jian Weihang
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2014-10-30 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.7'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.7'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '10.0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '10.0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rake-compiler
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ description: Wrapper of libexif
56
+ email:
57
+ - tonytonyjan@gmail.com
58
+ executables: []
59
+ extensions:
60
+ - ext/exif/extconf.rb
61
+ extra_rdoc_files: []
62
+ files:
63
+ - ".gitignore"
64
+ - ".rspec"
65
+ - Gemfile
66
+ - LICENSE.txt
67
+ - README.md
68
+ - Rakefile
69
+ - exif.gemspec
70
+ - ext/exif/data.c
71
+ - ext/exif/data.h
72
+ - ext/exif/exif.c
73
+ - ext/exif/exif.h
74
+ - ext/exif/extconf.rb
75
+ - lib/exif.rb
76
+ - lib/exif/underscore.rb
77
+ - lib/exif/version.rb
78
+ - spec/exif_spec.rb
79
+ - spec/sample.jpg
80
+ - spec/spec_helper.rb
81
+ homepage: https://github.com/tonytonyjan/exif
82
+ licenses:
83
+ - MIT
84
+ metadata: {}
85
+ post_install_message:
86
+ rdoc_options: []
87
+ require_paths:
88
+ - lib
89
+ required_ruby_version: !ruby/object:Gem::Requirement
90
+ requirements:
91
+ - - ">="
92
+ - !ruby/object:Gem::Version
93
+ version: '0'
94
+ required_rubygems_version: !ruby/object:Gem::Requirement
95
+ requirements:
96
+ - - ">="
97
+ - !ruby/object:Gem::Version
98
+ version: '0'
99
+ requirements: []
100
+ rubyforge_project:
101
+ rubygems_version: 2.4.2
102
+ signing_key:
103
+ specification_version: 4
104
+ summary: Wrapper of libexif
105
+ test_files:
106
+ - spec/exif_spec.rb
107
+ - spec/sample.jpg
108
+ - spec/spec_helper.rb