ruby-vips 2.0.7 → 2.0.8

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 778544294cf437d6ec6b1e98451846c0a3d6f529
4
- data.tar.gz: da2043e2d35d9ecb2186baafd8b4fdd0191d90ee
3
+ metadata.gz: 3053302bf9707cbd283b0b8c1cf7add20cbe94bf
4
+ data.tar.gz: fc1c109a20fbd505a2e97227d02b8274c7385571
5
5
  SHA512:
6
- metadata.gz: 9c0e6b38cf8210d107113133c6d326f79b1acc12a393c30a094f5625a510081d4f444875d19836cabfd89aa09fe7f1d15b2bd633c9a29ed0ae3c3b09138ea524
7
- data.tar.gz: 40017a9f53fb333671758bac8dfd0c1beae876b811962fe1d188044b404bbbfb91070404807fdd5b8327a37cb1aef92d1a3c48bea44b4d87eeec72bdf4a4e06d
6
+ metadata.gz: b7a50b059950e254e5743d193e565296721cd35d23278ec2480f86a6e049770eb1a06ee670d2f2e4163611d29442d4c3080b5b7352caeb10bcaa84e661202ce0
7
+ data.tar.gz: 0626521b21f79c42fe423a373cbfb67eb36296f6b692f039a9a0c997af142e7d2ffd65cdfe66fffcc952d4a9d95d0e4c7b1566e279e83f00cc407e82620a00b3
@@ -2,6 +2,13 @@
2
2
 
3
3
  ## master
4
4
 
5
+ ## Version 2.0.8 (2017-09-14)
6
+
7
+ * add `thumb.rb` example, and verify we run stably and in constant memory
8
+ * cleanups and polish [Nakilon]
9
+ * add `composite` convenience method
10
+ * add `Vips::concurrency_set` and `Vips::vector_set`
11
+
5
12
  ## Version 2.0.7 (2017-09-08)
6
13
 
7
14
  * disable the logging for now, it could deadlock
data/VERSION CHANGED
@@ -1 +1 @@
1
- 2.0.7
1
+ 2.0.8
@@ -0,0 +1,31 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ # batch-process a lot of files
4
+ #
5
+ # this should run in constant memory -- if it doesn't, something has broken
6
+
7
+ require 'vips'
8
+
9
+ # benchmark thumbnail via a memory buffer
10
+ def via_memory(filename, thumbnail_width)
11
+ data = IO.binread(filename)
12
+
13
+ thumb = Vips::Image.thumbnail_buffer data, thumbnail_width, crop: 'centre'
14
+
15
+ thumb.write_to_buffer '.jpg'
16
+ end
17
+
18
+ # benchmark thumbnail via files
19
+ def via_files(filename, thumbnail_width)
20
+ thumb = Vips::Image.thumbnail filename, thumbnail_width, crop: 'centre'
21
+
22
+ thumb.write_to_buffer '.jpg'
23
+ end
24
+
25
+ ARGV.each do |filename|
26
+ puts "processing #{filename} ..."
27
+ thumb = via_memory(filename, 500)
28
+ # thumb = via_files(filename, 500)
29
+ end
30
+
31
+
@@ -71,7 +71,7 @@ module GLib
71
71
  end
72
72
 
73
73
  def self.remove_log_handler
74
- if @glib_log_handler_id != 0 and @glib_log_domain
74
+ if @glib_log_handler_id != 0 && @glib_log_domain
75
75
  g_log_remove_handler @glib_log_domain, @glib_log_handler_id
76
76
  @glib_log_handler_id = nil
77
77
  end
@@ -510,6 +510,8 @@ module Vips
510
510
  # in any case libvips does this for us
511
511
 
512
512
  attach_function :vips_leak_set, [:int], :void
513
+ attach_function :vips_vector_set_enabled, [:int], :void
514
+ attach_function :vips_concurrency_set, [:int], :void
513
515
 
514
516
  # Turn libvips leak testing on and off. Handy for debugging ruby-vips, not
515
517
  # very useful for user code.
@@ -540,6 +542,19 @@ module Vips
540
542
  vips_cache_set_max_files size
541
543
  end
542
544
 
