lock_jar 0.6.2 → 0.7.0

Sign up to get free protection for your applications and to get access to all the features.
data/Gemfile CHANGED
@@ -1,6 +1,8 @@
1
+ #require 'lib/lock_jar/bundler'
2
+
1
3
  source "http://rubygems.org"
2
4
 
3
- gem "naether", "~> 0.9.0"
5
+ gem "naether", "~> 0.10.0"
4
6
  gem "thor", "~> 0.14.6"
5
7
 
6
8
  # Add dependencies to develop your gem here.
@@ -9,6 +11,6 @@ group :development do
9
11
  gem "rspec", "~> 2.9.0"
10
12
  gem "jeweler", "~> 1.8.4"
11
13
  gem "yard", "~> 0.8.0"
12
- gem 'solr_sail', '~>0.0.6'
14
+ gem 'solr_sail', '~>0.1.0', :platforms => :jruby
13
15
  gem 'jruby-openssl', :platforms => :jruby
14
16
  end
data/README.md CHANGED
@@ -1,8 +1,14 @@
1
1
  # LockJar
2
2
 
3
- LockJar manages Java Jars for Ruby. Powered by [Naether](https://github.com/mguymon/naether) to create a frankenstein of Bundler and Maven. A Jarfile ([example](https://github.com/mguymon/lock_jar/blob/master/spec/Jarfile)) is used to generate a Jarfile.lock that contains all the resolved jar dependencies for scopes runtime, compile, and test. The Jarfile.lock can be used to populate the classpath.
3
+ LockJar manages Java Jars for Ruby. Powered by [Naether](https://github.com/mguymon/naether) to
4
+ create a frankenstein of Bundler and Maven. A Jarfile ([example](https://github.com/mguymon/lock_jar/blob/master/spec/Jarfile)) is used to generate a Jarfile.lock that contains all the resolved jar dependencies. The Jarfile.lock can be used to populate the classpath.
4
5
 
5
- LockJar can be used directly, from the [command line](https://github.com/mguymon/lock_jar/blob/master/README.md#command-line), [triggered from a Gem install](https://github.com/mguymon/lock_jar/blob/master/README.md#gem-integration), and [integrates with Buildr](https://github.com/mguymon/lock_jar/blob/master/README.md#buildr-integration).
6
+ LockJar can:
7
+ * Be Use directly in MRI 1.8.7, 1.9.3, and JRuby 1.6.7, 1.6.8
8
+ * From the [command line](https://github.com/mguymon/lock_jar/blob/master/README.md#command-line)
9
+ * [Triggered from a Gem install](https://github.com/mguymon/lock_jar/blob/master/README.md#gem-integration)
10
+ * [Integrated into Buildr](https://github.com/mguymon/lock_jar/blob/master/README.md#buildr-integration)
11
+ * Experimental [tntegration with Bundler](https://github.com/mguymon/lock_jar/blob/master/README.md#bundler-integration)
6
12
 
7
13
  https://github.com/mguymon/lock_jar
8
14
 
@@ -14,31 +20,33 @@ https://github.com/mguymon/lock_jar
14
20
 
15
21
  ## Ruby Usage
16
22
 
23
+ JRuby is natively supported. Ruby 1.8.7 and 1.9.3 uses [Rjb](http://rjb.rubyforge.org/) to proxy over JNI.
24
+
17
25
  ### Jarfile
18
26
 
19
27
  A Jarfile is a simple file using a Ruby DSL for defining a project's dependencies using the following
20
28
  methods:
21
29
 
22
- * **local( path )**: Set the local Maven repository, this were dependencies are downloaded to.
23
- * **repository( url )**: Add additional urlr of remote Maven repository.
24
- * **exclude( excludes )**: Add a artifact:group that will be excluded from resolved dependencies. A single or Array of excludes can be set.
25
- * **jar( notations, opts = {} )**: Add Jar dependency in artifact notation, artifact:group:version as the bare minimum. A single or Array of notations can be passed. Default scope is _compile_, can be specified by setting _opts = { :scope => ['new_scope'] }_
26
- * **pom( pom_path, opts = {} )**: Add a local Maven pom, default is to load dependencies for all scopes. To select the scopes to be loaded from the pom, set the _opts = { :scopes => ['new_scope'] }_
27
- * **scope( scopes )**: Set the scope for nested jar or pom. A single or Array of scopes can be set.
30
+ * **local_repo( path )**: Set the local Maven repository, this were dependencies are downloaded to.
31
+ * **remote_repo( url )**: Add additional url of remote Maven repository.
32
+ * **group( groups )**: Set the group for nested jar or pom. A single or Array of groups can be set.
33
+ * **jar( notations, opts = {} )**: Add Jar dependency in artifact notation, artifact:group:version as the bare minimum. A single or Array of notations can be passed. Default group is _default_, can be specified by setting _opts = { :group => ['group_name'] }_
34
+ * **pom( pom_path, opts = {} )**: Add a local Maven pom, default is to load dependencies for `runtime` and `compile` scopes. To select the scopes to be loaded from the pom, set the _opts = { :scopes => ['test'] }_
28
35
 
29
36
  #### Example Jarfile
30
37
 
31
38
  repository 'http://repository.jboss.org/nexus/content/groups/public-jboss'
32
39
 
33
- // Default scope is compile
40
+ // Default group is default
34
41
  jar "org.apache.mina:mina-core:2.0.4"
35
42
 
36
- scope 'runtime' do
43
+ group 'runtime' do
37
44
  jar 'org.apache.tomcat:servlet-api:jar:6.0.35'
38
45
  end
39
46
 
40
- jar 'junit:junit:jar:4.10', :scope => 'test'
41
-
47
+ group 'test' do
48
+ jar 'junit:junit:jar:4.10', :group => 'test'
49
+ end
42
50
 
43
51
  ### Resolving dependencies
44
52
 
@@ -58,60 +66,79 @@ Example of locking a Jarfile to a Jarfile.lock
58
66
 
59
67
  ### Jarfile.lock
60
68
 
61
- The _Jarfile.lock_ generated is a YAML file containing the scoped dependencies, their resolved dependencies, and the additional Maven repositories.
69
+ The _Jarfile.lock_ generated is a YAML file containing information on how to handle the classpath for grouped dependencies and their nested transitive dependencies.
62
70
 
63
71
  #### The Jarfile.lock
72
+
73
+ ---
74
+ version: 0.7.0
75
+ groups:
76
+ default:
77
+ dependencies:
78
+ - ch.qos.logback:logback-classic:jar:0.9.24
79
+ - ch.qos.logback:logback-core:jar:0.9.24
80
+ - com.metapossum:metapossum-scanner:jar:1.0
81
+ - com.slackworks:modelcitizen:jar:0.2.2
82
+ - commons-beanutils:commons-beanutils:jar:1.8.3
83
+ - commons-io:commons-io:jar:1.4
84
+ - commons-lang:commons-lang:jar:2.6
85
+ - commons-logging:commons-logging:jar:1.1.1
86
+ - junit:junit:jar:4.7
87
+ - org.apache.mina:mina-core:jar:2.0.4
88
+ - org.slf4j:slf4j-api:jar:1.6.1
89
+ artifacts:
90
+ - jar:org.apache.mina:mina-core:jar:2.0.4:
91
+ transitive:
92
+ org.slf4j:slf4j-api:jar:1.6.1: {}
93
+ - pom:spec/pom.xml:
94
+ scopes:
95
+ - runtime
96
+ - compile
97
+ transitive:
98
+ com.metapossum:metapossum-scanner:jar:1.0:
99
+ junit:junit:jar:4.7: {}
100
+ commons-io:commons-io:jar:1.4: {}
101
+ commons-beanutils:commons-beanutils:jar:1.8.3:
102
+ commons-logging:commons-logging:jar:1.1.1: {}
103
+ ch.qos.logback:logback-classic:jar:0.9.24:
104
+ ch.qos.logback:logback-core:jar:0.9.24: {}
105
+ commons-lang:commons-lang:jar:2.6: {}
106
+ development:
107
+ dependencies:
108
+ - com.typesafe:config:jar:0.5.0
109
+ artifacts:
110
+ - jar:com.typesafe:config:jar:0.5.0:
111
+ transitive: {}
112
+ test:
113
+ dependencies:
114
+ - junit:junit:jar:4.10
115
+ - org.hamcrest:hamcrest-core:jar:1.1
116
+ artifacts:
117
+ - jar:junit:junit:jar:4.10:
118
+ transitive:
119
+ org.hamcrest:hamcrest-core:jar:1.1: {}
120
+ ...
64
121
 
65
- ---
66
- repositories:
67
- - http://repository.jboss.org/nexus/content/groups/public-jboss
68
- scopes:
69
- compile:
70
- dependencies:
71
- - org.apache.mina:mina-core:2.0.4
72
- resolved_dependencies:
73
- - org.apache.mina:mina-core:jar:2.0.4
74
- - org.slf4j:slf4j-api:jar:1.6.1
75
- - com.slackworks:modelcitizen:jar:0.2.2
76
- - commons-lang:commons-lang:jar:2.6
77
- - commons-beanutils:commons-beanutils:jar:1.8.3
78
- - commons-logging:commons-logging:jar:1.1.1
79
- - ch.qos.logback:logback-classic:jar:0.9.24
80
- - ch.qos.logback:logback-core:jar:0.9.24
81
- - com.metapossum:metapossum-scanner:jar:1.0
82
- - commons-io:commons-io:jar:1.4
83
- - junit:junit:jar:4.7
84
- runtime:
85
- dependencies:
86
- - org.apache.tomcat:servlet-api:jar:6.0.35
87
- resolved_dependencies:
88
- - org.apache.tomcat:servlet-api:jar:6.0.35
89
- test:
90
- dependencies:
91
- - junit:junit:jar:4.10
92
- resolved_dependencies:
93
- - junit:junit:jar:4.10
94
- - org.hamcrest:hamcrest-core:jar:1.1
95
122
 
96
123
 
97
124
  ### Accessing Jars
98
125
  **LockJar.install(*args)**: Download Jars in the Jarfile.lock
99
126
  * _[String]_ will set the Jarfile.lock path, e.g. `'Better.lock'`. Default lock file is `'Jarfile.lock'`.
100
- * _[Array<String>]_ will set the scopes, e.g. `['compile','test']`. Defaults scopes are _compile_ and _runtime_.
127
+ * _[Array<String>]_ will set the groups, e.g. `['compile','test']`. Defaults group is _default_.
101
128
  * _[Hash]_ will set the options, e.g. `{ :local_repo => 'path' }`
102
129
  * **:local_repo** _[String]_ sets the local repo path. Defaults to `ENV['M2_REPO']` or `'~/.m2/repository'`
103
130
 
104
- **LockJar.list(*args)**: Lists all dependencies as notations for scopes from the Jarfile.lock. Depending on the type of arg, a different configuration is set.
131
+ **LockJar.list(*args)**: Lists all dependencies as notations for groups from the Jarfile.lock. Depending on the type of arg, a different configuration is set.
105
132
  * _[String]_ will set the Jarfile.lock path, e.g. `'Better.lock'`. Default lock file is `'Jarfile.lock'`.
106
- * _[Array<String>]_ will set the scopes, e.g. `['compile','test']`. Defaults scopes are _compile_ and _runtime_.
133
+ * _[Array<String>]_ will set the groups, e.g. `['default', 'runtime']`. Defaults group is _default_.
107
134
  * _[Hash]_ will set the options, e.g. `{ :local_repo => 'path' }`
108
135
  * **:local_repo** _[String]_ sets the local repo path. Defaults to `ENV['M2_REPO']` or `'~/.m2/repository'`
109
136
  * **:local_paths** _[Boolean]_ converts the notations to paths of jars in the local repo
110
137
  * **:resolve** _[Boolean]_ to true will make transitive dependences resolve before returning list of jars
111
138
 
112
- **LockJar.load(*args)**: Loads all dependencies to the classpath for scopes from the Jarfile.lock. Defaults scopes are _compile_ and _runtime_. Default lock file is _Jarfile.lock_.
139
+ **LockJar.load(*args)**: Loads all dependencies to the classpath for groups from the Jarfile.lock. Default group is _default_. Default lock file is _Jarfile.lock_.
113
140
  * _[String]_ will set the Jarfile.lock, e.g. `'Better.lock'`
114
- * _[Array<String>]_ will set the scopes, e.g. `['compile','test']`
141
+ * _[Array<String>]_ will set the groups, e.g. `['default', 'runtime']`
115
142
  * _[Hash]_ will set the options, e.g. `{ :local_repo => 'path' }`
116
143
  * **:local_repo** _[String]_ sets the local repo path
117
144
  * **:resolve** _[Boolean]_ to true will make transitive dependences resolve before loading to classpath
@@ -176,7 +203,7 @@ _lockjar_ _--help_ will give you list of all commands and their options.
176
203
 
177
204
  ## Gem Integration
178
205
 
179
- ### Installing
206
+ ### Installing Jars with a Gem
180
207
 
181
208
  LockJar can be triggered when a Gem is installed by using a [Gem extension](http://docs.rubygems.org/read/chapter/20#extensions)
182
209
  of type _Rakefile_. The cavaet is the task to install the jars must be the default for the Rakefile.
@@ -208,16 +235,30 @@ point at the task to download the jars (from the example Rakefile,
208
235
  _PostInstallRakefile_ to handle the `task :prepare`. When packaging the gem, _PostInstallRakefile_ is
209
236
  renamed to `Rakefile`.
210
237
 
238
+ ### Manually installing Jars
239
+
240
+ Instead of rely in a Rakefile to install Jars when the Gem is installed, Jars can be manually installed. The following
241
+ Ruby needs to be called before calling `LockJar.load`. Only Jars that are missing are downloaded.
242
+
243
+ #get jarfile relative the gem dir
244
+ lockfile = File.expand_path( "../Jarfile.lock", __FILE__ )
245
+
246
+ # Download any missing Jars
247
+ LockJar.install( lockfile )
248
+
211
249
  ### Loading
212
250
 
213
- With the Jars already installed, loading the classpath for the Gem is simple.
251
+ With the Jars installed, loading the classpath for the Gem is simple.
214
252
  As part of the load process for the Gem (an entry file that is required, etc) use the following:
215
253
 
216
254
  #get jarfile relative the gem dir
217
255
  lockfile = File.expand_path( "../Jarfile.lock", __FILE__ )
218
256
 
257
+ # Loads the ClassPath with Jars from the lockfile
219
258
  LockJar.load( :lockfile => lockfile )
220
259
 
260
+ See also [loading Jars into a custom ClassLoader](https://github.com/mguymon/lock_jar/wiki/ClassLoader).
261
+
221
262
  ## Buildr Integration
222
263
 
223
264
  LockJar integrates with [Buildr](http://buildr.apache.org/) using an [Addon](https://github.com/mguymon/lock_jar/blob/master/lib/lock_jar/buildr.rb). This allows the Jarfile to be defined directly into a _buildfile_. A global LockJar definition can be set and is inherited to all projects. Each project may have its own LockJar definition. A lock file is generated per project based on the project name.
@@ -235,7 +276,7 @@ In a project, you can access an Array of notations using the **lock_jars** metho
235
276
  lock_jars()
236
277
 
237
278
 
238
- The _compile_ scoped dependencies are automatically added to the classpath for compiling. The test scoped dependencies are automatically added to the classpath for tests. Do not forget, if you change the LockJar definitions, you have to rerun the **lock_jar:lock** task.
279
+ The _default_ group dependencies are automatically added to the classpath for compiling. The _test_ group dependencies are automatically added to the classpath for tests. Do not forget, if you change the LockJar definitions, you have to rerun the **lock_jar:lock** task.
239
280
 
240
281
 
241
282
  ### Example
@@ -247,7 +288,7 @@ Sample buildfile with LockJar
247
288
  # app definition, inherited into all projects
248
289
  lock_jar do
249
290
 
250
- scope 'test' do
291
+ group 'test' do
251
292
  jar 'junit:junit:jar:4.10'
252
293
  end
253
294
  end
@@ -275,8 +316,14 @@ Generated the following lock files using **lock_jar:lock**
275
316
 
276
317
  ## Bundler Integration
277
318
 
278
- Direct Bundler integration has been deprecated to https://github.com/mguymon/lock_jar/tree/bundler_support.
279
- Waiting for [Bundler plugin support](https://github.com/carlhuda/bundler/issues/1945)
319
+ Bundler integration is **experimental** right now. [LockJar patches Bundler](https://github.com/mguymon/lock_jar/blob/master/lib/lock_jar/bundler.rb)
320
+ to allow creation of a _Jarfile.lock_ when Bundler calls `install` and `update`. The dependencies from the _Jarfile.lock_ are automatically loaded when
321
+ Bundler calls `setup` and `require`. To enable this support, add this require to your _Gemfile_
322
+
323
+ require 'lock_jar/bundler'
324
+
325
+ You can optionally create a _Jarfile_ that will automatically be included when you `bundle install` or `bundle update`. Otherwise
326
+ Gems with a Jarfile will be merge to generate a _Jarfile.lock_. The Jarfile.lock will be loaded when Bundler calls `setup` or `require`.
280
327
 
281
328
  ## License
282
329
 
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.6.2
1
+ 0.7.0
@@ -64,7 +64,7 @@ module Buildr
64
64
  def lock_jars( *args )
65
65
  lockfile = Buildr.project_to_lockfile(project)
66
66
  opts = {}
67
- scopes = ['compile','runtime']
67
+ groups = ['default']
68
68
 
69
69
  args.each do |arg|
70
70
  if arg.is_a?(Hash)
@@ -72,11 +72,11 @@ module Buildr
72
72
  elsif arg.is_a?( String )
73
73
  lockfile = arg
74
74
  elsif arg.is_a?( Array )
75
- scopes = arg
75
+ groups = arg
76
76
  end
77
77
  end
78
78
 
79
- ::LockJar.list( lockfile, scopes, opts )
79
+ ::LockJar.list( lockfile, groups, opts )
80
80
  end
81
81
 
82
82
  def lockjar_dsl
@@ -101,7 +101,7 @@ module Buildr
101
101
  end
102
102
  ::LockJar.lock( dsl, :lockfile => "#{project.name}.lock" )
103
103
  else
104
- # XXX: output that there were not dependencies to lock
104
+ # XXX: output that there were no dependencies to lock
105
105
  puts "No lock_jar dependencies to lock for #{project.name}"
106
106
  end
107
107
  end
@@ -110,7 +110,7 @@ module Buildr
110
110
  if project.lockjar_dsl && !File.exists?( Buildr.project_to_lockfile(project) )
111
111
  raise "#{project.name}.lock does not exist, run #{project.name}:lockjar:lock first"
112
112
  end
113
- jars = ::LockJar.list( Buildr.project_to_lockfile(project), ['compile', 'runtime'] )
113
+ jars = ::LockJar.list( Buildr.project_to_lockfile(project), ['default'] )
114
114
  project.compile.with( jars )
115
115
  end
116
116
 
@@ -118,7 +118,7 @@ module Buildr
118
118
  if project.lockjar_dsl && !File.exists?( Buildr.project_to_lockfile(project) )
119
119
  raise "#{Buildr.project_to_lockfile(project)} does not exist, run #{project.name}:lockjar:lock first"
120
120
  end
121
- jars = ::LockJar.list( Buildr.project_to_lockfile(project), ['compile', 'test', 'runtime'] )
121
+ jars = ::LockJar.list( Buildr.project_to_lockfile(project), ['test'] )
122
122
 
123
123
  project.test.compile.with( jars )
124
124
  project.test.with( jars )
@@ -128,10 +128,10 @@ module Buildr
128
128
  if project.lockjar_dsl && !File.exists?( Buildr.project_to_lockfile(project) )
129
129
  raise "#{Buildr.project_to_lockfile(project)} does not exist, run #{project.name}:lockjar:lock first"
130
130
  end
131
- jars = ::LockJar.list( Buildr.project_to_lockfile(project), ['compile', 'runtime'] )
131
+ jars = ::LockJar.list( Buildr.project_to_lockfile(project), ['default'] )
132
132
  project.compile.with( jars )
133
133
 
134
- jars = ::LockJar.list( Buildr.project_to_lockfile(project), ['compile', 'test', 'runtime'] )
134
+ jars = ::LockJar.list( Buildr.project_to_lockfile(project), ['test'] )
135
135
  project.test.compile.with( jars )
136
136
  end
137
137
  end
@@ -0,0 +1,155 @@
1
+ require 'lock_jar'
2
+ require 'lock_jar/registry'
3
+ require 'lock_jar/domain/lockfile'
4
+ require 'lock_jar/domain/dsl'
5
+ require 'lock_jar/domain/gem_dsl'
6
+ require 'lock_jar/domain/jarfile_dsl'
7
+ require 'lock_jar/domain/dsl_helper'
8
+
9
+ module LockJar
10
+
11
+ class Bundler
12
+
13
+ class << self
14
+
15
+ attr_accessor :skip_lock
16
+
17
+ def load(*groups)
18
+ if groups && !groups.empty? && File.exists?( 'Jarfile.lock')
19
+
20
+ lockfile = LockJar::Domain::Lockfile.read( 'Jarfile.lock' )
21
+
22
+ # expand merged paths to include gem base path
23
+ unless lockfile.merged.empty?
24
+ lockfile.merged = LockJar::Bundler.expand_gem_paths( lockfile.merged )
25
+ end
26
+
27
+ LockJar.load( lockfile, groups )
28
+
29
+ if ENV["DEBUG"]
30
+ puts "[LockJar] Loaded Jars for #{groups.inspect}: #{LockJar::Registry.instance.loaded_jars.inspect}"
31
+ end
32
+ end
33
+ end
34
+
35
+ def expand_gem_paths(merged)
36
+
37
+ merged_gem_paths = []
38
+ Gem.path.each do |gem_root|
39
+ merged.each do |merge|
40
+ # merged gems follow the notation: gem:gemname:path
41
+ if merge.start_with? 'gem:'
42
+ gem_path = merge.gsub(/^gem:.+:/, '')
43
+ gem_path = File.join( gem_root, gem_path )
44
+ if File.exists? gem_path
45
+ merged_gem_paths << gem_path
46
+ end
47
+ end
48
+ end
49
+ end
50
+
51
+ merged_gem_paths
52
+ end
53
+ end
54
+ end
55
+
56
+ end
57
+
58
+ module Bundler
59
+ class << self
60
+ alias :_lockjar_extended_require :require
61
+ def require(*groups)
62
+ LockJar::Bundler.load(*groups)
63
+
64
+ LockJar::Bundler.skip_lock = true
65
+
66
+ _lockjar_extended_require
67
+ end
68
+
69
+ alias :_lockjar_extended_setup :setup
70
+ def setup(*groups)
71
+ LockJar::Bundler.load(*groups)
72
+
73
+ LockJar::Bundler.skip_lock = true
74
+
75
+ _lockjar_extended_setup
76
+ end
77
+ end
78
+
79
+ class Runtime
80
+
81
+ alias :_lockjar_extended_require :require
82
+ def require(*groups)
83
+ LockJar::Bundler.load(*groups)
84
+
85
+ LockJar::Bundler.skip_lock = true
86
+
87
+ _lockjar_extended_require
88
+ end
89
+
90
+ alias :_lockjar_extended_setup :setup
91
+ def setup(*groups)
92
+ LockJar::Bundler.load(*groups)
93
+
94
+ LockJar::Bundler.skip_lock = true
95
+
96
+ _lockjar_extended_setup
97
+ end
98
+ end
99
+
100
+ class Definition
101
+ alias :_lockjar_extended_to_lock :to_lock
102
+ def to_lock
103
+ to_lock = _lockjar_extended_to_lock
104
+
105
+ if LockJar::Bundler.skip_lock != true
106
+ definition = Bundler.definition
107
+ #if !definition.send( :nothing_changed? )
108
+ gems_with_jars = []
109
+
110
+ # load local Jarfile
111
+ if File.exists?( 'Jarfile' )
112
+ dsl = LockJar::Domain::JarfileDsl.create( File.expand_path( 'Jarfile' ) )
113
+ gems_with_jars << 'jarfile:Jarfile'
114
+ # Create new Dsl
115
+ else
116
+ dsl = LockJar::Domain::Dsl.new
117
+ end
118
+
119
+ definition.groups.each do |group|
120
+ if ENV["DEBUG"]
121
+ puts "[LockJar] Group #{group}:"
122
+ end
123
+
124
+ definition.specs_for( [group] ).each do |spec|
125
+ gem_dir = spec.gem_dir
126
+
127
+ jarfile = File.join( gem_dir, "Jarfile" )
128
+
129
+ if File.exists?( jarfile )
130
+ gems_with_jars << "gem:#{spec.name}"
131
+
132
+ if ENV["DEBUG"]
133
+ puts "[LockJar] #{spec.name} has Jarfile"
134
+ end
135
+
136
+ spec_dsl = LockJar::Domain::GemDsl.create( spec, "Jarfile" )
137
+
138
+ dsl = LockJar::Domain::DslHelper.merge( dsl, spec_dsl )
139
+ end
140
+ end
141
+
142
+ end
143
+
144
+ puts "[LockJar] Locking Jars for: #{gems_with_jars.inspect}"
145
+ LockJar.lock( dsl )
146
+ #elsif ENV["DEBUG"]
147
+ # puts "[LockJar] Locking skiped, Gemfile has not changed"
148
+ #end
149
+ end
150
+
151
+ to_lock
152
+ end
153
+
154
+ end
155
+ end
@@ -0,0 +1,117 @@
1
+ # Licensed to the Apache Software Foundation (ASF) under one or more
2
+ # contributor license agreements. See the NOTICE file distributed with this
3
+ # work for additional information regarding copyright ownership. The ASF
4
+ # licenses this file to you under the Apache License, Version 2.0 (the
5
+ # "License"); you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
12
+ # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
13
+ # License for the specific language governing permissions and limitations under
14
+ # the License.
15
+
16
+ require 'set'
17
+ require 'lock_jar/maven'
18
+ require 'naether/notation'
19
+
20
+ module LockJar
21
+ module Domain
22
+
23
+
24
+ class Artifact
25
+ include Comparable
26
+ attr_reader :type
27
+
28
+ def <=>(another_artifact)
29
+ if another_artifact.is_a? Artifact
30
+ to_urn <=> another_artifact.to_urn
31
+ else
32
+ to_urn <=> another_artifact.to_s
33
+ end
34
+ end
35
+
36
+ end
37
+
38
+ class Jar < Artifact
39
+ attr_reader :notation
40
+
41
+ def initialize( notation )
42
+ @type = 'jar'
43
+ @notation = Naether::Notation.new( notation ).to_notation
44
+ end
45
+
46
+ def to_urn
47
+ "jar:#{notation}"
48
+ end
49
+
50
+ def to_dep
51
+ notation
52
+ end
53
+ end
54
+
55
+ class Local < Artifact
56
+ attr_reader :path
57
+ def initialize( path )
58
+ @type = 'local'
59
+ @path = path
60
+ end
61
+
62
+ def to_urn
63
+ "local:#{path}"
64
+ end
65
+
66
+ def to_dep
67
+ path
68
+ end
69
+ end
70
+
71
+ class Pom < Artifact
72
+ attr_reader :path, :scopes
73
+
74
+ def initialize( _path, _scopes = ['compile','runtime'] )
75
+ @type = 'pom'
76
+ @path = _path
77
+ @scopes = _scopes
78
+ end
79
+
80
+ def to_urn
81
+ "pom:#{path}"
82
+ end
83
+
84
+ def to_dep
85
+ { path => scopes }
86
+ end
87
+
88
+ def notations
89
+ LockJar::Maven.dependencies( path, scopes )
90
+ end
91
+
92
+ def ==(another_artifact)
93
+ self.<=>(another_artifact) == 0
94
+ end
95
+
96
+ def <=>(another_artifact)
97
+ if another_artifact.is_a? Pom
98
+ if to_urn == another_artifact.to_urn
99
+ return 0 if Set.new(scopes) == Set.new(another_artifact.scopes)
100
+
101
+ # XXX: this is not a reliable way to compare.
102
+ if scopes.size > another_artifact.scopes.size
103
+ return 1
104
+ else
105
+ return -1
106
+ end
107
+ else
108
+ to_urn <=> another_artifact.to_urn
109
+ end
110
+ else
111
+ super
112
+ end
113
+ end
114
+ end
115
+
116
+ end
117
+ end