yara-normalize 0.2.0 → 0.4.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: f56ffeec6846ec1ae4d2aea3bfa6cc89ca9643d4b31211b39e8381025377a2ff
4
- data.tar.gz: 50aa592ac824fa3ee427f90c8279b92dc79c6dae1c4254b585e54df8c9a31ba3
3
+ metadata.gz: 3a345a64cbb92b8600dbed3abe6c92219d60a0d27bd04a49bc60f9e141023369
4
+ data.tar.gz: a7ee233ae22e1260789397a71ad1926f60d65e86714662b2b1e5a65e2ca27cb0
5
5
  SHA512:
6
- metadata.gz: 6e9513389ae6008ae04f6b9c9ed4940c3ed5e49181930064c3c43fec3772ec7dde919cac1bab5ad7e979b1cdd1146d6e4220273f83131efa368d388f08069137
7
- data.tar.gz: b9d19eb5019b239d877da6b6c42622b98cc214c407a6d4315f87ecd69b81140f42f80f8a2831b5cdf1c708b07caade83e2abe52e60f0bf15aff960707dc1274b
6
+ metadata.gz: a8cb5ab7710807545d146ac7c8d16928296b74dffce0be7963ea815247c8ab3671290c8b236d015ded9dd287eb3b008c8ca4c626279f32440c12b80716b4c9fd
7
+ data.tar.gz: b82a45e72917d4132aa0e6edaa2fac91b162660f8deb88140a05356efbf42ff8e531c786dd674ec31c96231317bef5d9f30c0bd4f1abed7143851b698bf167f9
metadata CHANGED
@@ -1,113 +1,115 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: yara-normalize
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.4.0
5
5
  platform: ruby
6
6
  authors:
7
- - chrislee35
8
- autorequire:
7
+ - Chris Lee
9
8
  bindir: bin
10
9
  cert_chain: []
11
- date: 2022-05-01 00:00:00.000000000 Z
10
+ date: 1980-01-02 00:00:00.000000000 Z
12
11
  dependencies:
12
+ - !ruby/object:Gem::Dependency
13
+ name: test-unit
14
+ requirement: !ruby/object:Gem::Requirement
15
+ requirements:
16
+ - - "~>"
17
+ - !ruby/object:Gem::Version
18
+ version: '3.6'
19
+ type: :development
20
+ prerelease: false
21
+ version_requirements: !ruby/object:Gem::Requirement
22
+ requirements:
23
+ - - "~>"
24
+ - !ruby/object:Gem::Version
25
+ version: '3.6'
13
26
  - !ruby/object:Gem::Dependency
14
27
  name: shoulda
15
28
  requirement: !ruby/object:Gem::Requirement
16
29
  requirements:
17
- - - ">="
30
+ - - "~>"
18
31
  - !ruby/object:Gem::Version
19
32
  version: '4'
20
33
  type: :development
21
34
  prerelease: false
22
35
  version_requirements: !ruby/object:Gem::Requirement
23
36
  requirements:
24
- - - ">="
37
+ - - "~>"
25
38
  - !ruby/object:Gem::Version
26
39
  version: '4'
27
40
  - !ruby/object:Gem::Dependency
28
- name: rdoc
41
+ name: rspec
29
42
  requirement: !ruby/object:Gem::Requirement
30
43
  requirements:
31
44
  - - "~>"
32
45
  - !ruby/object:Gem::Version
33
- version: '6.4'
46
+ version: '3.12'
34
47
  type: :development
35
48
  prerelease: false
36
49
  version_requirements: !ruby/object:Gem::Requirement
37
50
  requirements:
38
51
  - - "~>"
39
52
  - !ruby/object:Gem::Version
40
- version: '6.4'
53
+ version: '3.12'
41
54
  - !ruby/object:Gem::Dependency
42
- name: bundler
55
+ name: rake
43
56
  requirement: !ruby/object:Gem::Requirement
44
57
  requirements:
45
58
  - - "~>"
46
59
  - !ruby/object:Gem::Version
47
- version: '2.3'
60
+ version: '13.3'
48
61
  type: :development
49
62
  prerelease: false
50
63
  version_requirements: !ruby/object:Gem::Requirement
51
64
  requirements:
52
65
  - - "~>"
53
66
  - !ruby/object:Gem::Version
54
- version: '2.3'
67
+ version: '13.3'
55
68
  - !ruby/object:Gem::Dependency
