pompompom 1.0.2 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore CHANGED
@@ -3,3 +3,5 @@
3
3
  /.bundle
4
4
  /pkg
5
5
  /TODO
6
+ /examples/lib
7
+ /examples/cache
data/examples/Rakefile ADDED
@@ -0,0 +1,38 @@
1
+ $: << File.expand_path('../../lib', __FILE__)
2
+
3
+ require 'pompompom/rake'
4
+
5
+
6
+ task :clean do
7
+ rm_rf 'lib'
8
+ rm_rf 'cache'
9
+ end
10
+
11
+ task :example1 do
12
+ pompompom 'org.eclipse.jetty:jetty-server:7.1.5.v20100705'
13
+ end
14
+
15
+ task :example2 do
16
+ repositories = %w(
17
+ http://repo1.maven.org/maven2
18
+ http://scala-tools.org/repo-releases
19
+ http://scala-tools.org/repo-snapshots
20
+ )
21
+
22
+ dependencies = %w(
23
+ org.eclipse.jetty:jetty-server:7.1.5.v20100705
24
+ org.scala-tools.testing:specs_2.8.0:1.6.5-SNAPSHOT
25
+ org.mockito:mockito-core:1.8.5
26
+ net.liftweb:lift-json:2.0-scala280-SNAPSHOT
27
+ log4j:log4j:1.2.16
28
+ org.slf4j:slf4j-log4j12:1.6.1
29
+ org.slf4j:slf4j-api:1.6.1
30
+ org.mongodb:mongo-java-driver:2.0
31
+ )
32
+
33
+ pompompom dependencies, :repositories => repositories, :cache_dir => 'cache'
34
+ end
35
+
36
+ task :example3 do
37
+ pompompom 'org.eclipse.jetty:jetty-server:7.1.5.v20100705', :logger => STDOUT, :config_file => 'config.yml', :cache_dir => 'cache'
38
+ end
@@ -0,0 +1,5 @@
1
+ ---
2
+ repositories:
3
+ - http://repo1.maven.org/maven2
4
+ - http://scala-tools.org/repo-releases
5
+ - http://scala-tools.org/repo-snapshots
data/lib/pompompom.rb CHANGED
@@ -4,7 +4,8 @@ require 'pompompom/dependency'
4
4
  require 'pompompom/pom'
5
5
  require 'pompompom/downloader'
6
6
  require 'pompompom/resolver'
7
+ require 'pompompom/config'
7
8
 
8
9
  module PomPomPom
9
- VERSION = '1.0.2'
10
+ VERSION = '1.1.0'
10
11
  end
data/lib/pompompom/cli.rb CHANGED
@@ -3,15 +3,13 @@ require 'yaml'
3
3
 
4
4
  module PomPomPom
5
5
  class Cli