545
+ # Set the size of the libvips worker pool. This defaults to the number of
546
+ # hardware threads on your computer. Set to 1 to disable threading.
547
+ def self.concurrency_set n
548
+ vips_concurrency_set n
549
+ end
550
+
551
+ # Enable or disable SIMD and the run-time compiler. This can give a nice
552
+ # speed-up, but can also be unstable on some systems or with some versions
553
+ # of the run-time compiler.
554
+ def self.vector_set enabled
555
+ vips_vector_set_enabled(enabled ? 1 : 0)
556
+ end
557
+
543
558
  # Deprecated compatibility function.
544
559
  #
545
560
  # Don't use this, instead change {GLib::logger.level}.
@@ -557,7 +572,7 @@ module Vips
557
572
  major = version(0)
558
573
  minor = version(1)
559
574
 
560
- major > x or (major == x and minor >= y)
575
+ major > x || (major == x && minor >= y)
561
576
  end
562
577
 
563
578
  LIBRARY_VERSION = Vips::version_string
@@ -23,6 +23,30 @@ module GObject
23
23
  layout :gtype, :GType,
24
24
  :data, [:ulong_long, 2]
25
25
 
26
+ # convert an enum value (str/symb/int) into an int ready for libvips
27
+ def self.from_nick(gtype, value)
28
+ value = value.to_s if value.is_a? Symbol
29
+
30
+ if value.is_a? String
31
+ value = Vips::vips_enum_from_nick "ruby-vips", gtype, value
32
+ if value == -1
33
+ raise Vips::Error
34
+ end
35
+ end
36
+
37
+ value
38
+ end
39
+
40
+ # convert an int enum back into a symbol
41
+ def self.to_nick(gtype, enum_value)
42
+ enum_name = Vips::vips_enum_nick gtype, enum_value
43
+ if enum_name == nil
44
+ raise Vips::Error
45
+ end
46
+
47
+ enum_name.to_sym
48
+ end
49
+
26
50
  def self.release ptr
27
51
  # GLib::logger.debug("GObject::GValue::release") {"ptr = #{ptr}"}
28
52
  ::GObject::g_value_unset ptr
@@ -82,14 +106,14 @@ module GObject
82
106
  ::Vips::vips_value_set_ref_string self, value
83
107
 
84
108
  when Vips::ARRAY_INT_TYPE
85
- value = [value] if not value.is_a? Array
109
+ value = [value] unless value.is_a? Array
86
110
 
87
111
  Vips::vips_value_set_array_int self, nil, value.length
88
112
  ptr = Vips::vips_value_get_array_int self, nil
89
113
  ptr.write_array_of_int32 value
90
114
 
91
115
  when Vips::ARRAY_DOUBLE_TYPE
92
- value = [value] if not value.is_a? Array
116
+ value = [value] unless value.is_a? Array
93
117
 
94
118
  # this will allocate an array in the gvalue
95
119
  Vips::vips_value_set_array_double self, nil, value.length
@@ -100,7 +124,7 @@ module GObject
100
124
  ptr.write_array_of_double value
101
125
 
102
126
  when Vips::ARRAY_IMAGE_TYPE
103
- value = [value] if not value.is_a? Array
127
+ value = [value] unless value.is_a? Array
104
128
 
105
129
  Vips::vips_value_set_array_image self, value.length
106
130
  ptr = Vips::vips_value_get_array_image self, nil
@@ -121,17 +145,8 @@ module GObject
121
145
  ::GObject::g_value_set_flags self, value
122
146
 
123
147
  when GENUM_TYPE
124
- value = value.to_s if value.is_a? Symbol
125
-
126
- if value.is_a? String
127
- value = Vips::vips_enum_from_nick "ruby-vips",
128
- self[:gtype], value
129
- if value == -1
130
- raise Vips::Error
131
- end
132
- end
133
-
134
- ::GObject::g_value_set_enum self, value
148
+ enum_value = GValue.from_nick(self[:gtype], value)
149
+ ::GObject::g_value_set_enum self, enum_value
135
150
 
136
151
  when GOBJECT_TYPE
137
152
  ::GObject::g_value_set_object self, value
@@ -200,14 +215,8 @@ module GObject
200
215
  result = ::GObject::g_value_get_flags self
201
216
 
202
217
  when GENUM_TYPE
203
- enum_value = ::GObject::g_value_get_enum self
204
- # this returns a static string, no need to worry about
205
- # lifetime
206
- enum_name = Vips::vips_enum_nick self[:gtype], enum_value
207
- if enum_name == nil
208
- raise Vips::Error
209
- end
210
- result = enum_name.to_sym
218
+ enum_value = ::GObject::g_value_get_enum(self)
219
+ result = GValue.to_nick self[:gtype], enum_value
211
220
 