56
- name: jeweler
69
+ name: bundler
57
70
  requirement: !ruby/object:Gem::Requirement
58
71
  requirements:
59
72
  - - "~>"
60
73
  - !ruby/object:Gem::Version
61
- version: 2.3.9
74
+ version: '2.7'
62
75
  type: :development
63
76
  prerelease: false
64
77
  version_requirements: !ruby/object:Gem::Requirement
65
78
  requirements:
66
79
  - - "~>"
67
80
  - !ruby/object:Gem::Version
68
- version: 2.3.9
81
+ version: '2.7'
69
82
  - !ruby/object:Gem::Dependency
70
- name: test-unit
83
+ name: rdoc
71
84
  requirement: !ruby/object:Gem::Requirement
72
85
  requirements:
73
86
  - - "~>"
74
87
  - !ruby/object:Gem::Version
75
- version: 3.5.3
88
+ version: '6.6'
76
89
  type: :development
77
90
  prerelease: false
78
91
  version_requirements: !ruby/object:Gem::Requirement
79
92
  requirements:
80
93
  - - "~>"
81
94
  - !ruby/object:Gem::Version
82
- version: 3.5.3
83
- description: To enable consistent comparisons between yara rules (signature), a uniform
84
- hashing standard was needed.
85
- email: rubygems@chrislee.dhs.org
95
+ version: '6.6'
96
+ description: Provides normalization and hashing utilities for Yara rule comparisons.
97
+ email:
98
+ - rubygems@chrislee.dhs.org
86
99
  executables:
87
100
  - yaratool
88
101
  extensions: []
89
- extra_rdoc_files:
90
- - LICENSE.txt
91
- - README.rdoc
102
+ extra_rdoc_files: []
92
103
  files:
93
- - ".document"
94
- - Gemfile
95
- - Gemfile.lock
96
104
  - LICENSE.txt
97
105
  - README.rdoc
98
- - Rakefile
99
- - VERSION
100
106
  - bin/yaratool
101
107
  - lib/yara-normalize.rb
102
108
  - lib/yara-normalize/yara-normalize.rb
103
- - test/helper.rb
104
- - test/test_yara-normalize.rb
105
- - yara-normalize.gemspec
106
- homepage: http://github.com/chrislee35/yara-normalize
109
+ homepage: https://github.com/chrislee35/yara-normalize
107
110
  licenses:
108
111
  - MIT
109
112
  metadata: {}
110
- post_install_message:
111
113
  rdoc_options: []
112
114
  require_paths:
113
115
  - lib
@@ -115,16 +117,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
115
117
  requirements:
116
118
  - - ">="
117
119
  - !ruby/object:Gem::Version
118
- version: '0'
120
+ version: '3.0'
119
121
  required_rubygems_version: !ruby/object:Gem::Requirement
120
122
  requirements:
121
123
  - - ">="
122
124
  - !ruby/object:Gem::Version
123
125
  version: '0'
124
126
  requirements: []
125
- rubygems_version: 3.2.3
126
- signing_key:
127
+ rubygems_version: 3.7.2
127
128
  specification_version: 4
128
- summary: Normalizes Yara Signatures into a repeatable hash even when non-transforming
129
- changes are made
129
+ summary: Normalizes Yara signatures into a repeatable hash even when non-transforming
130
+ changes are made.
130
131
  test_files: []
