gogyou 0.2.3 → 0.2.4

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: 27a359613aa14229e1909aa2407b66a0453d32d0
4
- data.tar.gz: a20b4c0a8daba874576b033294d052741d65a4f7
3
+ metadata.gz: 9633436e949f5045c684dde26894ed49cb30630e
4
+ data.tar.gz: 86d4d3037ebbbf38f66757aa1735cdb4430f684b
5
5
  SHA512:
6
- metadata.gz: 6756d3ec51de9d0a2f8a7d806b8fcc019b6f4345c3312437f4c94d94e94a38c25154d9e510dfb12eb1416e61c3170a6dcdfcff92809b22efa628fe036c2baa70
7
- data.tar.gz: ea1b5f3afd52b88b8f273f98794c36afd191ab2ba45235a8d0f8680c2de168937558ffb7e5c064c7c8288f50beb93fac1c1fd1cfbbfee43eee5f936df0ec1fcf
6
+ metadata.gz: 014588ae16a1e4def6fb346f49f8102e268d7035e0b0a7174430c3a1e31dccc085dc5c5045f9fcba7f3c7fe738892ff34e26d7503eb8d0b4c0e90447f0655c93
7
+ data.tar.gz: dc82211d768d36370a59b67b03e3715cde0cea1c351f0914ec6f6948cfeac50b0c8bdc21e306684fe7e1e3e517b949cf848067592a1adcde0a823fdeb6e2c0ea
@@ -1,5 +1,62 @@
1
1
  # gogyou の更新履歴
2
2
 
3
+ ## gogyou-0.2.4 (2015-10-16)
4
+
5
+ * 環境依存の型に対する結果の正確性を修正
6
+
7
+ バイトオーダーが環境依存の型に対する値の取得・変更処理をより正確になるように修正しました。
8
+
9
+ ただし代入時の CPU 負荷が二倍程度悪化しています。
10
+
11
+ * いくつかの ruby 実装に対する修正
12
+
13
+ ruby-2.0 はサポート対象としていたにもかかわらず gogyou-0.2.3 で require が失敗してしまった部分を修正しています。
14
+
15
+ jruby、rubinius はこれまで確認すらしていませんでしたが、お遊び程度で確認しています
16
+ (サポート対象となっていないことに注意して下さい)。
17
+
18
+ * Gogyou::Accessor::Array#each の追加と Enumerable 化
19
+
20
+ Gogyou::Accessor::Array#each を追加し、Enumerabale を include するように変更しました。
21
+
22
+ Gogyou::Accessor::Array#each_with_index も追加してあります。
23
+
24
+ * Fiddle::Pointer と FFI::AbstractMemory を構造体バッファオブジェクトとして利用可能に
25
+
26
+ Fiddle::Pointer と FFI::AbstractMemory のインスタンスを構造体の
27
+ バッファオブジェクトとして利用できるように機能を追加しました。
28
+
29
+ * IEEE 754-2008 に対応した浮動小数点実数型を追加
30
+
31
+ IEEE 754-2008 に対応した 16・32・64 ビット精度の浮動小数点実数に対する以下の型を追加しました。
32
+
33
+ ``float16_t`` ``float16_swap`` ``float16_be`` ``float16_le``
34
+ ``float32_t`` ``float32_swap`` ``float32_be`` ``float32_le``
35
+ ``float64_t`` ``float64_swap`` ``float64_be`` ``float64_le``
36
+
37
+ * 固定小数点実数の型名を追加
38
+
39
+ 16・32 ビット精度の固定小数点実数に対する以下の型を追加しました。
40
+
41
+ ``fixed16q8_t`` ``fixed16q8_swap`` ``fixed16q8_be`` ``fixed16q8_le``
42
+ ``fixed32q6_t`` ``fixed32q6_swap`` ``fixed32q6_be`` ``fixed32q6_le``
43
+ ``fixed32q8_t`` ``fixed32q8_swap`` ``fixed32q8_be`` ``fixed32q8_le``
44
+ ``fixed32q12_t`` ``fixed32q12_swap`` ``fixed32q12_be`` ``fixed32q12_le``
45
+ ``fixed32q16_t`` ``fixed32q16_swap`` ``fixed32q16_be`` ``fixed32q16_le``
46
+ ``fixed32q24_t`` ``fixed32q24_swap`` ``fixed32q24_be`` ``fixed32q24_le``
47
+
48
+ これらは格納する時 (storeXXX) は固定小数点実数として処理されますが、ruby
49
+ オブジェクトとして取り出す時 (loadXXX) は Float オブジェクトとして処理されます。
50
+
51
+ * クラス・モジュール名の変更
52
+
53
+ Gogyou::Primitives::Primitive を Gogyou::Primitive に変更しました。
54
+
55
+ * いくつかの処理の効率を改善
56
+
57
+ * その他問題の修正
58
+
59
+
3
60
  ## gogyou-0.2.3 (2015-5-17)
