safedep 0.2.0 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 132ffa3638720d8a67ed227359301f04ccd4e825
4
- data.tar.gz: 9dfcd1b5e931ee79716bea0d5e967d6d034b8537
3
+ metadata.gz: f9a584134a92b66c3998292d52951e55df40452e
4
+ data.tar.gz: fa525a409445338e868b3e75e232d6414288e8e0
5
5
  SHA512:
6
- metadata.gz: b24aadff525f1c319c3c02470ceb20b731f461c908758abbd42369b39381e36a7bf513b71ea62e78ff52b7eef026f2bdd0a230a2ed28b0a8d5693e760cefe38e
7
- data.tar.gz: 3b21b4c4e858c753a1d3e0a37dc96ab35d2c68578b946d8a0b75187a53b1dd95d79e6e57fcc8bccdc9f00cec8bef4983b1ab22ccbfbbb874c9588bc18ae64e22
6
+ metadata.gz: 00bb90cf32c7a0b336129c9221d81487270b4c711e687c659e6d7bbc91ae8ad99850e54bc4aa3e059923f3711f0165e008fb4a80197c1e98218d17b2b0aab74a
7
+ data.tar.gz: 32ea3ddb8ffb4547e7540f79f9a6fee1bdcb2875e960c78916315f8df4feef9541337cb4f405fbf8dc9aa9cff83de686889190df119963f1e9f37e8033e491bb
data/CHANGELOG.md CHANGED
@@ -2,6 +2,8 @@
2
2
 
3
3
  ## Development
4
4
 
5
+ * Use extracted core gem [gemologist](https://github.com/yujinakayama/gemologist) internally.
6
+
5
7
  ## v0.2.0
6
8
 
7
9
  * Skip modification of dependencies that have `:git`, `:github` or `:path` option.
data/README.md CHANGED
@@ -10,7 +10,7 @@
10
10
 
11
11
  * [Using >= Considered Harmful (or, What’s Wrong With >=) « Katz Got Your Tongue?](http://yehudakatz.com/2010/08/21/using-considered-harmful-or-whats-wrong-with/)
12
12
 
13
- Version specifier with `>=` is considered harmful, then dependencies without version speicifier must be super harmful. :)
13
+ Version specifier with `>=` is considered harmful, then dependencies without version specifier must be super harmful. :)
14
14
 
15
15
  ## Example
16
16
 
@@ -1,31 +1,15 @@
1
+ require 'gemologist/gemfile_lock'
1
2
  require 'bundler'
2
3
  require 'ostruct'
3
4
 
4
5
  module Safedep
5
- class GemfileLock
6
- attr_reader :path
7
-
8
- def initialize(path)
9
- @path = path
10
- end
11
-
12
- def find_dependency(name)
13
- dependencies.find { |dep| dep.name == name }
14
- end
15
-
6
+ class GemfileLock < Gemologist::GemfileLock
16
7
  def dependencies
17
8
  @dependencies ||= lockfile.specs + [bundler_dependency]
18
9
  end
19
10
 
20
11
  private
21
12
 
22
- def lockfile
23
- @lockfile ||= begin
24
- content = File.read(path)
25
- Bundler::LockfileParser.new(content)
26
- end
27
- end
28
-
29
13
  def bundler_dependency
30
14
  OpenStruct.new(name: 'bundler', version: Bundler::VERSION)
31
15
  end
@@ -1,9 +1,8 @@
1
1
  require 'safedep/configuration'
2
- require 'safedep/gemspec'
3
- require 'safedep/gemfile'
2
+ require 'safedep/error'
4
3
  require 'safedep/gemfile_lock'
5
4
  require 'safedep/policy/sem_ver'
6
- require 'safedep/error'
5
+ require 'gemologist'
7
6
 
8
7
  module Safedep
9
8
  class Runner
@@ -51,27 +50,31 @@ module Safedep
51
50
  def gemspec
52
51
  @gemspec ||= begin
53
52
  path = Dir['*.gemspec'].first
54
- Gemspec.new(path) if path
53
+ Gemologist::Gemspec.new(path) if path
55
54
  end
56
55
  end
57
56
 
58
57
  def gemfile
59
58
  @gemfile ||= begin
60
- fail Error, "#{GEMFILE_PATH} is not found." unless File.exist?(GEMFILE_PATH)
61
- Gemfile.new(GEMFILE_PATH)
59
+ check_file_existence!(GEMFILE_PATH)
60
+ Gemologist::Gemfile.new(GEMFILE_PATH)
62
61
  end
63
62
  end
64
63
 
65
64
  def gemfile_lock
66
65
  @gemfile_lock ||= begin
67
- unless File.exist?(GEMFILE_LOCK_PATH)
68
- fail Error, "#{GEMFILE_LOCK_PATH} is not found. Please run `bundle install`."
69
- end
70
-
71
- GemfileLock.new(GEMFILE_LOCK_PATH)
66
+ check_file_existence!(GEMFILE_LOCK_PATH, 'Please run `bundle install`.')
67
+ Safedep::GemfileLock.new(GEMFILE_LOCK_PATH)
72
68
  end
73
69
  end
74
70
 