6
- STANDARD_REPOSITORIES = %w(http://repo1.maven.org/maven2)
7
- DEFAULT_DESTINATION_DIR = 'lib'
8
- CACHE_DIR = File.expand_path('~/.pompompom')
9
- CONFIG_FILE = File.expand_path('~/.pompompomrc')
10
-
11
- def initialize(stdin, stdout, stderr)
6
+ def initialize(stdin, stdout, stderr, options={})
7
+ @config = Config.new(options)
8
+ @config.load!
12
9
  @stdin, @stdout, @stderr = stdin, stdout, stderr
13
10
  @status_logger = EchoLogger.new(@stderr)
14
- @downloader = CachingDownloader.new(CACHE_DIR, Downloader.new)
11
+ @downloader = CachingDownloader.new(@config.cache_dir, Downloader.new)
12
+ @resolver = options[:resolver]
15
13
  end
16
14
 
17
15
  def run!(*args)
@@ -22,21 +20,21 @@ module PomPomPom
22
20
 
23
21
  resolver = create_resolver
24
22
 
25
- create_config_file!
23
+ @config.create_file! unless @config.file_exists?
26
24
  create_lib_directory!
27
25
 
28
26
  @status_logger.info("Determining transitive dependencies...")
29
27
 
30
28
  dependencies = parse_dependencies(args)
31
29
  dependencies = resolver.find_transitive_dependencies(*dependencies)
32
- dependencies = dependencies.reject { |d| File.exists?(File.join(destination_dir_path, d.jar_file_name)) }
30
+ dependencies = dependencies.reject { |d| File.exists?(File.join(@config.target_dir, d.jar_file_name)) }
33
31
 
34
32
  if dependencies.empty?
35
33
  @status_logger.info('All dependencies are met')
36
34
  else
37
35
  dependencies.each do |dependency|
38
36
  @status_logger.info(%(Downloading "#{dependency.to_dependency.to_s}"))
39
- resolver.download!(destination_dir_path, false, dependency)
37
+ resolver.download!(@config.target_dir, false, dependency)
40
38
  end
41
39
  end
42
40
 
@@ -48,44 +46,20 @@ module PomPomPom
48
46
 
49
47
  private
50
48
 
51
- def create_config_file!
52
- return if File.exists?(config_file_path)
53
- File.open(config_file_path, 'w') { |f| f.write(YAML.dump('repositories' => STANDARD_REPOSITORIES))}
54
- end
55
-
56
49
  def create_lib_directory!
57
- return if File.directory?(destination_dir_path)
58
- raise %(Cannot create destination, "#{destination_dir_path}" is a file!) if File.exists?(destination_dir_path)
59
- Dir.mkdir(destination_dir_path)
50
+ return if File.directory?(@config.target_dir)
51
+ raise %(Cannot create destination, "#{@config.target_dir}" is a file!) if File.exists?(@config.target_dir)
52
+ Dir.mkdir(@config.target_dir)
60
53
  end
61
54
 
62
55
  def create_resolver
63
- Resolver.new(
64
- config[:repositories],
56
+ @resolver ||= Resolver.new(
57
+ @config.repositories,
65
58
  :logger => @status_logger,
66
59
  :downloader => @downloader
67
60
  )
68
61
  end
69
62
 
70
- def config
71
- @config ||= symbolize_keys(YAML.load(File.read(config_file_path)))
72
- end
73
-
74
- def symbolize_keys(h)
75
- h.keys.inject({}) do |acc, k|
76
- acc[k.to_sym] = if Hash === h[k] then symbolize_keys(h[k]) else h[k] end
77
- acc
78
- end
79
- end
80
-
81
- def config_file_path
82
- CONFIG_FILE
83
- end
84
-
85
- def destination_dir_path
86
- DEFAULT_DESTINATION_DIR
87
- end
88
-
89
63
  def parse_dependencies(args)
90
64
  args.map do |coordinate|
91
65
  begin
@@ -0,0 +1,47 @@
1
+ require 'yaml'
2
+
3
+
4
+ module PomPomPom
5
+ class Config
6
+ REPOSITORIES = %w(http://repo1.maven.org/maven2)
7
+ TARGET_DIR = 'lib'
8
+ CACHE_DIR = File.expand_path('~/.pompompom')
9
+ CONFIG_FILE = File.expand_path('~/.pompompomrc')
10
+
11
+ attr_reader :repositories, :target_dir, :cache_dir, :config_file
12
+
13
+ def initialize(options={})
14
+ @repositories = options[:repositories] || REPOSITORIES
15
+ @target_dir = options[:target_dir] || TARGET_DIR
16
+ @cache_dir = options[:cache_dir] || CACHE_DIR
17
+ @config_file = options[:config_file] || CONFIG_FILE
18
+ end
19
+
20
+ def load!
21
+ return unless file_exists?
22
+ options = symbolize_keys(YAML.load(File.read(@config_file)))
23
+ @repositories = options[:repositories] || @repositories
24
+ @target_dir = options[:target_dir] || @target_dir
25
+ @cache_dir = options[:cache_dir] || @cache_dir
26
+ @config_file = options[:config_file] || @config_file
27
+ end
28
+
29
+ def file_exists?
30
+ File.exists?(@config_file)
31
+ end
32
+
33
+ def create_file!
34
+ return if file_exists?
35
+ File.open(@config_file, 'w') do |f|
36
+ f.write(YAML.dump('repositories' => @repositories))
37
+ end
38
+ end
39
+
40
+ def symbolize_keys(h)
41
+ h.keys.inject({}) do |acc, k|
42
+ acc[k.to_sym] = if Hash === h[k] then symbolize_keys(h[k]) else h[k] end
43
+ acc
44
+ end
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,52 @@
1
+ require 'pompompom'
2
+
3
+
4
+ module PomPomPom
5
+ class SimpleLogger
6
+ def initialize(io)
7
+ @io = io
8
+ end
9
+ def info(msg)
10
+ @io.puts(msg)
11
+ end
12
+ end
13
+
14
+ class NullLogger
15
+ def info(msg); end
16
+ end
17
+
18
+ def pompompom(*args)
19
+ options = (Hash === args.last) ? args.pop : { }
20
+ dependencies = args.flatten
21
+
22
+ logger = NullLogger.new
23
+
24
+ if options[:logger]
25
+ if options[:logger].respond_to?(:info)
26
+ logger = options[:logger]
27
+ elsif options[:logger].respond_to?(:puts)
28
+ logger = SimpleLogger.new(options[:logger])
29
+ end
30
+ end
31
+
32
+ config = Config.new(options)
33
+ config.load!
34
+
35
+ downloader = options[:downloader]
36
+ downloader ||= CachingDownloader.new(config.cache_dir, Downloader.new)
37
+
38
+ resolver = Resolver.new(config.repositories, :downloader => downloader)
39
+ dependencies = dependencies.map { |d| Dependency.parse(d) }
40
+ dependencies = resolver.find_transitive_dependencies(*dependencies)
41
+ dependencies = dependencies.reject { |d| File.exists?(File.join(config.target_dir, d.jar_file_name)) }
42
+
43
+ unless dependencies.empty?
44
+ dependencies.each do |dependency|
45
+ logger.info("Loading #{dependency.jar_file_name}")
46
+ resolver.download!(config.target_dir, false, dependency)
47
+ end
48
+ end
49
+ end
50
+ end
51
+
52
+ include PomPomPom
data/pompompom.gemspec CHANGED
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{pompompom}
8
- s.version = "1.0.2"
8
+ s.version = "1.1.0"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Theo Hultberg"]
12
- s.date = %q{2010-07-09}
12
+ s.date = %q{2010-07-17}
13
13
  s.default_executable = %q{pompompom}
14
14
  s.description = %q{Ruby dependency manager for Maven repository artifacts}
15
15
  s.email = %q{theo@iconara.net}
@@ -26,21 +26,27 @@ Gem::Specification.new do |s|
26
26
  "README.mdown",
27
27
  "Rakefile",
28
28
  "bin/pompompom",
29
+ "examples/Rakefile",
30
+ "examples/config.yml",
29
31
  "lib/pom_pom_pom.rb",
30
32
  "lib/pompompom.rb",
31
33
  "lib/pompompom/cli.rb",
34
+ "lib/pompompom/config.rb",
32
35
  "lib/pompompom/dependency.rb",
33
36
  "lib/pompompom/downloader.rb",
34
37
  "lib/pompompom/metadata.rb",
35
38
  "lib/pompompom/pom.rb",
39
+ "lib/pompompom/rake.rb",
36
40
  "lib/pompompom/resolver.rb",
37
41
  "lib/pompompom/url_builder.rb",
38
42
  "pompompom.gemspec",
39
43
  "spec/pompompom/cli_spec.rb",
44
+ "spec/pompompom/config_spec.rb",
40
45
  "spec/pompompom/dependency_spec.rb",
41
46
  "spec/pompompom/downloader_spec.rb",
42
47
  "spec/pompompom/metadata_spec.rb",
43
48
  "spec/pompompom/pom_spec.rb",
49
+ "spec/pompompom/rake_spec.rb",
44
50
  "spec/pompompom/resolver_spec.rb",
45
51
  "spec/pompompom/url_builders_shared.rb",
46
52
  "spec/resources/repository/aopalliance/aopalliance/1.0/aopalliance-1.0.jar",
@@ -96,10 +102,12 @@ Gem::Specification.new do |s|
96
102
  s.summary = %q{Ruby dependency manager for Maven repository artifacts}
97
103
  s.test_files = [
98
104
  "spec/pompompom/cli_spec.rb",
105
+ "spec/pompompom/config_spec.rb",
99
106
  "spec/pompompom/dependency_spec.rb",
100
107
  "spec/pompompom/downloader_spec.rb",
101
108
  "spec/pompompom/metadata_spec.rb",
102
109
  "spec/pompompom/pom_spec.rb",
110
+ "spec/pompompom/rake_spec.rb",
103
111
  "spec/pompompom/resolver_spec.rb",
104
112
  "spec/pompompom/url_builders_shared.rb",
105
113
  "spec/spec_helper.rb"
@@ -13,15 +13,12 @@ module PomPomPom
13
13
  @stderr = StringIO.new
14
14
  @downloader = FilesystemDownloader.new
15
15
  @resolver = Resolver.new([@repository_path])
16
- @cli = Cli.new(@stdin, @stdout, @stderr)
17
16
  @tmp_dir = File.join(Dir.tmpdir, 'pompompom')
18
17
  FileUtils.rm_rf(@tmp_dir)
19
18
  Dir.mkdir(@tmp_dir)
20
19
  Dir.chdir(@tmp_dir)
21
20
  @config_file_path = File.join(@tmp_dir, '.pompompomrc')
22
- @cli.stub!(:create_resolver).and_return(@resolver)
23
- @cli.stub!(:create_lib_directory!)
24
- @cli.stub!(:config_file_path).and_return(@config_file_path)
21
+ @cli = Cli.new(@stdin, @stdout, @stderr, :resolver => @resolver, :config_file => @config_file_path)
25
22
  end
26
23
 
27
24
  after do
@@ -102,7 +99,7 @@ module PomPomPom
102
99
  it 'adds the standard repositories to the config file, if it doesn\'t exist' do
103
100
  @cli.run!('net.iconara:pompompom:1.0', 'com.example:test:9.9')
104
101
  @config = YAML.load(File.read(@config_file_path))
105
- @config['repositories'].should == Cli::STANDARD_REPOSITORIES
102
+ @config['repositories'].should == Config::REPOSITORIES
106
103
  end
107
104
 
108
105
  it 'doesn\'t clobber an existing config file' do
@@ -117,8 +114,7 @@ module PomPomPom
117
114
  @config = {'repositories' => %w(http://example.com/repo1 http://example.com/repo2)}
118
115
  File.open(@config_file_path, 'w') { |f| f.write(YAML::dump(@config)) }
119
116
  Resolver.should_receive(:new).with(%w(http://example.com/repo1 http://example.com/repo2), an_instance_of(Hash))
120
- @cli = Cli.new(@stdin, @stdout, @stderr)
121
- @cli.stub!(:config_file_path).and_return(@config_file_path)
117
+ @cli = Cli.new(@stdin, @stdout, @stderr, :config_file => @config_file_path)
122
118
  @cli.run!('net.iconara:pompompom:1.0', 'com.example:test:9.9')
123
119
  end
124
120
  end
@@ -0,0 +1,75 @@
1
+ require File.expand_path('../../spec_helper', __FILE__)
2
+ require 'tmpdir'
3
+ require 'fileutils'
4
+
5
+
6
+ module PomPomPom
7
+ describe Config do
8
+ before do
9
+ @tmp_dir = File.join(Dir.tmpdir, 'pompompom')
10
+ FileUtils.rm_rf(@tmp_dir)
11
+ Dir.mkdir(@tmp_dir)
12
+ end
13
+
14
+ after do
15
+ FileUtils.rm_rf(@tmp_dir)
16
+ end
17
+
18
+ context 'defaults' do
19
+ subject { Config.new }
20
+
21
+ its(:target_dir) { should == 'lib' }
22
+ its(:repositories) { should == %w(http://repo1.maven.org/maven2) }
23
+ its(:cache_dir) { should == File.expand_path('~/.pompompom') }
24
+ its(:config_file) { should == File.expand_path('~/.pompompomrc') }
25
+ end
26
+
27
+ describe '#load!' do
28
+ it 'loads the config file' do
29
+ config_file = File.join(@tmp_dir, '.pom3rc')
30
+ File.open(config_file, 'w') { |f| f.write(YAML::dump(:repositories => %w(repo1 repo2))) }
31
+ config = Config.new(:config_file => config_file)
32
+ config.load!
33
+ config.repositories.should == %w(repo1 repo2)
34
+ end
35
+ end
36
+
37
+ describe '#file_exists?' do
38
+ before do
39
+ @config_file = File.join(@tmp_dir, '.pom3rc')
40
+ @config = Config.new(:config_file => @config_file)
41
+ end
42
+
43
+ it 'returns true if the file exists' do
44
+ FileUtils.touch(@config_file)
45
+ @config.file_exists?.should == true
46
+ end
47
+
48
+ it 'returns false if the file doesn\'t exist' do
49
+ @config.file_exists?.should == false
50
+ end
51
+ end
52
+
53
+ describe '#create_file!' do
54
+ before do
55
+ @config_file = File.join(@tmp_dir, '.pom3rc')
56
+ @config = Config.new(:config_file => @config_file)
57
+ end
58
+
59
+ after do
60
+ FileUtils.rm_f(@config_file)
61
+ end
62
+
63
+ it 'creates the file and puts the standard repository list in it' do
64
+ @config.create_file!
65
+ YAML.load(File.read(@config_file))['repositories'].should == %w(http://repo1.maven.org/maven2)
66
+ end
67
+
68
+ it 'doesn\'t clobber existing files' do
69
+ FileUtils.touch(@config_file)
70
+ @config.create_file!
71
+ File.read(@config_file).should == ''
72
+ end
73
+ end
74
+ end
75
+ end
@@ -0,0 +1,66 @@
1
+ require File.expand_path('../../spec_helper', __FILE__)
2
+ require 'tmpdir'
3
+ require 'fileutils'
4
+
5
+
6
+ describe 'rake' do
7
+ before do
8
+ @repository_path = File.expand_path('../../resources/repository', __FILE__)
9
+ @tmp_dir = File.join(Dir.tmpdir, 'pompompom')
10
+ FileUtils.rm_rf(@tmp_dir)
11
+ Dir.mkdir(@tmp_dir)
12
+ @lib_dir = File.join(@tmp_dir, 'lib')
13
+ @repo_dir = File.join(@tmp_dir, 'repo')
14
+ @config_file = File.join(@tmp_dir, '.pompompomrc')
15
+ @downloader = FilesystemDownloader.new
16
+ @dependencies = %w(com.rabbitmq:amqp-client:1.8.0 com.google.inject:guice:2.0)
17
+ end
18
+
19
+ after do
20
+ FileUtils.rm_rf(@tmp_dir)
21
+ end
22
+
23
+ it 'downloads dependencies' do
24
+ pompompom(@dependencies, :target_dir => @lib_dir, :downloader => @downloader, :repositories => [@repository_path], :config_file => @config_file)
25
+ jars = Dir[File.join(@lib_dir, '*.jar')].map { |f| File.basename(f) }
26
+ jars.should include('amqp-client-1.8.0.jar')
27
+ jars.should include('guice-2.0.jar')
28
+ end
29
+
30
+ it 'downloads dependencies (when specified as separate arguments)' do
31
+ pompompom('com.rabbitmq:amqp-client:1.8.0', 'com.google.inject:guice:2.0', :target_dir => @lib_dir, :downloader => @downloader, :repositories => [@repository_path], :config_file => @config_file)
32
+ jars = Dir[File.join(@lib_dir, '*.jar')].map { |f| File.basename(f) }
33
+ jars.should include('amqp-client-1.8.0.jar')
34
+ jars.should include('guice-2.0.jar')
35
+ end
36
+
37
+ it 'reads the config file' do
38
+ File.open(@config_file, 'w') { |f| f.write(YAML.dump('repositories' => [@repository_path])) }
39
+ pompompom(@dependencies, :config_file => @config_file, :target_dir => @lib_dir, :downloader => @downloader)
40
+ jars = Dir[File.join(@lib_dir, '*.jar')].map { |f| File.basename(f) }
41
+ jars.should include('amqp-client-1.8.0.jar')
42
+ jars.should include('guice-2.0.jar')
43
+ end
44
+
45
+ context 'logging' do
46
+ it 'outputs status to an IO' do
47
+ io = StringIO.new
48
+ pompompom(@dependencies, :logger => io, :target_dir => @lib_dir, :downloader => @downloader, :repositories => [@repository_path], :config_file => @config_file)
49
+ io.string.should include('Loading amqp-client-1.8.0.jar')
50
+ io.string.should include('Loading guice-2.0.jar')
51
+ io.string.should include('Loading commons-io-1.2.jar')
52
+ io.string.should include('Loading commons-cli-1.1.jar')
53
+ io.string.should include('Loading aopalliance-1.0.jar')
54
+ end
55
+
56
+ it 'logs to #info on a logger' do
57
+ logger = double()
58
+ logger.should_receive(:info).with('Loading amqp-client-1.8.0.jar')
59
+ logger.should_receive(:info).with('Loading guice-2.0.jar')
60
+ logger.should_receive(:info).with('Loading commons-io-1.2.jar')
61
+ logger.should_receive(:info).with('Loading commons-cli-1.1.jar')
62
+ logger.should_receive(:info).with('Loading aopalliance-1.0.jar')
63
+ pompompom(@dependencies, :logger => logger, :target_dir => @lib_dir, :downloader => @downloader, :repositories => [@repository_path], :config_file => @config_file)
64
+ end
65
+ end
66
+ end
data/spec/spec_helper.rb CHANGED
@@ -2,4 +2,5 @@ $: << File.expand_path('../../lib', __FILE__)
2
2
 
3
3
  require 'pompompom'
4
4
  require 'pompompom/cli'
5
+ require 'pompompom/rake'
5
6
  require 'rubygems'
metadata CHANGED
@@ -5,9 +5,9 @@ version: !ruby/object:Gem::Version
5
5
  prerelease: false
6
6
  segments:
7
7
  - 1
8
+ - 1
8
9
  - 0
9
- - 2
10
- version: 1.0.2
10
+ version: 1.1.0
11
11
  platform: ruby
12
12
  authors:
13
13
  - Theo Hultberg
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2010-07-09 00:00:00 +02:00
18
+ date: 2010-07-17 00:00:00 +02:00
19
19
  default_executable: pompompom
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency
@@ -63,21 +63,27 @@ files:
63
63
  - README.mdown
64
64
  - Rakefile
65
65
  - bin/pompompom
66
+ - examples/Rakefile
67
+ - examples/config.yml
66
68
  - lib/pom_pom_pom.rb
67
69
  - lib/pompompom.rb
68
70
  - lib/pompompom/cli.rb
71
+ - lib/pompompom/config.rb
69
72
  - lib/pompompom/dependency.rb
70
73
  - lib/pompompom/downloader.rb
71
74
  - lib/pompompom/metadata.rb
72
75
  - lib/pompompom/pom.rb
76
+ - lib/pompompom/rake.rb
73
77
  - lib/pompompom/resolver.rb
74
78
  - lib/pompompom/url_builder.rb
75
79
  - pompompom.gemspec
76
80
  - spec/pompompom/cli_spec.rb
81
+ - spec/pompompom/config_spec.rb
77
82
  - spec/pompompom/dependency_spec.rb
78
83
  - spec/pompompom/downloader_spec.rb
79
84
  - spec/pompompom/metadata_spec.rb
80
85
  - spec/pompompom/pom_spec.rb
86
+ - spec/pompompom/rake_spec.rb
81
87
  - spec/pompompom/resolver_spec.rb
82
88
  - spec/pompompom/url_builders_shared.rb
83
89
  - spec/resources/repository/aopalliance/aopalliance/1.0/aopalliance-1.0.jar
@@ -162,10 +168,12 @@ specification_version: 3
162
168
  summary: Ruby dependency manager for Maven repository artifacts
163
169
  test_files:
164
170
  - spec/pompompom/cli_spec.rb
171
+ - spec/pompompom/config_spec.rb
165
172
  - spec/pompompom/dependency_spec.rb
166
173
  - spec/pompompom/downloader_spec.rb
167
174
  - spec/pompompom/metadata_spec.rb
168
175
  - spec/pompompom/pom_spec.rb
176
+ - spec/pompompom/rake_spec.rb
169
177
  - spec/pompompom/resolver_spec.rb
170
178
  - spec/pompompom/url_builders_shared.rb
171
179
  - spec/spec_helper.rb