4
61
 
5
62
  * short、int、long、long long のバイト数が環境ごとの値として取得するようになっていなかった問題を修正
data/LICENSE CHANGED
@@ -1,4 +1,4 @@
1
- # Gogyou License (2-clause BSD License)
1
+ Gogyou License (2-clause BSD License)
2
2
 
3
3
  ----
4
4
 
data/README.md CHANGED
@@ -19,14 +19,14 @@ ruby 構文による、C 言語の構造体・共用体・多次元配列 (も
19
19
  ----
20
20
 
21
21
  * Product Name (名称): gogyou (ゴギョウ / 御形 / Gnaphalium affine)
22
- * Author (制作者): dearblue <dearblue@users.sourceforge.jp>
22
+ * Author (制作者): dearblue <dearblue@users.osdn.me>
23
23
  * Distribute License (頒布ライセンス): 2-clause BSD License (二条項 BSD ライセンス)
24
- * Software Quarity (ソフトウェア品質): alpha
24
+ * Software Quarity (ソフトウェア品質): EXPERIMENTAL
25
25
  * User (想定利用者): Rubyist
26
- * Release Number (リリースナンバー): 0.2.3
26
+ * Release Number (リリースナンバー): 0.2.4
27
27
  * Memory Usage (使用メモリ量): 2 MB +
28
28
  * Installed Size (インストール容量): under 1 MB
29
- * Project Page: <http://sourceforge.jp/projects/rutsubo/>
29
+ * Project Page: <https://osdn.jp/projects/rutsubo/>
30
30
  * Support Ruby: ruby-2.0+ <http://www.ruby-lang.org/>
31
31
 
32
32
  ## Example
@@ -34,7 +34,7 @@ ruby 構文による、C 言語の構造体・共用体・多次元配列 (も
34
34
  ruby/ruby.h の ``struct RBasic`` と ``struct RObject`` を gogyou を用いて次のように記述出来ます
35
35
  (ポインタの定義はできていないため、``uintptr_t`` で置き換えています):
36
36
 
37
- ```ruby:ruby
37
+ ``` ruby:ruby
38
38
  require "gogyou"
39
39
 
40
40
  module MyRuby
@@ -71,9 +71,15 @@ end
71
71
 
72
72
  また、ruby がもつ ``p`` メソッドや ``pp`` メソッドでわかりやすく表示されます (gogyou-0.2.3 にて追加)。
73
73
 
74
- ```ruby:ruby
74
+ 定義した構造体のインスタンスを作成する場合、文字列だけではなく Fiddle::Pointer や FFI::AbstractMemory インスタンスの指定も可能です (gogyou-0.2.4 にて追加)。
75
+
76
+ ``` ruby:ruby
75
77
  obj = MyRuby::RObject.new
76
- # OR obj = MyRuby::RObject.bind("0123456789abcdef" * 2000) # given any string
78
+ # OR: obj = MyRuby::RObject.bind("0123456789abcdef" * 2000) # given any string
79
+ # OR: require "gogyou/fiddle"
80
+ # obj = MyRuby::RObject.bind(Fiddle::Pointer.malloc(MyRuby::RObject.bytesize))
81
+ # OR: require "gogyou/ffi"
82
+ # obj = MyRuby::RObject.bind(FFI::MemoryPointer.new(MyRuby::RObject.bytesize))
77
83
 
78
84
  obj.basic.flags = 1234567890
79
85
  (obj.basic.klass = 0xaaaaaaaa) rescue p $! # => EXCEPTION! klass field is immutable
@@ -87,7 +93,7 @@ tmp = obj.as.heap # get a middle field accessor
87
93
  tmp.ivptr = 0x44444444
88
94
  p obj.as.heap.ivptr # => 0x44444444
89
95
 
90
- # following results are in little endian 64 bit enviroment
96
+ # following results are in little endian 64 bit system
91
97
  require "pp"
92
98
 
93
99
  pp obj.bytesize # => 40
@@ -194,7 +200,7 @@ pp obj # => #<MyRuby::RObject
194
200
 
195
201
  最初に gogyou を読み込みます。
196
202
 
197
- ```ruby:ruby
203
+ ``` ruby:ruby
198
204
  require "gogyou"
199
205
  ```
200
206
 
@@ -202,7 +208,7 @@ require "gogyou"
202
208
 
203
209
  1. クラスやモジュールの中で ``extend Gogyou`` して、``struct`` (または ``union``) をブロック付きで呼び出し、その戻り値を定数に代入する
204
210
 
205
- ```ruby:ruby
211
+ ``` ruby:ruby
206
212
  module MyModule
207
213
  extend Gogyou
208
214
 
@@ -219,7 +225,7 @@ require "gogyou"
219
225
 
220
226
  2. Gogyou.struct (または Gogyou.union) をブロック付きで呼び出し、その戻り値を定数に代入する
221
227
 
222
- ```ruby:ruby
228
+ ``` ruby:ruby
223
229
  TypeA = Gogyou.struct {
224
230
  int :a
225
231
  }
@@ -233,7 +239,7 @@ require "gogyou"
233
239
  3. Gogyou::Struct (または Gogyou::Union) を親クラスとしてクラスを定義し、その中で ``struct`` (または ``union``) をブロック付きで呼び出す
234
240
  (gogyou-0.2.3 にて追加)
235
241
 
236
- ```ruby:ruby
242
+ ``` ruby:ruby
237
243
  class TypeA < Gogyou::Struct
238
244
  struct {
239
245
  int :a
@@ -256,7 +262,7 @@ require "gogyou"
256
262
 
257
263
  フィールド名はシンボル (または文字列) で与えます。
258
264
 
259
- ```ruby:ruby
265
+ ``` ruby:ruby
260
266
  module MyModule
261
267
  extend Gogyou
262
268
 
@@ -275,7 +281,7 @@ end
275
281
 
276
282
  配列として定義する場合は、フィールド名に続く引数として整数値を与えます。
277
283
 
278
- ```ruby:ruby
284
+ ``` ruby:ruby
279
285
  module MyModule
280
286
  extend Gogyou
281
287
 
@@ -287,7 +293,7 @@ end
287
293
 
288
294
  多次元配列の場合は、連続して整数値を与えます。
289
295
 
290
- ```ruby:ruby
296
+ ``` ruby:ruby
291
297
  module MyModule
292
298
  extend Gogyou
293
299
 
@@ -299,7 +305,7 @@ end
299
305
 
300
306
  配列の場合でも、複数のフィールドを連続してまとめることが出来ます。
301
307
 
302
- ```ruby:ruby
308
+ ``` ruby:ruby
303
309
  module MyModule
304
310
  extend Gogyou
305
311
 
@@ -318,7 +324,7 @@ struct の最初の引数にブロックを与えること以外は、先に述
318
324
 
319
325
  コメントは C 言語で記述した場合の対比としてあります。
320
326
 
321
- ```ruby:ruby
327
+ ``` ruby:ruby
322
328
  module MyModule
323
329
  extend Gogyou
324
330
 
@@ -332,7 +338,7 @@ end
332
338
 
333
339
  最初の引数にブロックではなく、型情報としてのオブジェクトを与えることも出来ます。
334
340
 
335
- ```ruby:ruby
341
+ ``` ruby:ruby
336
342
  module MyModule
337
343
  extend Gogyou
338
344
 
@@ -348,7 +354,7 @@ end
348
354
 
349
355
  無名構造体の場合、引数は渡さずにブロックを渡すだけです。
350
356
 
351
- ```ruby:ruby
357
+ ``` ruby:ruby
352
358
  module MyModule
353
359
  extend Gogyou
354
360
 
@@ -436,42 +442,42 @@ end
436
442
 
437
443
  順を追って説明していきます。
438
444
 
439
- ### `.bytesize`
445
+ ### ``.bytesize``
440
446
 
441
447
  このメソッドはその型が必要とする領域のバイト数を正の整数値で返します。
442
448
 
443
449
  型が拡張構造になっている場合は、最小値となる値を返します。
444
450
 
445
- MD5 を定義する場合、16バイトなので `16` を返します。
451
+ MD5 を定義する場合、16バイトなので ``16`` を返します。
446
452
 
447
- ### `.bytealign`
453
+ ### ``.bytealign``
448
454
 
449
455
  このメソッドはその型のアライメントサイズを正の整数値で返します。
450
456
 
451
- MD5 を定義する場合、内部表現は1バイトの塊なので `1` を返します
452
- (MD5 の実装によっては `4` だったり `8` だったり、はたまた `16` になるかもしれません)。
457
+ MD5 を定義する場合、内部表現は1バイトの塊なので ``1`` を返します
458
+ (MD5 の実装によっては ``4`` だったり ``8`` だったり、はたまた ``16`` になるかもしれません)。
453
459
 
454
- ### `.extensible?`
460
+ ### ``.extensible?``
455
461
 
456
462
  このメソッドはその型が常に固定長か、任意に拡張する構造になっているかどうかを返します。
457
463
 
458
- `true` であれば拡張構造であることを意味し、`false` であれば固定長であることを意味します。
464
+ ``true`` であれば拡張構造であることを意味し、``false`` であれば固定長であることを意味します。
459
465
 
460
- MD5 は固定長なので、`false` を返します。
466
+ MD5 は固定長なので、``false`` を返します。
461
467
 
462
- ### `.aref(buffer, offset)`
468
+ ### ``.aref(buffer, offset)``
463
469
 
464
470
  このメソッドは構造体のフィールドを参照した場合に呼ばれます。
465
471
 
466
- `buffer` は上位構造のバイナリデータとしての String インスタンスです。
472
+ ``buffer`` はバイナリデータとしての String インスタンスです (※gogyou-0.2.4 からは Fiddle::Pointer や FFI::AbstractMemory インスタンスである可能性もあります)。
467
473
 
468
- `offset` は上位構造から見た、フィールドの絶対位置をバイト値で表した整数値です。
474
+ ``offset`` はバッファ上における、フィールドの絶対位置をバイト値で表した整数値です。
469
475
 
470
476
  戻り値はその構造体のフィールドに対するインスタンスを返します。
471
477
 
472
- MD5 の場合、`buffer` からデータを切り出して MD5 のインスタンスを返すべきです。
478
+ MD5 の場合、``buffer`` を元にした MD5 のインスタンスを返すべきです。
473
479
 
474
- ```ruby:ruby
480
+ ``` ruby:ruby
475
481
  class MD5
476
482
  def self.aref(buffer, offset)
477
483
  new(buffer.byteslice(offset, 16))
@@ -479,13 +485,13 @@ class MD5
479
485
  end
480
486
  ```
481
487
 
482
- もしもインスタンスの変更を反映させる `MD5#[]=` のようなメソッドが必要であるならば、上述したメソッドではうまく行きません。
483
- 理由は `buffer.byteslice` によって `buffer` オブジェクトが切り離されてしまっているからです。
488
+ もしもインスタンスの変更を反映させる ``MD5#[]=`` のようなメソッドが必要であるならば、上述したメソッドではうまく行きません。
489
+ 理由は ``buffer.byteslice`` によって ``buffer`` オブジェクトが切り離されてしまっているからです。
484
490
 
485
- クラスを MD5 のデータが保持されるだけの構造から、`buffer``offset` を保持する構造に変更する必要があります。
491
+ クラスを MD5 のデータが保持されるだけの構造から、``buffer````offset`` を保持する構造に変更する必要があります。
486
492
  その上でメソッドの定義を変更します。
487
493
 
488
- ```ruby:ruby
494
+ ``` ruby:ruby
489
495
  class MD5
490
496
  def self.aref(buffer, offset)
491
497
  new(buffer, offset)
@@ -503,27 +509,27 @@ class MD5
503
509
  end
504
510
  ```
505
511
 
506
- ### `.aset(buffer, offset, data)`
512
+ ### ``.aset(buffer, offset, data)``
507
513
 
508
514
  このメソッドは構造体のフィールドへデータを代入した時に呼ばれます。
509
515
 
510
516
  例えば、`structobj.field = data` のような場合です。
511
517
 
512
- `buffer` は上位構造のバイナリデータとしての String インスタンスです。
518
+ ``buffer`` はバイナリデータとしての String インスタンスです (※gogyou-0.2.4 からは他のライブラリが提供するポインタオブジェクトである可能性もあります)。
513
519
 
514
- `offset` は上位構造から見た、フィールドの絶対位置をバイト値で表した整数値です。
520
+ ``offset`` はバッファ上における、フィールドの絶対位置をバイト値で表した整数値です。
515
521
 
516
- `data` は代入する値です。
522
+ ``data`` は代入する値です。
517
523
 
518
524
  戻り値は無視されます。
519
525
 
520
- `data` に対してどのような値 (オブジェクト) を受け入れるのかを決定するのは、型情報を定義する側の問題となります。
526
+ ``data`` に対してどのような値 (オブジェクト) を受け入れるのかを決定するのは、型情報を定義する側の問題となります。
521
527
 
522
528
  MD5 の場合、最低でも MD5 インスタンスを受け入れるようにするべきです。
523
529
 
524
- 今回は MD5 インスタンスだけではなく 16バイトの文字列、そして `nil` を受け取れるようにしてみます。
530
+ 今回は MD5 インスタンスだけではなく 16バイトの文字列、そして ``nil`` を受け取れるようにしてみます。
525
531
 
526
- ```ruby:ruby
532
+ ``` ruby:ruby
527
533
  class MD5
528
534
  def self.aset(buffer, offset, data)
529
535
  case data
@@ -532,7 +538,7 @@ class MD5
532
538
  when String
533
539
  buffer.setbinary(offset, data.byteslice(0, 16))
534
540
  when nil
535
- buffer[offset, 16] = ?0 * 16
541
+ buffer.setbinary(offset, ?0 * 16)
536
542
  else
537
543
  raise ArgumentError, "data is not a MD5, String or nil"
538
544
  end
@@ -595,9 +601,88 @@ Z = Gogyou.struct {
595
601
  ```
596
602
 
597
603
 
604
+ ## Use Fiddle::Pointer or FFI::AbstractMemory as buffer object of struct (構造体のバッファオブジェクトとして Fiddle::Pointer や FFI::AbstractMemory を使う)
605
+
606
+ 構造体の実体となるバッファオブジェクトは、文字列だけではなく Fiddle::Pointer や FFI::AbstractMemory インスタンスを指定することも出来ます (gogyou-0.2.4 にて追加)。
607
+
608
+ Fiddle::Pointer を利用する場合は、"gogyou/fiddle" を ``require`` する必要があります。
609
+ この時 ``require "fiddle"`` されていなければ "gogyou/fiddle" の内部で ``require`` されます。
610
+
611
+ あとは作成した構造体に ``bind`` する時、任意の Fiddle::Pointer インスタンスを指定します。
612
+
613
+ ``` ruby:ruby
614
+ require "gogyou/fiddle"
615
+
616
+ ptr = Fiddle::Pointer.malloc(YourStruct.bytesize)
617
+ data = YourStruct.bind(ptr)
618
+ ```
619
+
620
+ 同様に FFI::AbstractMemory (または派生クラス) を利用する場合は、"gogyou/ffi" を ``require`` する必要があります。
621
+ この時 ``require "ffi"`` されていなければ "gogyou/ffi" の内部で ``require`` されます。
622
+
623
+ あとは作成した構造体に ``bind`` する時、任意の FFI::AbstractMemory (または派生クラス) インスタンスを指定します。
624
+
625
+ ``` ruby:ruby
626
+ require "gogyou/ffi"
627
+
628
+ ptr = FFI::MemoryPointer.new(YourStruct.bytesize)
629
+ data = YourStruct.bind(ptr)
630
+ ```
631
+
632
+
598
633
  ## Demerit (短所)
599
634
 
600
635
  * Can't be handled pointer
601
636
  (ポインタが扱えない)
637
+
602
638
  * The cost is high for reference/asignment from/to fields
603
639
  (フィールドに対する参照・代入のコストが高い)
640
+
641
+
642
+ ## Available typenames when definision struct (構造体定義の際に利用できる型名)
643
+
644
+ * C の型名
645
+
646
+ 符号あり 符号なし
647
+ ---- ----
648
+ char 型 char uchar
649
+ unsigned_char
650
+ short 型 short ushort
651
+ unsigned_short
652
+ int 型 int uint
653
+ unsigned_int
654
+ long 型 long ulong
655
+ unsigned_long
656
+ long long 型 longlong ulonglong
657
+ long_long unsigned_long_long
658
+ sizeof 型 ssize_t size_t
659
+ ポインタ整数型 intptr_t uintptr_t
660
+ float float N/A
661
+ double double N/A
662
+
663
+ * バイトオーダー環境依存・ビット数環境非依存
664
+
665
+ バイトオーダー環境依存 バイトオーダー反転
666
+ 符号あり 符号なし 符号あり 符号なし
667
+ ---- ---- ---- ----
668
+ 8ビット整数型 int8_t uint8_t N/A N/A
669
+ 16ビット整数型 int16_t uint16_t int16_swap uint16_swap
670
+ 32ビット整数型 int32_t uint32_t int32_swap uint32_swap
671
+ 64ビット整数型 int64_t uint64_t int64_swap uint64_swap
672
+ 16ビット浮動小数点実数型 float16_t N/A float16_swap N/A
673
+ 32ビット浮動小数点実数型 float32_t N/A float32_swap N/A
674
+ 64ビット浮動小数点実数型 float64_t N/A float64_swap N/A
675
+
676
+ * バイトオーダー・ビット数環境非依存
677
+
678
+ ビッグエンディアン リトルエンディアン
679
+ 符号あり 符号なし 符号あり 符号なし
680
+ ---- ---- ---- ----
681
+ 16ビット整数型 int16_be uint16_be int16_le uint16_le
682
+ 24ビット整数型 int24_be uint24_be int24_le uint24_le
683
+ 32ビット整数型 int32_be uint32_be int32_le uint32_le
684
+ 48ビット整数型 int48_be uint48_be int48_le uint48_le
685
+ 64ビット整数型 int64_be uint64_be int64_le uint64_le
686
+ 16ビット浮動小数点実数型 float16_be N/A float16_le N/A
687
+ 32ビット浮動小数点実数型 float32_be N/A float32_le N/A
688
+ 64ビット浮動小数点実数型 float64_be N/A float64_le N/A
data/Rakefile CHANGED
@@ -29,7 +29,10 @@ GEMSPEC = "#{GEMSTUB.name}.gemspec"
29
29
 
30
30
  GEMSTUB.files += DOC + EXT + EXTCONF + BIN + LIB + SPEC + TEST + EXAMPLE + RAKEFILE + EXTRA
31
31
  GEMSTUB.files.sort!
32
- GEMSTUB.rdoc_options ||= %w(--charset UTF-8)
32
+ if GEMSTUB.rdoc_options.nil? || GEMSTUB.rdoc_options.empty?
33
+ readme = %W(.md .markdown .rd .rdoc .txt #{""}).map { |ext| "README#{ext}" }.find { |m| DOC.find { |n| n == m } }
34
+ GEMSTUB.rdoc_options = %w(--charset UTF-8) + (readme ? %W(-m #{readme}) : [])
35
+ end
33
36
  GEMSTUB.extra_rdoc_files += DOC + LIB + EXT.reject { |n| n.include?("/externals/") || !%w(.h .hh .c .cc .cpp .cxx).include?(File.extname(n)) }
34
37
  GEMSTUB.extra_rdoc_files.sort!
35
38
 
data/gemstub.rb CHANGED
@@ -18,8 +18,8 @@ The C-liked struct, union and multidimensional array definition are posible in r
18
18
  EOS
19
19
  s.license = "2-clause BSD License"
20
20
  s.author = "dearblue"
21
- s.email = "dearblue@users.sourceforge.jp"
22
- s.homepage = "http://sourceforge.jp/projects/rutsubo/"
21
+ s.email = "dearblue@users.osdn.me"
22
+ s.homepage = "https://osdn.jp/projects/rutsubo/"
23
23
 
24
24
  s.required_ruby_version = ">= 2.0"
25
25
  s.add_development_dependency "rspec", "~> 2.14"