212
221
  when GOBJECT_TYPE
213
222
  obj = ::GObject::g_value_get_object self
@@ -82,14 +82,12 @@ module Vips
82
82
  end
83
83
 
84
84
  def self.complex? format
85
- format_number = Vips::vips_enum_from_nick "complex?",
86
- BAND_FORMAT_TYPE, format.to_s
85
+ format_number = GObject::GValue.from_nick BAND_FORMAT_TYPE, format
87
86
  Vips::vips_band_format_iscomplex(format_number) != 0
88
87
  end
89
88
 
90
89
  def self.float? format
91
- format_number = Vips::vips_enum_from_nick "float?",
92
- BAND_FORMAT_TYPE, format.to_s
90
+ format_number = GObject::GValue.from_nick BAND_FORMAT_TYPE, format
93
91
  Vips::vips_band_format_isfloat(format_number) != 0
94
92
  end
95
93
 
@@ -99,12 +97,12 @@ module Vips
99
97
  def self.run_cmplx image, &block
100
98
  original_format = image.format
101
99
 
102
- if not Image::complex? image.format
100
+ unless Image::complex? image.format
103
101
  if image.bands % 2 != 0
104
102
  raise Error, "not an even number of bands"
105
103
  end
106
104
 
107
- if not Image::float? image.format
105
+ unless Image::float? image.format
108
106
  image = image.cast :float
109
107
  end
110
108
 
@@ -114,7 +112,7 @@ module Vips
114
112
 
115
113
  image = block.(image)
116
114
 
117
- if not Image::complex? original_format
115
+ unless Image::complex? original_format
118
116
  new_format = image.format == :dpcomplex ? :double : :float
119
117
  image = image.copy format: new_format, bands: image.bands * 2
120
118
  end
@@ -324,17 +322,17 @@ module Vips
324
322
  def self.new_from_array array, scale = 1, offset = 0
325
323
  # we accept a 1D array and assume height == 1, or a 2D array
326
324
  # and check all lines are the same length
327
- if not array.is_a? Array
325
+ unless array.is_a? Array
328
326
  raise Vips::Error, "Argument is not an array."
329
327
  end
330
328
 
331
329
  if array[0].is_a? Array
332
330
  height = array.length
333
331
  width = array[0].length
334
- if not array.all? {|x| x.is_a? Array}
332
+ unless array.all? {|x| x.is_a? Array}
335
333
  raise Vips::Error, "Not a 2D array."
336
334
  end
337
- if not array.all? {|x| x.length == width}
335
+ unless array.all? {|x| x.length == width}
338
336
  raise Vips::Error, "Array not rectangular."
339
337
  end
340
338
  array = array.flatten
@@ -343,7 +341,7 @@ module Vips
343
341
  width = array.length
344
342
  end
345
343
 
346
- if not array.all? {|x| x.is_a? Numeric}
344
+ unless array.all? {|x| x.is_a? Numeric}
347
345
  raise Vips::Error, "Not all array elements are Numeric."
348
346
  end
349
347
 
@@ -477,7 +475,7 @@ module Vips
477
475
  def get_typeof name
478
476
  # on libvips before 8.5, property types must be searched first,
479
477
  # since vips_image_get_typeof returned built-in enums as int
480
- if not Vips::at_least_libvips?(8, 5)
478
+ unless Vips::at_least_libvips?(8, 5)
481
479
  gtype = parent_get_typeof name
482
480
  return gtype if gtype != 0
483
481
  end
@@ -501,7 +499,7 @@ module Vips
501
499
  def get name
502
500
  # with old libvips, we must fetch properties (as opposed to
503
501
  # metadata) via VipsObject
504
- if not Vips::at_least_libvips?(8, 5)
502
+ unless Vips::at_least_libvips?(8, 5)
505
503
  return super if parent_get_typeof(name) != 0
506
504
  end
507
505
 
@@ -518,7 +516,7 @@ module Vips
518
516
  # @return [[String]] array of field names
519
517
  def get_fields
520
518
  # vips_image_get_fields() was added in libvips 8.5
521
- return [] if not Vips.respond_to? :vips_image_get_fields
519
+ return [] unless Vips.respond_to? :vips_image_get_fields
522
520
 
523
521
  array = Vips::vips_image_get_fields self
524
522
 
@@ -885,8 +883,7 @@ module Vips
885
883
  # @return [Image] extracted band(s)
886
884
  def [] index