71
+ def check_file_existence!(path, additional_message = nil)
72
+ return if File.exist?(path)
73
+ message = "#{path} is not found."
74
+ message << ' ' + additional_message if additional_message
75
+ fail Error, message
76
+ end
77
+
75
78
  def should_ignore?(dependency)
76
79
  return true unless dependency.version_specifiers.empty?
77
80
  return true unless (dependency.groups & configuration.skipped_groups).empty?
@@ -2,7 +2,7 @@ module Safedep
2
2
  # http://semver.org/
3
3
  module Version
4
4
  MAJOR = 0
5
- MINOR = 2
5
+ MINOR = 3
6
6
  PATCH = 0
7
7
 
8
8
  def self.to_s
data/safedep.gemspec CHANGED
@@ -19,7 +19,6 @@ Gem::Specification.new do |spec|
19
19
  spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
20
20
  spec.require_paths = ['lib']
21
21
 
22
- spec.add_runtime_dependency 'parser', '~> 2.2'
23
- spec.add_runtime_dependency 'astrolabe', '~> 1.3'
24
22
  spec.add_runtime_dependency 'bundler', '~> 1.7'
23
+ spec.add_runtime_dependency 'gemologist', '~> 0.1'
25
24
  end
@@ -60,9 +60,9 @@ module Safedep
60
60
 
61
61
  context 'when a dependency specified in Gemfile does not exist in Gemfile.lock', :gemfile, :lockfile do
62
62
  let!(:lockfile) do
63
- require 'safedep/gemfile_lock'
63
+ require 'gemologist/gemfile_lock'
64
64
  create_file(lockfile_path, invalid_lockfile_source)
65
- Safedep::GemfileLock.new(lockfile_path)
65
+ Gemologist::GemfileLock.new(lockfile_path)
66
66
  end
67
67
 
68
68
  let(:invalid_lockfile_source) { lockfile_source.gsub(/.*rspec.*\n/, '') }
@@ -72,6 +72,27 @@ module Safedep
72
72
  end
73
73
  end
74
74
 
75
+ context 'when bundler dependency is specified in gemspec', :gemfile, :lockfile do
76
+ let!(:gemspec) do
77
+ require 'gemologist/gemspec'
78
+ create_file(gemspec_path, gemspec_source)
79
+ Gemologist::Gemspec.new(gemspec_path)
80
+ end
81
+
82
+ let(:gemspec_path) { 'safedep.gemspec' }
83
+
84
+ let(:gemspec_source) { <<-END.strip_indent }
85
+ Gem::Specification.new do |spec|
86
+ spec.name = 'safedep'
87
+ spec.add_runtime_dependency 'bundler'
88
+ end
89
+ END
90
+
91
+ it 'does not raise error' do
92
+ expect { runner.run }.not_to raise_error
93
+ end
94
+ end
95
+
75
96
  context 'when Configuration#skipped_groups is specified', :gemspec, :gemfile, :lockfile do
76
97
  before do
77
98
  configuration.skipped_groups = ['development']
@@ -12,9 +12,9 @@ end
12
12
 
13
13
  shared_context 'with gemspec', :gemspec do
14
14
  let!(:gemspec) do
15
- require 'safedep/gemspec'
15
+ require 'gemologist/gemspec'
16
16
  create_file(gemspec_path, gemspec_source)
17
- Safedep::Gemspec.new(gemspec_path)
17
+ Gemologist::Gemspec.new(gemspec_path)
18
18
  end
19
19
 
20
20
  let(:gemspec_path) { 'safedep.gemspec' }
@@ -32,9 +32,9 @@ end
32
32
 
33
33
  shared_context 'with Gemfile', :gemfile do
34
34
  let!(:gemfile) do
35
- require 'safedep/gemfile'
35
+ require 'gemologist/gemfile'
36
36
  create_file(gemfile_path, gemfile_source)
37
- Safedep::Gemfile.new(gemfile_path)
37
+ Gemologist::Gemfile.new(gemfile_path)
38
38
  end
39
39
 
40
40
  let(:gemfile_path) { 'Gemfile' }
@@ -56,9 +56,9 @@ end
56
56
 
57
57
  shared_context 'with Gemfile.lock', :lockfile do
58
58
  let!(:lockfile) do
59
- require 'safedep/gemfile_lock'
59
+ require 'gemologist/gemfile_lock'
60
60
  create_file(lockfile_path, lockfile_source)
61
- Safedep::GemfileLock.new(lockfile_path)
61
+ Gemologist::GemfileLock.new(lockfile_path)
62
62
  end
63
63
 
64
64
  let(:lockfile_path) { 'Gemfile.lock' }
metadata CHANGED
@@ -1,57 +1,43 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: safedep
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Yuji Nakayama
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-01-11 00:00:00.000000000 Z
11
+ date: 2015-04-18 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- name: parser
15
- requirement: !ruby/object:Gem::Requirement
16
- requirements:
17
- - - "~>"
18
- - !ruby/object:Gem::Version
19
- version: '2.2'
20
- type: :runtime
21
- prerelease: false
22
- version_requirements: !ruby/object:Gem::Requirement
23
- requirements:
24
- - - "~>"
25
- - !ruby/object:Gem::Version
26
- version: '2.2'
27
- - !ruby/object:Gem::Dependency
28
- name: astrolabe
14
+ name: bundler
29
15
  requirement: !ruby/object:Gem::Requirement