data/.document DELETED
@@ -1,5 +0,0 @@
1
- lib/**/*.rb
2
- bin/*
3
- -
4
- features/**/*.feature
5
- LICENSE.txt
data/Gemfile DELETED
@@ -1,14 +0,0 @@
1
- source "http://rubygems.org"
2
- # Add dependencies required to use your gem here.
3
- # Example:
4
- # gem "activesupport", ">= 2.3.5"
5
-
6
- # Add dependencies to develop your gem here.
7
- # Include everything needed to run rake, tests, features, etc.
8
- group :development do
9
- gem "shoulda", ">= 4"
10
- gem "rdoc", "~> 6.4"
11
- gem "bundler", "~> 2.3"
12
- gem "jeweler", "~> 2.3.9"
13
- gem "test-unit", "~> 3.5.3"
14
- end
data/Gemfile.lock DELETED
@@ -1,88 +0,0 @@
1
- GEM
2
- remote: http://rubygems.org/
3
- specs:
4
- activesupport (7.0.2.4)
5
- concurrent-ruby (~> 1.0, >= 1.0.2)
6
- i18n (>= 1.6, < 2)
7
- minitest (>= 5.1)
8
- tzinfo (~> 2.0)
9
- addressable (2.4.0)
10
- builder (3.2.4)
11
- concurrent-ruby (1.1.10)
12
- descendants_tracker (0.0.4)
13
- thread_safe (~> 0.3, >= 0.3.1)
14
- faraday (0.9.2)
15
- multipart-post (>= 1.2, < 3)
16
- git (1.11.0)
17
- rchardet (~> 1.8)
18
- github_api (0.16.0)
19
- addressable (~> 2.4.0)
20
- descendants_tracker (~> 0.0.4)
21
- faraday (~> 0.8, < 0.10)
22
- hashie (>= 3.4)
23
- mime-types (>= 1.16, < 3.0)
24
- oauth2 (~> 1.0)
25
- hashie (5.0.0)
26
- highline (2.0.3)
27
- i18n (1.10.0)
28
- concurrent-ruby (~> 1.0)
29
- jeweler (2.3.9)
30
- builder
31
- bundler
32
- git (>= 1.2.5)
33
- github_api (~> 0.16.0)
34
- highline (>= 1.6.15)
35
- nokogiri (>= 1.5.10)
36
- psych
37
- rake
38
- rdoc
39
- semver2
40
- jwt (2.3.0)
41
- mime-types (2.99.3)
42
- minitest (5.15.0)
43
- multi_json (1.15.0)
44
- multi_xml (0.6.0)
45
- multipart-post (2.1.1)
46
- nokogiri (1.13.4-x86_64-linux)
47
- racc (~> 1.4)
48
- oauth2 (1.4.8)
49
- faraday (>= 0.8, < 3.0)
50
- jwt (>= 1.0, < 3.0)
51
- multi_json (~> 1.3)
52
- multi_xml (~> 0.5)
53
- rack (>= 1.2, < 3)
54
- power_assert (2.0.1)
55
- psych (4.0.3)
56
- stringio
57
- racc (1.6.0)
58
- rack (2.2.3)
59
- rake (13.0.6)
60
- rchardet (1.8.0)
61
- rdoc (6.4.0)
62
- psych (>= 4.0.0)
63
- semver2 (3.4.2)
64
- shoulda (4.0.0)
65
- shoulda-context (~> 2.0)
66
- shoulda-matchers (~> 4.0)
67
- shoulda-context (2.0.0)
68
- shoulda-matchers (4.5.1)
69
- activesupport (>= 4.2.0)
70
- stringio (3.0.1)
71
- test-unit (3.5.3)
72
- power_assert
73
- thread_safe (0.3.6)
74
- tzinfo (2.0.4)
75
- concurrent-ruby (~> 1.0)
76
-
77
- PLATFORMS
78
- x86_64-linux
79
-
80
- DEPENDENCIES
81
- bundler (~> 2.3)
82
- jeweler (~> 2.3.9)
83
- rdoc (~> 6.4)
84
- shoulda (>= 4)
85
- test-unit (~> 3.5.3)
86
-
87
- BUNDLED WITH
88
- 2.3.12
data/Rakefile DELETED
@@ -1,46 +0,0 @@
1
- # encoding: utf-8
2
-
3
- require 'rubygems'
4
- require 'bundler'
5
- begin
6
- Bundler.setup(:default, :development)
7
- rescue Bundler::BundlerError => e
8
- $stderr.puts e.message
9
- $stderr.puts "Run `bundle install` to install missing gems"
10
- exit e.status_code
11
- end
12
- require 'rake'
13
-
14
- require 'jeweler'
15
- Jeweler::Tasks.new do |gem|
16
- # gem is a Gem::Specification... see http://docs.rubygems.org/read/chapter/20 for more options
17
- gem.name = "yara-normalize"
18
- gem.homepage = "http://github.com/chrislee35/yara-normalize"
19
- gem.license = "MIT"
20
- gem.summary = %Q{Normalizes Yara Signatures into a repeatable hash even when non-transforming changes are made}
21
- gem.description = %Q{To enable consistent comparisons between yara rules (signature), a uniform hashing standard was needed.}
22
- gem.email = "rubygems@chrislee.dhs.org"
23
- gem.authors = ["chrislee35"]
24
- #gem.signing_key = "#{File.dirname(__FILE__)}/../gem-private_key.pem"
25
- #gem.cert_chain = ["#{File.dirname(__FILE__)}/../gem-public_cert.pem"]
26
- end
27
- Jeweler::RubygemsDotOrgTasks.new
28
-
29
- require 'rake/testtask'
30
- Rake::TestTask.new(:test) do |test|
31
- test.libs << 'test'
32
- test.pattern = FileList['test/test*.rb']
33
- test.verbose = true
34
- end
35
-
36
- task :default => :test
37
-
38
- require 'rdoc/task'
39
- Rake::RDocTask.new do |rdoc|
40
- version = File.exist?('VERSION') ? File.read('VERSION') : ""
41
-
42
- rdoc.rdoc_dir = 'rdoc'
43
- rdoc.title = "yara-normalize #{version}"
44
- rdoc.rdoc_files.include('README*')
45
- rdoc.rdoc_files.include('lib/**/*.rb')
46
- end
data/VERSION DELETED
@@ -1 +0,0 @@
1
- 0.2.0
data/test/helper.rb DELETED
@@ -1,20 +0,0 @@
1
- require 'rubygems'
2
- require 'bundler'
3
- begin
4
- Bundler.setup(:default, :development)
5
- rescue Bundler::BundlerError => e
6
- $stderr.puts e.message
7
- $stderr.puts "Run `bundle install` to install missing gems"
8
- exit e.status_code
9
- end
10
-
11
- require 'test/unit'
12
- require 'shoulda'
13
-
14
- $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
15
- $LOAD_PATH.unshift(File.dirname(__FILE__))
16
-
17
- require 'yara-normalize'
18
-
19
- class Test::Unit::TestCase
20
- end
@@ -1,113 +0,0 @@
1
- require 'helper'
2
- require 'pp'
3
-
4
- class TestYaraNormalize < Test::Unit::TestCase
5
- should "normalize a simple signature" do
6
- sig =<<EOS
7
- rule newIE0daymshtmlExec
8
- {
9
- meta:
10
- author = "redacted @ gmail.com"
11
- ref = "http://blog.vulnhunt.com/index.php/2012/09/17/ie-execcommand-fuction-use-after-free-vulnerability-0day_en/"
12
- description = "Internet Explorer CMshtmlEd::Exec() 0day"
13
- cve = "CVE-2012-XXXX"
14
- version = "1"
15
- impact = 4
16
- hide = false
17
- strings:
18
- $mshtmlExec_1 = /document\.execCommand\(['"]selectAll['"]\)/ nocase fullword
19
- $mshtmlExec_2 = /YMjf\\u0c08\\u0c0cKDogjsiIejengNEkoPDjfiJDIWUAzdfghjAAuUFGGBSIPPPUDFJKSOQJGH/ nocase fullword
20
- $mshtmlExec_3 = /\<body\son(load|select)=['"]\w*?\(\)\;['"]\son(load|select)=['"]\w*?\(\)['"]/ nocase
21
- $mshtmlExec_4 = /var\s\w{1,}\s=\snew\sArray\(\)/ nocase
22
- $mshtmlExec_5 = /window\.document\.createElement\(['"]img['"]\)/ nocase
23
- $mshtmlExec_6 = /\w{1,}\[0\]\[['"]src['"]\]\s\=\s['"]\w{1,}['"]/ nocase
24
- $mshtmlExec_7 = /\<iframe\ssrc=['"].*?['"]/ nocase
25
- condition:
26
- ($mshtmlExec_1 and $mshtmlExec_2 and $mshtmlExec_3) or ($mshtmlExec_4 and $mshtmlExec_5 and ($mshtmlExec_6 or $mshtmlExec_7))
27
- }
28
- EOS
29
- puts sig
30
- yn = YaraTools::YaraRule.new(sig)
31
- assert_equal("yn01:66dd624d64a79f17:ecf1725295", yn.hash)
32
- assert_equal("newIE0daymshtmlExec", yn.name)
33
- assert_equal("\"redacted @ gmail.com\"", yn.meta['author'])
34
- assert_equal(["$mshtmlExec_1 = /document.execCommand(['\"]selectAll['\"])/ nocase fullword",
35
- "$mshtmlExec_2 = /YMjf\\u0c08\\u0c0cKDogjsiIejengNEkoPDjfiJDIWUAzdfghjAAuUFGGBSIPPPUDFJKSOQJGH/ nocase fullword",
36
- "$mshtmlExec_3 = /<body on(load|select)=['\"]w*?();['\"] on(load|select)=['\"]w*?()['\"]/ nocase",
37
- "$mshtmlExec_4 = /var w{1,} = new Array()/ nocase",
38
- "$mshtmlExec_5 = /window.document.createElement(['\"]img['\"])/ nocase",
39
- "$mshtmlExec_6 = /w{1,}[0][['\"]src['\"]] = ['\"]w{1,}['\"]/ nocase",
40
- "$mshtmlExec_7 = /<iframe src=['\"].*?['\"]/ nocase"], yn.strings)
41
- assert_equal(
42
- ["($mshtmlExec_1 and $mshtmlExec_2 and $mshtmlExec_3) or ($mshtmlExec_4 and $mshtmlExec_5 and ($mshtmlExec_6 or $mshtmlExec_7))"],
43
- yn.condition
44
- )
45
- hash1 = yn.hash
46
- sig =<<EOS
47
- rule newIE0daymshtmlExec : tag1 tag2 tag3
48
- {
49
- meta:
50
- author = "redacted @ gmail.com"
51
- ref = "http://blog.vulnhunt.com/index.php/2012/09/17/ie-execcommand-fuction-use-after-free-vulnerability-0day_en/"
52
- description = "Internet Explorer CMshtmlEd::Exec() 0day"
53
- cve = "CVE-2012-XXXX"
54
- version = "1"
55
- impact = 4
56
- hide = false
57
- strings:
58
- $mshtmlExec_1 = /document\.execCommand\(['"]selectAll['"]\)/ nocase fullword
59
- $mshtmlExec_2 = /YMjf\\u0c08\\u0c0cKDogjsiIejengNEkoPDjfiJDIWUAzdfghjAAuUFGGBSIPPPUDFJKSOQJGH/ nocase fullword
60
- $mshtmlExec_3 = /\<body\son(load|select)=['"]\w*?\(\)\;['"]\son(load|select)=['"]\w*?\(\)['"]/ nocase
61
- $mshtmlExec_4 = /var\s\w{1,}\s=\snew\sArray\(\)/ nocase
62
- $mshtmlExec_5 = /window\.document\.createElement\(['"]img['"]\)/ nocase
63
- $mshtmlExec_6 = /\w{1,}\[0\]\[['"]src['"]\]\s\=\s['"]\w{1,}['"]/ nocase
64
- $mshtmlExec_7 = /\<iframe\ssrc=['"].*?['"]/ nocase
65
- condition:
66
- ($mshtmlExec_1 and $mshtmlExec_2 and $mshtmlExec_3) or ($mshtmlExec_4 and $mshtmlExec_5 and ($mshtmlExec_6 or $mshtmlExec_7))
67
- }
68
- EOS
69
- yn = YaraTools::YaraRule.new(sig)
70
- assert_equal(hash1, yn.hash)
71
- assert_equal("newIE0daymshtmlExec", yn.name)
72
- assert_equal(["tag1","tag2","tag3"], yn.tags)
73
- assert_equal("\"redacted @ gmail.com\"", yn.meta['author'])
74
- assert_equal(["$mshtmlExec_1 = /document.execCommand(['\"]selectAll['\"])/ nocase fullword",
75
- "$mshtmlExec_2 = /YMjf\\u0c08\\u0c0cKDogjsiIejengNEkoPDjfiJDIWUAzdfghjAAuUFGGBSIPPPUDFJKSOQJGH/ nocase fullword",
76
- "$mshtmlExec_3 = /<body on(load|select)=['\"]w*?();['\"] on(load|select)=['\"]w*?()['\"]/ nocase",
77
- "$mshtmlExec_4 = /var w{1,} = new Array()/ nocase",
78
- "$mshtmlExec_5 = /window.document.createElement(['\"]img['\"])/ nocase",
79
- "$mshtmlExec_6 = /w{1,}[0][['\"]src['\"]] = ['\"]w{1,}['\"]/ nocase",
80
- "$mshtmlExec_7 = /<iframe src=['\"].*?['\"]/ nocase"], yn.strings)
81
- assert_equal(
82
- ["($mshtmlExec_1 and $mshtmlExec_2 and $mshtmlExec_3) or ($mshtmlExec_4 and $mshtmlExec_5 and ($mshtmlExec_6 or $mshtmlExec_7))"],
83
- yn.condition
84
- )
85
- end
86
-
87
- should "normalize a simple signature that has a condition of 'any of them'" do
88
- sig =<<EOS
89
- rule DataConversion__wide : IntegerParsing DataConversion {
90
- meta:
91
- weight = 1
92
- strings:
93
- $ = "wtoi" nocase
94
- $ = "wtol" nocase
95
- $ = "wtof" nocase
96
- $ = "wtodb" nocase
97
- condition:
98
- any of them
99
- }
100
- EOS
101
- yn = YaraTools::YaraRule.new(sig)
102
- assert_equal("yn01:a5fd8576f2da34e2:d936fceffe", yn.hash)
103
- assert_equal("1", yn.meta['weight'])
104
- assert_equal("DataConversion__wide", yn.name)
105
- assert_equal(["IntegerParsing", "DataConversion"], yn.tags)
106
- assert_equal(["$ = \"wtoi\" nocase",
107
- "$ = \"wtol\" nocase",
108
- "$ = \"wtof\" nocase",
109
- "$ = \"wtodb\" nocase"], yn.strings)
110
- assert_equal(["any of them"], yn.condition)
111
- end
112
- end
113
-
@@ -1,60 +0,0 @@
1
- # Generated by jeweler
2
- # DO NOT EDIT THIS FILE DIRECTLY
3
- # Instead, edit Jeweler::Tasks in rakefile, and run 'rake gemspec'
4
- # -*- encoding: utf-8 -*-
5
- # stub: yara-normalize 0.2.0 ruby lib
6
-
7
- Gem::Specification.new do |s|
8
- s.name = "yara-normalize".freeze
9
- s.version = "0.2.0"
10
-
11
- s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version=
12
- s.require_paths = ["lib".freeze]
13
- s.authors = ["chrislee35".freeze]
14
- s.date = "2022-05-01"
15
- s.description = "To enable consistent comparisons between yara rules (signature), a uniform hashing standard was needed.".freeze
16
- s.email = "rubygems@chrislee.dhs.org".freeze
17
- s.executables = ["yaratool".freeze]
18
- s.extra_rdoc_files = [
19
- "LICENSE.txt",
20
- "README.rdoc"
21
- ]
22
- s.files = [
23
- ".document",
24
- "Gemfile",
25
- "Gemfile.lock",
26
- "LICENSE.txt",
27
- "README.rdoc",
28
- "Rakefile",
29
- "VERSION",
30
- "bin/yaratool",
31
- "lib/yara-normalize.rb",
32
- "lib/yara-normalize/yara-normalize.rb",
33
- "test/helper.rb",
34
- "test/test_yara-normalize.rb",
35
- "yara-normalize.gemspec"
36
- ]
37
- s.homepage = "http://github.com/chrislee35/yara-normalize".freeze
38
- s.licenses = ["MIT".freeze]
39
- s.rubygems_version = "3.2.3".freeze
40
- s.summary = "Normalizes Yara Signatures into a repeatable hash even when non-transforming changes are made".freeze
41
-
42
- if s.respond_to? :specification_version then
43
- s.specification_version = 4
44
- end
45
-
46
- if s.respond_to? :add_runtime_dependency then
47
- s.add_development_dependency(%q<shoulda>.freeze, [">= 4"])
48
- s.add_development_dependency(%q<rdoc>.freeze, ["~> 6.4"])
49
- s.add_development_dependency(%q<bundler>.freeze, ["~> 2.3"])
50
- s.add_development_dependency(%q<jeweler>.freeze, ["~> 2.3.9"])
51
- s.add_development_dependency(%q<test-unit>.freeze, ["~> 3.5.3"])
52
- else
53
- s.add_dependency(%q<shoulda>.freeze, [">= 4"])
54
- s.add_dependency(%q<rdoc>.freeze, ["~> 6.4"])
55
- s.add_dependency(%q<bundler>.freeze, ["~> 2.3"])
56
- s.add_dependency(%q<jeweler>.freeze, ["~> 2.3.9"])
57
- s.add_dependency(%q<test-unit>.freeze, ["~> 3.5.3"])
58
- end
59
- end
60
-