887
885
  if index.is_a? Range
888
- n = index.end - index.begin
889
- n += 1 if not index.exclude_end?
886
+ n = index.size
890
887
  extract_band index.begin, n: n
891
888
  elsif index.is_a? Numeric
892
889
  extract_band index
@@ -921,12 +918,10 @@ module Vips
921
918
  array = memory.unpack(template)
922
919
 
923
920
  # gather band elements together
924
- pixel_array = []
925
- array.each_slice(bands) {|pixel| pixel_array << pixel}
921
+ pixel_array = array.each_slice(bands).to_a
926
922
 
927
923
  # build rows
928
- row_array = []
929
- pixel_array.each_slice(width) {|row| row_array << row}
924
+ row_array = pixel_array.each_slice(width).to_a
930
925
 
931
926
  return row_array
932
927
  end
@@ -977,7 +972,7 @@ module Vips
977
972
  #
978
973
  # @return [Array<Image>] Array of n one-band images
979
974
  def bandsplit
980
- (0...bands).map {|i| extract_band(i)}
975
+ (0...bands).map {|i| extract_band i}
981
976
  end
982
977
 
983
978
  # Join a set of images bandwise.
@@ -985,20 +980,39 @@ module Vips
985
980
  # @param other [Image, Array<Image>, Real, Array<Real>] bands to append
986
981
  # @return [Image] many band image
987
982
  def bandjoin other
988
- if not other.is_a? Array
983
+ unless other.is_a? Array
989
984
  other = [other]
990
985
  end
991
986
 
992
987
  # if other is just Numeric, we can use bandjoin_const
993
- not_all_real = (other.map {|x| not x.is_a?(Numeric)}).include?(true)
988
+ not_all_real = !other.all?{|x| x.is_a? Numeric}
994
989
 
995
990
  if not_all_real
996
991
  Vips::Image.bandjoin([self] + other)
997
992
  else
998
- bandjoin_const(other)
993
+ bandjoin_const other
999
994
  end
1000
995
  end
1001
996
 
997
+ # Composite a set of images with a set of blend modes.
998
+ #
999
+ # @param other [Image, Array<Image>, Real, Array<Real>] bands to append
1000
+ # @return [Image] many band image
1001
+ def composite other, mode, opts = {}
1002
+ unless other.is_a? Array
1003
+ other = [other]
1004
+ end
1005
+ unless mode.is_a? Array
1006
+ mode = [mode]
1007
+ end
1008
+
1009
+ mode = mode.map do |x|
1010
+ GObject::GValue.from_nick Vips::BLEND_MODE_TYPE, x
1011
+ end
1012
+
1013
+ Vips::Image.composite([self] + other, mode, opts)
1014
+ end
1015
+
1002
1016
  # Return the coordinates of the image maximum.
1003
1017
  #
1004
1018
  # @return [Real, Real, Real] maximum value, x coordinate of maximum, y
@@ -1244,10 +1258,10 @@ module Vips
1244
1258
  def ifthenelse(th, el, opts = {})
1245
1259
  match_image = [th, el, self].find {|x| x.is_a? Vips::Image}
1246
1260
 
1247
- if not th.is_a? Vips::Image
1261
+ unless th.is_a? Vips::Image
1248
1262
  th = Operation.imageize match_image, th
1249
1263
  end
1250
- if not el.is_a? Vips::Image
1264
+ unless el.is_a? Vips::Image
1251
1265
  el = Operation.imageize match_image, el
1252
1266
  end
1253
1267
 
@@ -1278,7 +1292,7 @@ module Vips
1278
1292
 
1279
1293
  def self.generate_yard
1280
1294
  # these have hand-written methods, see above
1281
- no_generate = ["scale", "bandjoin", "ifthenelse"]
1295
+ no_generate = ["scale", "bandjoin", "composite", "ifthenelse"]
1282
1296
 
1283
1297
  # map gobject's type names to Ruby