30
16
  requirements:
31
17
  - - "~>"
32
18
  - !ruby/object:Gem::Version
33
- version: '1.3'
19
+ version: '1.7'
34
20
  type: :runtime
35
21
  prerelease: false
36
22
  version_requirements: !ruby/object:Gem::Requirement
37
23
  requirements:
38
24
  - - "~>"
39
25
  - !ruby/object:Gem::Version
40
- version: '1.3'
26
+ version: '1.7'
41
27
  - !ruby/object:Gem::Dependency
42
- name: bundler
28
+ name: gemologist
43
29
  requirement: !ruby/object:Gem::Requirement
44
30
  requirements:
45
31
  - - "~>"
46
32
  - !ruby/object:Gem::Version
47
- version: '1.7'
33
+ version: '0.1'
48
34
  type: :runtime
49
35
  prerelease: false
50
36
  version_requirements: !ruby/object:Gem::Requirement
51
37
  requirements:
52
38
  - - "~>"
53
39
  - !ruby/object:Gem::Version
54
- version: '1.7'
40
+ version: '0.1'
55
41
  description: Make your Gemfile safe by adding dependency version specifiers automatically.
56
42
  email:
57
43
  - nkymyj@gmail.com
@@ -71,31 +57,17 @@ files:
71
57
  - README.md
72
58
  - Rakefile
73
59
  - bin/safedep
74
- - lib/safedep/abstract_dependency.rb
75
- - lib/safedep/abstract_gemfile.rb
76
60
  - lib/safedep/cli.rb
77
61
  - lib/safedep/cli/option_parser.rb
78
62
  - lib/safedep/configuration.rb
79
63
  - lib/safedep/error.rb
80
- - lib/safedep/gemfile.rb
81
- - lib/safedep/gemfile/dependency.rb
82
64
  - lib/safedep/gemfile_lock.rb
83
- - lib/safedep/gemspec.rb
84
- - lib/safedep/gemspec/dependency.rb
85
- - lib/safedep/literal.rb
86
65
  - lib/safedep/policy/sem_ver.rb
87
66
  - lib/safedep/runner.rb
88
- - lib/safedep/util.rb
89
67
  - lib/safedep/version.rb
90
68
  - safedep.gemspec
91
69
  - spec/.rubocop.yml
92
70
  - spec/safedep/cli_spec.rb
93
- - spec/safedep/gemfile/dependency_spec.rb
94
- - spec/safedep/gemfile_lock_spec.rb
95
- - spec/safedep/gemfile_spec.rb
96
- - spec/safedep/gemspec/dependency_spec.rb
97
- - spec/safedep/gemspec_spec.rb
98
- - spec/safedep/literal_spec.rb
99
71
  - spec/safedep/policy/sem_ver_spec.rb
100
72
  - spec/safedep/runner_spec.rb
101
73
  - spec/spec_helper.rb
@@ -121,19 +93,13 @@ required_rubygems_version: !ruby/object:Gem::Requirement
121
93
  version: '0'
122
94
  requirements: []
123
95
  rubyforge_project:
124
- rubygems_version: 2.4.5
96
+ rubygems_version: 2.4.6
125
97
  signing_key:
126
98
  specification_version: 4
127
99
  summary: Make your Gemfile safe by adding dependency version specifiers automatically.
128
100
  test_files:
129
101
  - spec/.rubocop.yml
130
102
  - spec/safedep/cli_spec.rb
131
- - spec/safedep/gemfile/dependency_spec.rb
132
- - spec/safedep/gemfile_lock_spec.rb
133
- - spec/safedep/gemfile_spec.rb
134
- - spec/safedep/gemspec/dependency_spec.rb
135
- - spec/safedep/gemspec_spec.rb
136
- - spec/safedep/literal_spec.rb
137
103
  - spec/safedep/policy/sem_ver_spec.rb
138
104
  - spec/safedep/runner_spec.rb
139
105
  - spec/spec_helper.rb