1284
1298
  map_go_to_ruby = {
@@ -1312,7 +1326,7 @@ module Vips
1312
1326
  next if (arg_flags & ARGUMENT_CONSTRUCT) == 0
1313
1327
  next if (arg_flags & ARGUMENT_DEPRECATED) != 0
1314
1328
 
1315
- name = pspec[:name].gsub("-", "_")
1329
+ name = pspec[:name].tr("-", "_")
1316
1330
  # 'in' as a param name confuses yard
1317
1331
  name = "im" if name == "in"
1318
1332
  gtype = pspec[:value_type]
@@ -1321,10 +1335,9 @@ module Vips
1321
1335
  if map_go_to_ruby.include? type_name
1322
1336
  type_name = map_go_to_ruby[type_name]
1323
1337
  end
1324
- if fundamental == GObject::GFLAGS_TYPE or
1338
+ if fundamental == GObject::GFLAGS_TYPE ||
1325
1339
  fundamental == GObject::GENUM_TYPE
1326
- type_name =~ /Vips(.*)/
1327
- type_name = "Vips::" + $~[1]
1340
+ type_name = "Vips::" + type_name[/Vips(.*)/, 1]
1328
1341
  end
1329
1342
  blurb = GObject::g_param_spec_get_blurb pspec
1330
1343
  value = {:name => name,
@@ -1337,7 +1350,7 @@ module Vips
1337
1350
  if (arg_flags & ARGUMENT_REQUIRED) != 0
1338
1351
  # note the first required input image, if any ... we
1339
1352
  # will be a method of this instance
1340
- if not member_x and gtype == Vips::IMAGE_TYPE
1353
+ if !member_x && gtype == Vips::IMAGE_TYPE
1341
1354
  member_x = value
1342
1355
  else
1343
1356
  required_input << value
@@ -1348,10 +1361,10 @@ module Vips
1348
1361
  end
1349
1362
 
1350
1363
  # MODIFY INPUT args count as OUTPUT as well
1351
- if (arg_flags & ARGUMENT_OUTPUT) != 0 or
1352
- ((arg_flags & ARGUMENT_INPUT) != 0 and
1364
+ if (arg_flags & ARGUMENT_OUTPUT) != 0 ||
1365
+ ((arg_flags & ARGUMENT_INPUT) != 0 &&
1353
1366
  (arg_flags & ARGUMENT_MODIFY) != 0)
1354
- if (arg_flags & ARGUMENT_REQUIRED) != 0 and
1367
+ if (arg_flags & ARGUMENT_REQUIRED) != 0
1355
1368
  required_output << value
1356
1369
  else
1357
1370
  optional_output << value
@@ -1361,7 +1374,7 @@ module Vips
1361
1374
  end
1362
1375
 
1363
1376
  print "# @!method "
1364
- print "self." if not member_x
1377
+ print "self." unless member_x
1365
1378
  print "#{nickname}("
1366
1379
  print required_input.map{|x| x[:name]}.join(", ")
1367
1380
  print ", " if required_input.length > 0
@@ -32,6 +32,13 @@ module Vips
32
32
  INTERPRETATION_TYPE = Vips::vips_interpretation_get_type
33
33
  CODING_TYPE = Vips::vips_coding_get_type
34
34
 
35
+ if Vips::at_least_libvips?(8, 6)
36
+ attach_function :vips_blend_mode_get_type, [], :GType
37
+ BLEND_MODE_TYPE = Vips::vips_blend_mode_get_type
38
+ else
39
+ BLEND_MODE_TYPE = nil
40
+ end
41
+
35
42
  private
36
43
 
37
44
  attach_function :vips_enum_from_nick, [:string, :GType, :string], :int
@@ -125,7 +132,7 @@ module Vips
125
132
  # return a gtype, raise an error on not found
126
133
  def get_typeof_error name
127
134
  pspec = get_pspec name
128
- raise Vips::Error if not pspec
135
+ raise Vips::Error unless pspec
129
136
 
130
137
  pspec[:value][:value_type]
131
138
  end
@@ -133,7 +140,7 @@ module Vips
133
140
  # return a gtype, 0 on not found
134
141
  def get_typeof name
135
142
  pspec = get_pspec name
136
- if not pspec
143
+ unless pspec
137
144
  Vips::vips_error_clear
138
145
  return 0
139
146
  end
@@ -98,7 +98,7 @@ module Vips
98
98
  if (flags & ARGUMENT_CONSTRUCT) != 0
99
99
  # names can include - as punctuation, but we always use _ in
100
100
  # Ruby
101
- name = pspec[:name].gsub("-", "_")
101
+ name = pspec[:name].tr("-", "_")
102
102
 
103
103
  args << [name, flags]
104
104
  end
@@ -125,7 +125,8 @@ module Vips
125
125
 
126
126
  # 2D array values become tiny 2D images
127
127
  # if there's nothing to match to, we also make a 2D image
128
- if (value.is_a? Array and value[0].is_a? Array) or match_image == nil
128
+ if (value.is_a?(Array) && value[0].is_a?(Array)) ||
129
+ match_image == nil
129
130
  return Image.new_from_array value
130
131
  else
131
132
  # we have a 1D array ... use that as a pixel constant and
@@ -240,7 +241,7 @@ module Vips
240
241
  next if (flags & ARGUMENT_DEPRECATED) != 0
241
242
 
242
243
  if (flags & ARGUMENT_INPUT) != 0
243
- if (flags & ARGUMENT_REQUIRED) != 0 and
244
+ if (flags & ARGUMENT_REQUIRED) != 0
244
245
  required_input << [name, flags]
245
246
  else
246
247
  optional_input[name] = flags
@@ -248,10 +249,10 @@ module Vips
248
249
  end
249
250
 
250
251
  # MODIFY INPUT args count as OUTPUT as well
251
- if (flags & ARGUMENT_OUTPUT) != 0 or
252
- ((flags & ARGUMENT_INPUT) != 0 and
252
+ if (flags & ARGUMENT_OUTPUT) != 0 ||
253
+ ((flags & ARGUMENT_INPUT) != 0 &&
253
254
  (flags & ARGUMENT_MODIFY) != 0)
254
- if (flags & ARGUMENT_REQUIRED) != 0 and
255
+ if (flags & ARGUMENT_REQUIRED) != 0
255
256
  required_output << [name, flags]
256
257
  else
257
258
  optional_output[name] = flags
@@ -262,11 +263,11 @@ module Vips
262
263
 
263
264
  # so we should have been supplied with n_required_input values, or
264
265
  # n_required_input + 1 if there's a hash of options at the end
265
- if not supplied.is_a? Array
266
+ unless supplied.is_a? Array
266
267
  raise Vips::Error, "unable to call #{name}: " +
267
268
  "argument array is not an array"
268
269
  end
269
- if not optional.is_a? Hash
270
+ unless optional.is_a? Hash
270
271
  raise Vips::Error, "unable to call #{name}: " +
271
272
  "optional arguments are not a hash"
272
273
  end
@@ -281,8 +282,8 @@ module Vips
281
282
  optional.each do |key, value|
282
283
  arg_name = key.to_s
283
284
 
284
- if not optional_input.has_key? arg_name and
285
- not optional_output.has_key? arg_name
285
+ unless optional_input.has_key?(arg_name) ||
286
+ optional_output.has_key?(arg_name)
286
287
  raise Vips::Error, "unable to call #{name}: " +
287
288
  "unknown option #{arg_name}"
288
289
  end
@@ -1,4 +1,4 @@
1
1
  module Vips
2
- VERSION = "2.0.7"
2
+ VERSION = "2.0.8"
3
3
  end
4
4
 
@@ -30,7 +30,7 @@ Gem::Specification.new do |spec|
30
30
 
31
31
  spec.add_development_dependency "rake", ["~> 11.0"]
32
32
  spec.add_development_dependency "rspec", ["~> 3.3"]
33
- spec.add_development_dependency "yard", ["~> 0.8"]
33
+ spec.add_development_dependency "yard", ["~> 0.9.11"]
34
34
  spec.add_development_dependency "redcarpet", ["~> 3.3"]
35
35
  spec.add_development_dependency "github-markup", ["~> 1.4"]
36
36
  spec.add_development_dependency "bundler", ["~> 1.0"]
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ruby-vips
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.7
4
+ version: 2.0.8
5
5
  platform: ruby
6
6
  authors:
7
7
  - John Cupitt
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-09-08 00:00:00.000000000 Z
11
+ date: 2017-12-21 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: ffi
@@ -58,14 +58,14 @@ dependencies:
58
58
  requirements:
59
59
  - - "~>"
60
60
  - !ruby/object:Gem::Version
61
- version: '0.8'
61
+ version: 0.9.11
62
62
  type: :development
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
66
  - - "~>"
67
67
  - !ruby/object:Gem::Version
68
- version: '0.8'
68
+ version: 0.9.11
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: redcarpet
71
71
  requirement: !ruby/object:Gem::Requirement
@@ -136,6 +136,7 @@ files:
136
136
  - example/example4.rb
137
137
  - example/example5.rb
138
138
  - example/inheritance_with_refcount.rb
139
+ - example/thumb.rb
139
140
  - example/trim8.rb
140
141
  - example/watermark.rb
141
142
  - example/wobble.rb