@@ -1,80 +0,0 @@
1
- require 'safedep/literal'
2
-
3
- module Safedep
4
- class AbstractDependency
5
- attr_reader :node, :rewriter
6
-
7
- def self.valid_node?(node)
8
- return false unless node.send_type?
9
- _receiver_node, message, name_node, = *node
10
- method_names.include?(message) && name_node.str_type?
11
- end
12
-
13
- def self.method_names
14
- fail NotImplementedError
15
- end
16
-
17
- def initialize(node, rewriter)
18
- fail 'Invalid node.' unless self.class.valid_node?(node)
19
- @node = node
20
- @rewriter = rewriter
21
- end
22
-
23
- def name
24
- name_node.children.first
25
- end
26
-
27
- def groups
28
- fail NotImplementedError
29
- end
30
-
31
- def version_specifiers
32
- @version_specifiers ||= version_nodes.map { |node| Literal.value(node) }.flatten
33
- end
34
-
35
- def version_specifiers=(*specifiers)
36
- source = specifiers.flatten.map { |specifier| "'#{specifier}'" }.join(', ')
37
-
38
- if version_nodes.empty?
39
- rewriter.insert_after(name_node.loc.expression, ", #{source}")
40
- else
41
- rewriter.replace(version_range, source)
42
- end
43
- end
44
-
45
- def options
46
- {}
47
- end
48
-
49
- private
50
-
51
- def method_name
52
- node.children[1]
53
- end
54
-
55
- def name_node
56
- node.children[2]
57
- end
58
-
59
- def trailing_nodes
60
- node.children[3..-1]
61
- end
62
-
63
- def version_nodes
64
- fail NotImplementedError
65
- end
66
-
67
- def version_range
68
- version_nodes.first.loc.expression.join(version_nodes.last.loc.expression)
69
- end
70
-
71
- def content_range_of_str_node(str_node)
72
- map = str_node.loc
73
- Parser::Source::Range.new(
74
- map.expression.source_buffer,
75
- map.begin.end_pos,
76
- map.end.begin_pos
77
- )
78
- end
79
- end
80
- end
@@ -1,50 +0,0 @@
1
- require 'astrolabe/builder'
2
- require 'parser/current'
3
-
4
- module Safedep
5
- class AbstractGemfile
6
- attr_reader :path
7
-
8
- def initialize(path)
9
- @path = path
10
- end
11
-
12
- def find_dependency(name)
13
- dependencies.find { |dep| dep.name == name }
14
- end
15
-
16
- def dependencies
17
- @dependencies ||= ast.each_node.with_object([]) do |node, dependencies|
18
- next unless dependency_class.valid_node?(node)
19
- dependencies << dependency_class.new(node, source_rewriter)
20
- end
21
- end
22
-
23
- def rewrite!
24
- rewritten_source = source_rewriter.process
25
- File.write(path, rewritten_source)
26
- end
27
-
28
- private
29
-
30
- def dependency_class
31
- fail NotImplementedError
32
- end
33
-
34
- def ast
35
- @ast ||= begin
36
- builder = Astrolabe::Builder.new
37
- parser = Parser::CurrentRuby.new(builder)
38
- parser.parse(source_buffer)
39
- end
40
- end
41
-
42
- def source_rewriter
43
- @source_rewriter ||= Parser::Source::Rewriter.new(source_buffer)
44
- end
45
-
46
- def source_buffer
47
- @source_buffer ||= Parser::Source::Buffer.new(path).read
48
- end
49
- end
50
- end
@@ -1,61 +0,0 @@
1
- require 'safedep/abstract_dependency'
2
- require 'safedep/util'
3
- require 'astrolabe/sexp'
4
-
5
- module Safedep
6
- class Gemfile
7
- class Dependency < AbstractDependency
8
- include Util, Astrolabe::Sexp
9
-
10
- METHOD_NAMES = [:gem].freeze
11
-
12
- def self.method_names
13
- METHOD_NAMES
14
- end
15
-
16
- def groups
17
- @groups ||= (groups_via_block + groups_via_option).map(&:to_sym)
18
- end
19
-
20
- def options
21
- @options ||= symbolize_keys(Literal.value(options_node) || {})
22
- end
23
-
24
- private
25
-
26
- def groups_via_block
27
- return [] unless group_node
28
- _receiver_node, _message, *arg_nodes = *group_node
29
- arg_nodes.map { |node| Literal.value(node) }
30
- end
31
-
32
- def groups_via_option
33
- Array(options[:group])
34
- end
35
-
36
- # https://github.com/bundler/bundler/blob/v1.7.11/lib/bundler/dsl.rb#L68-L70
37
- def version_nodes
38
- @version_nodes ||= trailing_nodes - [options_node]
39
- end
40
-
41
- def options_node
42
- node = trailing_nodes.last
43
-
44
- if node && node.hash_type?
45
- node
46
- else
47
- nil
48
- end
49
- end
50
-
51
- def group_node
52
- candidates = node.each_ancestor(:block).map { |block_node| block_node.children.first }
53
-
54
- candidates.find do |send_node|
55
- receiver_node, message, = *send_node
56
- receiver_node.nil? && message == :group
57
- end
58
- end
59
- end
60
- end
61
- end
@@ -1,13 +0,0 @@
1
- require 'safedep/abstract_gemfile'
2
-
3
- module Safedep
4
- class Gemfile < AbstractGemfile
5
- require 'safedep/gemfile/dependency'
6
-
7
- private
8
-
9
- def dependency_class
10
- Gemfile::Dependency
11
- end
12
- end
13
- end
@@ -1,32 +0,0 @@
1
- require 'safedep/abstract_dependency'
2
- require 'safedep/util'
3
-
4
- module Safedep
5
- class Gemspec
6
- class Dependency < AbstractDependency
7
- include Util
8
-
9
- METHOD_NAMES = [:add_runtime_dependency, :add_development_dependency, :add_dependency].freeze
10
-
11
- def self.method_names
12
- METHOD_NAMES
13
- end
14
-
15
- def groups
16
- case method_name
17
- when :add_development_dependency
18
- [:development]
19
- else
20
- []
21
- end
22
- end
23
-
24
- private
25
-
26
- # https://github.com/rubygems/rubygems/blob/v2.4.5/lib/rubygems/specification.rb#L449-L473
27
- def version_nodes
28
- trailing_nodes
29
- end
30
- end
31
- end
32
- end
@@ -1,13 +0,0 @@
1
- require 'safedep/abstract_gemfile'
2
-
3
- module Safedep
4
- class Gemspec < AbstractGemfile
5
- require 'safedep/gemspec/dependency'
6
-
7
- private
8
-
9
- def dependency_class
10
- Gemspec::Dependency
11
- end
12
- end
13
- end
@@ -1,48 +0,0 @@
1
- module Safedep
2
- module Literal
3
- module_function
4
-
5
- def value(node)
6
- concretize(node)
7
- end
8
-
9
- def concretize(node) # rubocop:disable CyclomaticComplexity
10
- return nil unless node
11
-
12
- case node.type
13
- when :true then true
14
- when :false then false
15
- when :nil then nil
16
- when :int, :float, :str, :sym then node.children.first
17
- when :regexp then concretize_regexp(node)
18
- when :array then concretize_array(node)
19
- when :hash then concretize_hash(node)
20
- when :irange, :erange then concretize_range(node)
21
- end
22
- end
23
-
24
- def concretize_regexp(regexp_node)
25
- str_node, *_interporated_nodes, regopt_node = *regexp_node
26
- string = str_node.children.first
27
- options = regopt_node.children.map(&:to_s).reduce(:+)
28
- eval("/#{string}/#{options}") # rubocop:disable Eval
29
- end
30
-
31
- def concretize_array(array_node)
32
- array_node.children.map { |child_node| concretize(child_node) }
33
- end
34
-
35
- def concretize_hash(hash_node)
36
- hash_node.children.each_with_object({}) do |pair_node, hash|
37
- key_node, value_node = *pair_node
38
- key = concretize(key_node)
39
- hash[key] = concretize(value_node) if key
40
- end
41
- end
42
-
43
- def concretize_range(range_node)
44
- values = range_node.children.map { |child_node| concretize(child_node) }
45
- Range.new(*values, range_node.type == :erange)
46
- end
47
- end
48
- end
data/lib/safedep/util.rb DELETED
@@ -1,16 +0,0 @@
1
- module Safedep
2
- module Util
3
- module_function
4
-
5
- def symbolize_keys(original_hash)
6
- hash = original_hash.dup
7
-
8
- original_hash.each do |key, value|
9
- hash[key] = symbolize_keys(value) if value.is_a?(Hash)
10
- hash[key.to_sym] = hash.delete(key) if key.is_a?(String)
11
- end
12
-
13
- hash
14
- end
15
- end
16
- end
@@ -1,231 +0,0 @@
1
- require 'safedep/gemfile'
2
-
3
- module Safedep
4
- class Gemfile
5
- describe Dependency, :gemfile do
6
- include FileHelper
7
- include_context 'isolated environment'
8
-
9
- let(:gemfile_source) { <<-END.strip_indent }
10
- source 'https://rubygems.org'
11
-
12
- gemspec
13
-
14
- group :development, :test do
15
- gem 'rake'
16
- gem 'rspec', '~> 3.1'
17
- gem 'rubocop', require: false
18
- end
19
-
20
- group :development do
21
- gem 'guard', '>= 2.1', '< 3.0'
22
- end
23
- END
24
-
25
- describe '#name' do
26
- let(:dependency) { gemfile.dependencies.first }
27
-
28
- it 'returns the name of the gem' do
29
- expect(dependency.name).to eq('rake')
30
- end
31
- end
32
-
33
- describe '#groups' do
34
- subject { dependency.groups }
35
-
36
- let(:gemfile_source) { <<-END.strip_indent }
37
- source 'https://rubygems.org'
38
-
39
- gem 'parser'
40
-
41
- group :development, :test do
42
- gem 'rake'
43
- end
44
-
45
- group :development do
46
- gem 'guard'
47
- gem 'rubocop', group: :test
48
- end
49
-
50
- group 'development' do
51
- gem 'fuubar'
52
- end
53
-
54
- gem 'rspec', 'group' => [:test, :development]
55
- END
56
-
57
- context 'when the dependency is specified in top level' do
58
- let(:dependency) { gemfile.find_dependency('parser') }
59
- it { should be_empty }
60
- end
61
-
62
- context 'when the dependency is specified in :development block' do
63
- let(:dependency) { gemfile.find_dependency('guard') }
64
- it { should eq([:development]) }
65
- end
66
-
67
- context 'when the dependency is specified in "development" block' do
68
- let(:dependency) { gemfile.find_dependency('fuubar') }
69
- it { should eq([:development]) }
70
- end
71
-
72
- context 'when the dependency is specified in :development and :test group' do
73
- let(:dependency) { gemfile.find_dependency('rake') }
74
- it { should eq([:development, :test]) }
75
- end
76
-
77
- context 'when the dependency is specified with group: [:test, :development] option' do
78
- let(:dependency) { gemfile.find_dependency('rspec') }
79
- it { should eq([:test, :development]) }
80
- end
81
-
82
- context 'when the dependency is specified with group: :test option in :development group' do
83
- let(:dependency) { gemfile.find_dependency('rubocop') }
84
- it { should eq([:development, :test]) }
85
- end
86
- end
87
-
88
- describe '#version_specifiers' do
89
- subject(:version_specifiers) { dependency.version_specifiers }
90
-
91
- context 'when the dependency has a version specifier' do
92
- let(:dependency) { gemfile.find_dependency('rspec') }
93
-
94
- it 'returns the specifier' do
95
- expect(version_specifiers).to eq(['~> 3.1'])
96
- end
97
- end
98
-
99
- context 'when the dependency has multiple specifiers' do
100
- let(:dependency) { gemfile.find_dependency('guard') }
101
-
102
- it 'returns the specifiers' do
103
- expect(version_specifiers).to eq(['>= 2.1', '< 3.0'])
104
- end
105
- end
106
-
107
- context 'when the dependency has no version specifier' do
108
- context 'and has no options' do
109
- let(:dependency) { gemfile.find_dependency('rake') }
110
- it { should be_empty }
111
- end
112
-
113
- context 'but has options' do
114
- let(:dependency) { gemfile.find_dependency('rubocop') }
115
- it { should be_empty }
116
- end
117
- end
118
- end
119
-
120
- describe '#version_specifiers=' do
121
- let(:rewritten_source) { File.read(gemfile.path) }
122
-
123
- context 'when the dependency has a version specifier' do
124
- let(:dependency) { gemfile.find_dependency('rspec') }
125
-
126
- let(:expected_source) { <<-END.strip_indent }
127
- source 'https://rubygems.org'
128
-
129
- gemspec
130
-
131
- group :development, :test do
132
- gem 'rake'
133
- gem 'rspec', '> 4.0'
134
- gem 'rubocop', require: false
135
- end
136
-
137
- group :development do
138
- gem 'guard', '>= 2.1', '< 3.0'
139
- end
140
- END
141
-
142
- it 'replaces the existing specifier with the passed specifier' do
143
- dependency.version_specifiers = '> 4.0'
144
- gemfile.rewrite!
145
- expect(rewritten_source).to eq(expected_source)
146
- end
147
- end
148
-
149
- context 'when the dependency has no version specifier' do
150
- context 'and has no options' do
151
- let(:dependency) { gemfile.find_dependency('rake') }
152
-
153
- let(:expected_source) { <<-END.strip_indent }
154
- source 'https://rubygems.org'
155
-
156
- gemspec
157
-
158
- group :development, :test do
159
- gem 'rake', '~> 10.1'
160
- gem 'rspec', '~> 3.1'
161
- gem 'rubocop', require: false
162
- end
163
-
164
- group :development do
165
- gem 'guard', '>= 2.1', '< 3.0'
166
- end
167
- END
168
-
169
- it 'adds the passed specifier' do
170
- dependency.version_specifiers = '~> 10.1'
171
- gemfile.rewrite!
172
- expect(rewritten_source).to eq(expected_source)
173
- end
174
- end
175
-
176
- context 'but has options' do
177
- let(:dependency) { gemfile.find_dependency('rubocop') }
178
-
179
- let(:expected_source) { <<-END.strip_indent }
180
- source 'https://rubygems.org'
181
-
182
- gemspec
183
-
184
- group :development, :test do
185
- gem 'rake'
186
- gem 'rspec', '~> 3.1'
187
- gem 'rubocop', '~> 0.28', require: false
188
- end
189
-
190
- group :development do
191
- gem 'guard', '>= 2.1', '< 3.0'
192
- end
193
- END
194
-
195
- it 'adds the passed specifier' do
196
- dependency.version_specifiers = '~> 0.28'
197
- gemfile.rewrite!
198
- expect(rewritten_source).to eq(expected_source)
199
- end
200
- end
201
- end
202
-
203
- context 'when multiple specifiers are passed' do
204
- let(:dependency) { gemfile.find_dependency('rspec') }
205
-
206
- let(:expected_source) { <<-END.strip_indent }
207
- source 'https://rubygems.org'
208
-
209
- gemspec
210
-
211
- group :development, :test do
212
- gem 'rake'
213
- gem 'rspec', '>= 4.0', '< 5.0'
214
- gem 'rubocop', require: false
215
- end
216
-
217
- group :development do
218
- gem 'guard', '>= 2.1', '< 3.0'
219
- end
220
- END
221
-
222
- it 'replaces the existing specifier with the passed specifiers' do
223
- dependency.version_specifiers = ['>= 4.0', '< 5.0']
224
- gemfile.rewrite!
225
- expect(rewritten_source).to eq(expected_source)
226
- end
227
- end
228
- end
229
- end
230
- end
231
- end
@@ -1,29 +0,0 @@
1
- require 'safedep/gemfile_lock'
2
-
3
- module Safedep
4
- describe GemfileLock, :lockfile do
5
- include FileHelper
6
- include_context 'isolated environment'
7
-
8
- describe '#find_dependency' do
9
- it 'returns the dependency matching the passed name' do
10
- dependency = lockfile.find_dependency('rspec')
11
- expect(dependency.name).to eq('rspec')
12
- end
13
- end
14
-
15
- describe '#dependencies' do
16
- let(:dep_names) { lockfile.dependencies.map(&:name) }
17
-
18
- it 'returns an array of the specifications' do
19
- expect(dep_names).to include('rake', 'rspec', 'rubocop')
20
- end
21
-
22
- it 'includes "bundler" dependency' do
23
- dependency = lockfile.find_dependency('bundler')
24
- expect(dependency.name).to eq('bundler')
25
- expect(dependency.version).to eq(Bundler::VERSION)
26
- end
27
- end
28
- end
29
- end
@@ -1,22 +0,0 @@
1
- require 'safedep/gemfile'
2
-
3
- module Safedep
4
- describe Gemfile, :gemfile do
5
- include FileHelper
6
- include_context 'isolated environment'
7
-
8
- describe '#find_dependency' do
9
- it 'returns the dependency matching the passed name' do
10
- dependency = gemfile.find_dependency('rspec')
11
- expect(dependency.name).to eq('rspec')
12
- end
13
- end
14
-
15
- describe '#dependencies' do
16
- it 'returns an array of the dependencies' do
17
- expect(gemfile.dependencies.size).to eq(3)
18
- expect(gemfile.dependencies).to all be_a(Gemfile::Dependency)
19
- end
20
- end
21
- end
22
- end
@@ -1,184 +0,0 @@
1
- require 'safedep/gemspec'
2
-
3
- module Safedep
4
- class Gemspec
5
- describe Dependency, :gemspec do
6
- include FileHelper
7
- include_context 'isolated environment'
8
-
9
- let(:gemspec_source) { <<-END.strip_indent }
10
- Gem::Specification.new do |spec|
11
- spec.name = 'safedep'
12
- spec.add_dependency 'parser'
13
- spec.add_runtime_dependency 'bundler', '>= 1.3.1', '< 2.0'
14
- spec.add_runtime_dependency 'astrolabe', ['>= 1.3', '< 2.0']
15
- spec.add_development_dependency 'rspec', '~> 3.1'
16
- end
17
- END
18
-
19
- describe '#name' do
20
- let(:dependency) { gemspec.dependencies.first }
21
-
22
- it 'returns the name of the gem' do
23
- expect(dependency.name).to eq('parser')
24
- end
25
- end
26
-
27
- describe '#groups' do
28
- subject { dependency.groups }
29
-
30
- context 'when the dependency is specified via #add_dependency' do
31
- let(:dependency) { gemspec.find_dependency('parser') }
32
- it { should be_empty }
33
- end
34
-
35
- context 'when the dependency is specified via #add_runtime_dependency' do
36
- let(:dependency) { gemspec.find_dependency('astrolabe') }
37
- it { should be_empty }
38
- end
39
-
40
- context 'when the dependency is specified via #add_runtime_dependency' do
41
- let(:dependency) { gemspec.find_dependency('rspec') }
42
- it { should eq([:development]) }
43
- end
44
- end
45
-
46
- describe '#version_specifiers' do
47
- subject(:version_specifier) { dependency.version_specifiers }
48
-
49
- context 'when the dependency has no version specifier' do
50
- let(:dependency) { gemspec.find_dependency('parser') }
51
- it { should be_empty }
52
- end
53
-
54
- context 'when the dependency has a version specifier' do
55
- let(:dependency) { gemspec.find_dependency('rspec') }
56
-
57
- it 'returns the specifier' do
58
- expect(version_specifier).to eq(['~> 3.1'])
59
- end
60
- end
61
-
62
- context 'when the dependency has multiple version specifiers' do
63
- let(:dependency) { gemspec.find_dependency('bundler') }
64
-
65
- it 'returns the specifiers' do
66
- expect(version_specifier).to eq(['>= 1.3.1', '< 2.0'])
67
- end
68
- end
69
-
70
- context 'when the dependency has multiple version specifiers in an array' do
71
- let(:dependency) { gemspec.find_dependency('astrolabe') }
72
-
73
- it 'returns the specifiers' do
74
- expect(version_specifier).to eq(['>= 1.3', '< 2.0'])
75
- end
76
- end
77
- end
78
-
79
- describe '#version_specifiers=' do
80
- let(:rewritten_source) { File.read(gemspec.path) }
81
-
82
- context 'when the dependency has no version specifier' do
83
- let(:dependency) { gemspec.find_dependency('parser') }
84
-
85
- let(:expected_source) { <<-END.strip_indent }
86
- Gem::Specification.new do |spec|
87
- spec.name = 'safedep'
88
- spec.add_dependency 'parser', '~> 2.2'
89
- spec.add_runtime_dependency 'bundler', '>= 1.3.1', '< 2.0'
90
- spec.add_runtime_dependency 'astrolabe', ['>= 1.3', '< 2.0']
91
- spec.add_development_dependency 'rspec', '~> 3.1'
92
- end
93
- END
94
-
95
- it 'adds the passed specifier' do
96
- dependency.version_specifiers = '~> 2.2'
97
- gemspec.rewrite!
98
- expect(rewritten_source).to eq(expected_source)
99
- end
100
- end
101
-
102
- context 'when the dependency has a version specifier' do
103
- let(:dependency) { gemspec.find_dependency('rspec') }
104
-
105
- let(:expected_source) { <<-END.strip_indent }
106
- Gem::Specification.new do |spec|
107
- spec.name = 'safedep'
108
- spec.add_dependency 'parser'
109
- spec.add_runtime_dependency 'bundler', '>= 1.3.1', '< 2.0'
110
- spec.add_runtime_dependency 'astrolabe', ['>= 1.3', '< 2.0']
111
- spec.add_development_dependency 'rspec', '> 4.0'
112
- end
113
- END
114
-
115
- it 'replaces the existing specifier with the passed specifier' do
116
- dependency.version_specifiers = '> 4.0'
117
- gemspec.rewrite!
118
- expect(rewritten_source).to eq(expected_source)
119
- end
120
- end
121
-
122
- context 'when the dependency has multiple version specifiers' do
123
- let(:dependency) { gemspec.find_dependency('bundler') }
124
-
125
- let(:expected_source) { <<-END.strip_indent }
126
- Gem::Specification.new do |spec|
127
- spec.name = 'safedep'
128
- spec.add_dependency 'parser'
129
- spec.add_runtime_dependency 'bundler', '~> 2.0'
130
- spec.add_runtime_dependency 'astrolabe', ['>= 1.3', '< 2.0']
131
- spec.add_development_dependency 'rspec', '~> 3.1'
132
- end
133
- END
134
-
135
- it 'replaces the existing specifiers with the passed specifier' do
136
- dependency.version_specifiers = '~> 2.0'
137
- gemspec.rewrite!
138
- expect(rewritten_source).to eq(expected_source)
139
- end
140
- end
141
-
142
- context 'when the dependency has multiple version specifiers in an array' do
143
- let(:dependency) { gemspec.find_dependency('astrolabe') }
144
-
145
- let(:expected_source) { <<-END.strip_indent }
146
- Gem::Specification.new do |spec|
147
- spec.name = 'safedep'
148
- spec.add_dependency 'parser'
149
- spec.add_runtime_dependency 'bundler', '>= 1.3.1', '< 2.0'
150
- spec.add_runtime_dependency 'astrolabe', '~> 2.0'
151
- spec.add_development_dependency 'rspec', '~> 3.1'
152
- end
153
- END
154
-
155
- it 'replaces the existing specifiers with the passed specifier' do
156
- dependency.version_specifiers = '~> 2.0'
157
- gemspec.rewrite!
158
- expect(rewritten_source).to eq(expected_source)
159
- end
160
- end
161
-
162
- context 'when multiple specifiers are passed' do
163
- let(:dependency) { gemspec.find_dependency('rspec') }
164
-
165
- let(:expected_source) { <<-END.strip_indent }
166
- Gem::Specification.new do |spec|
167
- spec.name = 'safedep'
168
- spec.add_dependency 'parser'
169
- spec.add_runtime_dependency 'bundler', '>= 1.3.1', '< 2.0'
170
- spec.add_runtime_dependency 'astrolabe', ['>= 1.3', '< 2.0']
171
- spec.add_development_dependency 'rspec', '>= 3.1', '< 4.0'
172
- end
173
- END
174
-
175
- it 'replaces the existing specifier with the passed specifier' do
176
- dependency.version_specifiers = ['>= 3.1', '< 4.0']
177
- gemspec.rewrite!
178
- expect(rewritten_source).to eq(expected_source)
179
- end
180
- end
181
- end
182
- end
183
- end
184
- end
@@ -1,22 +0,0 @@
1
- require 'safedep/gemspec'
2
-
3
- module Safedep
4
- describe Gemspec, :gemspec do
5
- include FileHelper
6
- include_context 'isolated environment'
7
-
8
- describe '#find_dependency' do
9
- it 'returns the dependency matching the passed name' do
10
- dependency = gemspec.find_dependency('parser')
11
- expect(dependency.name).to eq('parser')
12
- end
13
- end
14
-
15
- describe '#dependencies' do
16
- it 'returns an array of the dependencies' do
17
- expect(gemspec.dependencies.size).to eq(2)
18
- expect(gemspec.dependencies).to all be_a(Gemspec::Dependency)
19
- end
20
- end
21
- end
22
- end
@@ -1,49 +0,0 @@
1
- require 'safedep/literal'
2
- require 'astrolabe/builder'
3
- require 'parser/current'
4
-
5
- module Safedep
6
- describe Literal do
7
- let(:node) do
8
- builder = Astrolabe::Builder.new
9
- parser = Parser::CurrentRuby.new(builder)
10
- parser.parse(source_buffer)
11
- end
12
-
13
- let(:source_buffer) do
14
- Parser::Source::Buffer.new('(string)').tap do |buffer|
15
- buffer.source = source
16
- end
17
- end
18
-
19
- describe '.value' do
20
- subject { Literal.value(node) }
21
-
22
- [
23
- true,
24
- false,
25
- nil,
26
- 123,
27
- 3.14,
28
- 'foo',
29
- :foo,
30
- /foo/im,
31
- ['foo', 123],
32
- { 'foo' => 123, bar: false },
33
- 1..3,
34
- 1...3,
35
- { 'foo' => [:bar, { baz: 3.14 }] }
36
- ].each do |value|
37
- context "with #{value.inspect} node" do
38
- let(:source) { value.inspect }
39
- it { should eq(value) }
40
- end
41
- end
42
-
43
- context 'when nil is passed' do
44
- let(:node) { nil }
45
- it { should be_nil }
46
- end
47
- end
48
- end
49
- end