physique 0.3.0 → 0.3.1
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 +8 -8
- data/Gemfile.lock +6 -13
- data/lib/physique/solution.rb +8 -4
- data/lib/physique/task_builders/build.rb +4 -4
- data/lib/physique/task_builders/default.rb +2 -2
- data/lib/physique/task_builders/fluent_migrator.rb +150 -104
- data/lib/physique/task_builders/nuget.rb +4 -4
- data/lib/physique/task_builders/octopus.rb +30 -33
- data/lib/physique/task_builders/publish_nugets.rb +33 -37
- data/lib/physique/task_builders/test.rb +2 -8
- data/lib/physique/tasks_builder.rb +2 -0
- data/lib/physique/tool_locator.rb +2 -2
- data/lib/physique/version.rb +1 -1
- data/physique.gemspec +2 -1
- data/spec/fluent_migrator_config_spec.rb +42 -0
- metadata +22 -8
- data/spec/config_spec.rb +0 -22
checksums.yaml
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
---
|
2
2
|
!binary "U0hBMQ==":
|
3
3
|
metadata.gz: !binary |-
|
4
|
-
|
4
|
+
YzZlZWQ4M2U1ZjFkNTYyZDhhNDViZWM1MmUzZjA4NDRkNWJmOGI5Mg==
|
5
5
|
data.tar.gz: !binary |-
|
6
|
-
|
6
|
+
YWJmNTM0ZGM5OWQxMDU0ZDhmOGJhYTJmZDRlNTg3OGEyYTY2MGRjYw==
|
7
7
|
SHA512:
|
8
8
|
metadata.gz: !binary |-
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
MzQxM2I4NmNiMWQ0OWU3ZDQ2ZDlkMGNhNzlmMTJmYjA3ZTkzMzdkMjMwNjQ1
|
10
|
+
Y2Q5ZDBjOGE2YzYyMDg1NWUwYTdkMjJjNDM0NTlhY2I2NmFhMGEyNGI3MzIw
|
11
|
+
ZmY5MDZmMDEwNGRhNWQ2ZGUyZTA5ZDYxYWRiMTRlM2JiNzIwNDI=
|
12
12
|
data.tar.gz: !binary |-
|
13
|
-
|
14
|
-
|
15
|
-
|
13
|
+
NzE0ZTM4YmU2MTU5M2E1YWQyNWVhZmNlNDc1ZTA0Mjc5MGNlZjI5NGE3NGJh
|
14
|
+
MmZiM2RkNTA5YmUwMzkyYTg1OWJiZTVmMjNhNzIwMzE3M2Q3NWU2ODI1ZGYz
|
15
|
+
NDBmODVjN2NhMDNhMWM2OGMxYWQ3YmFjZTgzYjRiNTk5M2NiNmQ=
|
data/Gemfile.lock
CHANGED
@@ -1,33 +1,27 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
physique (0.3.
|
4
|
+
physique (0.3.1)
|
5
5
|
activesupport (~> 4.1)
|
6
|
-
albacore (
|
6
|
+
albacore (~> 2.3)
|
7
7
|
map (~> 6.5)
|
8
|
+
rake (~> 10)
|
8
9
|
|
9
10
|
GEM
|
10
11
|
remote: https://rubygems.org/
|
11
12
|
specs:
|
12
|
-
ProcessPilot (2.0.0.20120301)
|
13
|
-
rUtilAnts (>= 1.0)
|
14
13
|
activesupport (4.2.0)
|
15
14
|
i18n (~> 0.7)
|
16
15
|
json (~> 1.7, >= 1.7.7)
|
17
16
|
minitest (~> 5.1)
|
18
17
|
thread_safe (~> 0.3, >= 0.3.4)
|
19
18
|
tzinfo (~> 1.1)
|
20
|
-
albacore (2.
|
21
|
-
ProcessPilot (~> 2.0)
|
22
|
-
facter (~> 1.7)
|
23
|
-
highline (~> 1.6)
|
19
|
+
albacore (2.3.15)
|
24
20
|
map (~> 6.5)
|
25
21
|
nokogiri (~> 1.5)
|
26
|
-
rake (
|
27
|
-
semver2 (~> 3.
|
22
|
+
rake (~> 10)
|
23
|
+
semver2 (~> 3.4)
|
28
24
|
diff-lcs (1.2.5)
|
29
|
-
facter (1.7.6)
|
30
|
-
highline (1.6.21)
|
31
25
|
i18n (0.7.0)
|
32
26
|
json (1.8.2)
|
33
27
|
map (6.5.5)
|
@@ -35,7 +29,6 @@ GEM
|
|
35
29
|
minitest (5.5.1)
|
36
30
|
nokogiri (1.6.6.2-x86-mingw32)
|
37
31
|
mini_portile (~> 0.6.0)
|
38
|
-
rUtilAnts (2.0.0.20130827)
|
39
32
|
rake (10.4.2)
|
40
33
|
rspec (2.14.1)
|
41
34
|
rspec-core (~> 2.14.0)
|
data/lib/physique/solution.rb
CHANGED
@@ -30,8 +30,12 @@ module Physique
|
|
30
30
|
end
|
31
31
|
|
32
32
|
def fluently_migrate
|
33
|
-
@
|
34
|
-
|
33
|
+
@dbs_to_migrate = @dbs_to_migrate || []
|
34
|
+
|
35
|
+
migrator = FluentMigratorConfig.new
|
36
|
+
yield migrator
|
37
|
+
|
38
|
+
@dbs_to_migrate << migrator
|
35
39
|
end
|
36
40
|
|
37
41
|
alias_method :database, :fluently_migrate
|
@@ -52,9 +56,9 @@ module Physique
|
|
52
56
|
nuget: @nuget && @nuget.opts,
|
53
57
|
compile: @compilation && @compilation.opts,
|
54
58
|
test: @tests && @tests.opts,
|
55
|
-
|
59
|
+
fluent_migrator_dbs: @dbs_to_migrate && @dbs_to_migrate.map {|db| db.opts },
|
56
60
|
octopus: @octopus && @octopus.opts,
|
57
|
-
publish_nugets: @publish_nugets && @publish_nugets.opts
|
61
|
+
publish_nugets: @publish_nugets && @publish_nugets.opts
|
58
62
|
})
|
59
63
|
end
|
60
64
|
end
|
@@ -41,13 +41,13 @@ module Physique
|
|
41
41
|
def add_compile_tasks
|
42
42
|
block = lambda &method(:configure_build)
|
43
43
|
|
44
|
-
|
45
|
-
|
44
|
+
desc 'Builds the solution'
|
45
|
+
build :compile => [ :restore ], &block.curry.(%w(Clean Rebuild))
|
46
46
|
|
47
47
|
namespace :compile do
|
48
48
|
solution.compile.targets.each do |t|
|
49
|
-
|
50
|
-
|
49
|
+
desc "Builds the solution using the #{t} target"
|
50
|
+
build t.downcase, &block.curry.(t)
|
51
51
|
end
|
52
52
|
end
|
53
53
|
end
|
@@ -1,8 +1,8 @@
|
|
1
1
|
module Physique
|
2
2
|
class DefaultTasksBuilder < TasksBuilder
|
3
3
|
def build_tasks
|
4
|
-
|
5
|
-
|
4
|
+
task :default => [ :test ]
|
5
|
+
task :ci => [ :versionizer, :test ]
|
6
6
|
end
|
7
7
|
end
|
8
8
|
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
require 'active_support/core_ext/string'
|
2
|
+
require 'active_support/core_ext/array'
|
1
3
|
require 'physique/project'
|
2
4
|
|
3
5
|
module Physique
|
@@ -12,7 +14,8 @@ module Physique
|
|
12
14
|
:instance, # Server instance name
|
13
15
|
:name, # Database name
|
14
16
|
:scripts_dir, # Scripts folder to examine to create tasks
|
15
|
-
:dialect
|
17
|
+
:dialect, # Dialect to use for generating SQL
|
18
|
+
:task_alias # Alias used to construct rake task names
|
16
19
|
|
17
20
|
def initialize
|
18
21
|
@lang = :cs
|
@@ -20,135 +23,157 @@ module Physique
|
|
20
23
|
end
|
21
24
|
|
22
25
|
def opts
|
26
|
+
validate_config
|
27
|
+
|
23
28
|
Map.new({
|
24
|
-
exe: @exe,
|
25
29
|
instance: @instance,
|
26
30
|
name: @name,
|
27
31
|
project: @project,
|
28
32
|
project_file: Physique::Project.get_path(@project, @lang),
|
29
33
|
lang: @lang,
|
34
|
+
task_alias: (@task_alias || @name)
|
30
35
|
}).apply(
|
31
36
|
lang: :cs,
|
32
37
|
project_dir: "src/#{@project}",
|
33
38
|
scripts_dir: "src/#{@project}/#{@scripts_dir}"
|
34
39
|
)
|
35
40
|
end
|
41
|
+
|
42
|
+
private
|
43
|
+
|
44
|
+
def validate_config
|
45
|
+
raise ArgumentError, 'You must specify a database instance' if @instance.blank?
|
46
|
+
raise ArgumentError, 'You must specify a database name' if @name.blank?
|
47
|
+
raise ArgumentError, 'You must specify the FluentMigrator project' if @project.blank?
|
48
|
+
raise ArgumentError, 'You must specify a language' if @lang.blank?
|
49
|
+
raise ArgumentError, 'You must specify a scripts_dir' if @scripts_dir.blank?
|
50
|
+
end
|
36
51
|
end
|
37
52
|
|
38
53
|
class FluentMigratorTasksBuilder < TasksBuilder
|
39
54
|
def build_tasks
|
40
|
-
|
41
|
-
return if
|
55
|
+
dbs = solution.fluent_migrator_dbs
|
56
|
+
return if dbs.empty?
|
42
57
|
|
43
|
-
|
44
|
-
|
45
|
-
add_migrator_tasks
|
46
|
-
add_workflow_tasks
|
47
|
-
add_new_migration_task
|
48
|
-
end
|
49
|
-
|
50
|
-
private
|
58
|
+
dbs.each do |db|
|
59
|
+
task_namespace = db_task_name(db)
|
51
60
|
|
52
|
-
def add_script_tasks
|
53
|
-
FileList["#{@options.scripts_dir}/*.sql"].each do |f|
|
54
61
|
namespace :db do
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
62
|
+
namespace task_namespace do
|
63
|
+
# First look at the scripts_dir and add a task for every sql file that you find
|
64
|
+
defaults = default_tasks(db)
|
65
|
+
add_script_tasks db, defaults
|
66
|
+
|
67
|
+
# Then add the default minimum required tasks in case the scripts_dir didn't contain them
|
68
|
+
add_default_db_tasks db, defaults
|
69
|
+
|
70
|
+
# Add the migrate and rollback tasks
|
71
|
+
add_migrator_tasks db
|
72
|
+
|
73
|
+
# Add the tasks to create the db from scratch
|
74
|
+
add_create_tasks
|
75
|
+
|
76
|
+
# Add a task to create a new migration in the db project
|
77
|
+
add_new_migration_task db
|
60
78
|
end
|
61
|
-
task.add_description get_script_task_description(task_name, @options.scripts_dir)
|
62
79
|
end
|
80
|
+
|
81
|
+
# Rebuild the databases when running tests
|
82
|
+
task :test => "db:#{task_namespace}:rebuild"
|
63
83
|
end
|
84
|
+
|
85
|
+
alias_default_tasks
|
64
86
|
end
|
65
87
|
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
88
|
+
private
|
89
|
+
|
90
|
+
def add_script_tasks(db, defaults)
|
91
|
+
FileList["#{db.scripts_dir}/*.sql"].each do |f|
|
92
|
+
task_name = File.basename(f, '.*')
|
93
|
+
|
94
|
+
desc get_script_task_description(defaults, task_name, db)
|
95
|
+
sqlcmd task_name do |s|
|
96
|
+
s.file = f
|
97
|
+
s.server_name = db.instance
|
98
|
+
s.set_variable 'DATABASE_NAME', db.name
|
77
99
|
end
|
78
100
|
end
|
79
101
|
end
|
80
102
|
|
81
|
-
def
|
82
|
-
|
83
|
-
|
84
|
-
seed: 'SELECT 1' } # This is a no-op
|
103
|
+
def get_script_task_description(defaults, task_name, db)
|
104
|
+
default_task = defaults[task_name.to_sym]
|
105
|
+
default_task ? default_task[:description] : "Executes #{task_name}.sql on #{db.name} in the #{db.scripts_dir} folder."
|
85
106
|
end
|
86
107
|
|
87
|
-
def
|
88
|
-
|
108
|
+
def add_default_db_tasks(db, defaults)
|
109
|
+
defaults.each do |task_name,task_details|
|
110
|
+
unless Rake::Task.task_defined? "db:#{db_task_name(db)}:#{task_name.to_s}"
|
111
|
+
desc task_details[:description]
|
112
|
+
sqlcmd task_name do |s|
|
113
|
+
s.command = task_details[:command]
|
114
|
+
s.server_name = db.instance
|
115
|
+
s.set_variable 'DATABASE_NAME', db.name
|
116
|
+
end
|
117
|
+
end
|
118
|
+
end
|
89
119
|
end
|
90
120
|
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
seed: 'Seeds the database with test data' }
|
121
|
+
def default_tasks(database)
|
122
|
+
{ create: { description: 'Create the database', command: "CREATE DATABASE #{database}" },
|
123
|
+
drop: { description: 'Drop the database', command: "DROP DATABASE #{database}"},
|
124
|
+
seed: { description: 'Seed the database with test data', command: 'SELECT 1' } } # This is a no-op
|
96
125
|
end
|
97
126
|
|
98
|
-
def add_migrator_tasks
|
127
|
+
def add_migrator_tasks(db)
|
99
128
|
require 'physique/tasks/fluent_migrator'
|
100
129
|
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
end
|
130
|
+
build :compile_db do |b|
|
131
|
+
b.target = [ 'Build' ]
|
132
|
+
b.file = db.project_file
|
133
|
+
b.prop 'Configuration', solution.compile.configuration
|
134
|
+
b.logging = solution.compile.logging
|
135
|
+
end
|
108
136
|
|
109
|
-
|
137
|
+
block = lambda &method(:configure_migration)
|
110
138
|
|
111
|
-
|
112
|
-
|
113
|
-
|
139
|
+
# Migrate up
|
140
|
+
desc 'Migrate database to the latest version'
|
141
|
+
fluent_migrator :migrate => [ :compile_db ], &block.curry.(db, 'migrate:up')
|
114
142
|
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
143
|
+
# Migrate down
|
144
|
+
desc 'Rollback the database to the previous version'
|
145
|
+
fluent_migrator :rollback => [ :compile_db ], &block.curry.(db, 'rollback')
|
146
|
+
|
147
|
+
# Try the migration
|
148
|
+
desc 'Migrate and then immediately rollback'
|
149
|
+
task :try => [ :migrate, :rollback ]
|
119
150
|
end
|
120
151
|
|
121
|
-
def configure_migration(task, config)
|
122
|
-
config.instance =
|
123
|
-
config.database =
|
152
|
+
def configure_migration(db, task, config)
|
153
|
+
config.instance = db.instance
|
154
|
+
config.database = db.name
|
124
155
|
config.task = task
|
125
|
-
config.dll = migration_dll
|
126
|
-
config.exe = locate_tool(tool_in_output_folder || tool_in_nuget_package)
|
156
|
+
config.dll = migration_dll db
|
157
|
+
config.exe = locate_tool(tool_in_output_folder(db) || tool_in_nuget_package)
|
127
158
|
config.output_to_file
|
128
159
|
end
|
129
160
|
|
130
|
-
def
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
task.add_description 'Migrate and then immediately rollback'
|
135
|
-
|
136
|
-
# Setup the database from nothing
|
137
|
-
task = Rake::Task.define_task :setup => [ :create, :migrate, :seed ]
|
138
|
-
task.add_description 'Create the database and run all migrations'
|
161
|
+
def add_create_tasks
|
162
|
+
# Setup the database from nothing
|
163
|
+
desc 'Create the database and run all migrations'
|
164
|
+
task :setup => [ :create, :migrate, :seed ]
|
139
165
|
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
end
|
166
|
+
# Drop and recreate the database
|
167
|
+
desc 'Drop and recreate the database'
|
168
|
+
task :rebuild => [ :drop, :setup ]
|
144
169
|
end
|
145
170
|
|
146
|
-
def migration_dll
|
147
|
-
"#{
|
171
|
+
def migration_dll(db)
|
172
|
+
"#{db.project_dir}/bin/#{solution.compile.configuration}/#{db.project}.dll"
|
148
173
|
end
|
149
174
|
|
150
|
-
def tool_in_output_folder
|
151
|
-
existing_path "#{
|
175
|
+
def tool_in_output_folder(db)
|
176
|
+
existing_path "#{db.project_dir}/bin/#{solution.compile.configuration}/Migrate.exe"
|
152
177
|
end
|
153
178
|
|
154
179
|
def tool_in_nuget_package
|
@@ -160,33 +185,33 @@ module Physique
|
|
160
185
|
nil
|
161
186
|
end
|
162
187
|
|
163
|
-
def
|
164
|
-
|
165
|
-
|
166
|
-
name, description = args[:name], args[:description]
|
188
|
+
def db_task_name(db)
|
189
|
+
db.task_alias.downcase
|
190
|
+
end
|
167
191
|
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
].join "\n\n"
|
173
|
-
end
|
192
|
+
def add_new_migration_task(db)
|
193
|
+
desc 'Create a new migration file with the specified name'
|
194
|
+
task :new_migration, :name, :description do |t, args|
|
195
|
+
name, description = args[:name], args[:description]
|
174
196
|
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
197
|
+
unless name
|
198
|
+
abort [
|
199
|
+
%Q{Usage: rake "#{t.name}[name[,description]]"},
|
200
|
+
desc,
|
201
|
+
].join "\n\n"
|
202
|
+
end
|
179
203
|
|
180
|
-
|
181
|
-
|
204
|
+
# Save the new migration file
|
205
|
+
version = migration_version
|
206
|
+
migration_file_name = "#{version}_#{name}.cs"
|
207
|
+
migration_content = migration_template(version, name, description, db.project)
|
208
|
+
save_file migration_content, "#{db.project_dir}/Migrations/#{migration_file_name}"
|
182
209
|
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
end
|
210
|
+
# Add the new migration file to the project
|
211
|
+
Albacore::Project.new(db.project_file).tap do |p|
|
212
|
+
p.add_compile_node :Migrations, migration_file_name
|
213
|
+
p.save
|
188
214
|
end
|
189
|
-
task.add_description 'Creates a new migration file with the specified name'
|
190
215
|
end
|
191
216
|
end
|
192
217
|
|
@@ -198,7 +223,6 @@ module Physique
|
|
198
223
|
description = ", \"#{description}\"" unless description.nil?
|
199
224
|
return <<TEMPLATE
|
200
225
|
using FluentMigrator;
|
201
|
-
using FluentMigrator.Runner;
|
202
226
|
|
203
227
|
namespace #{project_name}.Migrations
|
204
228
|
{
|
@@ -214,7 +238,7 @@ namespace #{project_name}.Migrations
|
|
214
238
|
{
|
215
239
|
// Add migration rollback code here
|
216
240
|
}
|
217
|
-
}
|
241
|
+
}rake install
|
218
242
|
}
|
219
243
|
TEMPLATE
|
220
244
|
end
|
@@ -223,5 +247,27 @@ TEMPLATE
|
|
223
247
|
raise "#{file_path} already exists, cancelling" if File.exists? file_path
|
224
248
|
File.open(file_path, 'w') { |f| f.write(content) }
|
225
249
|
end
|
250
|
+
|
251
|
+
def alias_default_tasks
|
252
|
+
Rake.application.tasks
|
253
|
+
.select {|t| t.name.starts_with?('db') && GLOBAL_TASKS.has_key?(db_command(t))}
|
254
|
+
.group_by {|t| db_command(t) }
|
255
|
+
.each do |command,tasks|
|
256
|
+
desc GLOBAL_TASKS[command]
|
257
|
+
task "db:#{command}" => tasks.map {|t| t.name }
|
258
|
+
end
|
259
|
+
end
|
260
|
+
|
261
|
+
def db_command(task)
|
262
|
+
task.name.split(':').last.to_sym
|
263
|
+
end
|
264
|
+
|
265
|
+
GLOBAL_TASKS = {
|
266
|
+
create: 'Create all databases',
|
267
|
+
drop: 'Drop all databases',
|
268
|
+
seed: 'Seed all databases with test data',
|
269
|
+
setup: 'Build all databases and migrate them to the latest version',
|
270
|
+
rebuild: 'Drop and recreate all databases',
|
271
|
+
migrate: 'Migrates all databases to the latest version' }
|
226
272
|
end
|
227
273
|
end
|
@@ -29,17 +29,17 @@ module Physique
|
|
29
29
|
|
30
30
|
class NugetTasksBuilder < TasksBuilder
|
31
31
|
def build_tasks
|
32
|
-
|
32
|
+
add_restore_task
|
33
33
|
end
|
34
34
|
|
35
35
|
private
|
36
36
|
|
37
|
-
def
|
38
|
-
|
37
|
+
def add_restore_task
|
38
|
+
desc 'Restores all nugets as per the packages.config files'
|
39
|
+
nugets_restore :restore do |r|
|
39
40
|
r.out = solution.nuget.restore_location
|
40
41
|
r.exe = solution.nuget.exe
|
41
42
|
end
|
42
|
-
task.add_description 'Restores all nugets as per the packages.config files'
|
43
43
|
end
|
44
44
|
end
|
45
45
|
end
|
@@ -79,8 +79,10 @@ module Physique
|
|
79
79
|
return if @options.nil?
|
80
80
|
return if @options.apps.blank?
|
81
81
|
|
82
|
-
|
83
|
-
|
82
|
+
namespace :octo do
|
83
|
+
add_octopus_package_tasks
|
84
|
+
add_octopus_publish_tasks
|
85
|
+
end
|
84
86
|
|
85
87
|
if @options.alias_tasks
|
86
88
|
add_task_aliases
|
@@ -91,57 +93,52 @@ module Physique
|
|
91
93
|
|
92
94
|
def add_octopus_package_tasks
|
93
95
|
@options.apps.each do |a|
|
94
|
-
namespace :
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
end
|
106
|
-
task.add_description "Package #{a.project} for Octopus deployment"
|
96
|
+
namespace :package do
|
97
|
+
desc "Package #{a.project} for Octopus deployment"
|
98
|
+
octopus_pack a.name => [:versionizer, :test] do |o|
|
99
|
+
ensure_output_location solution.nuget.build_location
|
100
|
+
|
101
|
+
o.project_file = a.project_file
|
102
|
+
o.type = a.type
|
103
|
+
o.configuration = solution.compile.configuration
|
104
|
+
o.exe = solution.nuget.exe
|
105
|
+
o.out = solution.nuget.build_location
|
106
|
+
o.metadata = a.metadata
|
107
107
|
end
|
108
|
-
|
109
|
-
task = Rake::Task.define_task :package => all_octopus_app_tasks('package')
|
110
|
-
task.add_description 'Package all applications'
|
111
108
|
end
|
112
109
|
end
|
110
|
+
|
111
|
+
desc 'Package all applications'
|
112
|
+
task :package => all_octopus_app_tasks('package')
|
113
113
|
end
|
114
114
|
|
115
115
|
def add_octopus_publish_tasks
|
116
116
|
nuget = solution.nuget
|
117
117
|
|
118
118
|
@options.apps.each do |a|
|
119
|
-
namespace :
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
end
|
125
|
-
task.add_description "Publish #{a.project} app to Octopus Server"
|
119
|
+
namespace :publish do
|
120
|
+
desc "Publish #{a.project} app to Octopus Server"
|
121
|
+
task a.name => [ "package:#{a.name}" ] do
|
122
|
+
package_location = Albacore::Paths.normalise_slashes "#{nuget.build_location}/#{a.project}.#{a.metadata.version}.nupkg"
|
123
|
+
sh "#{nuget.exe} push #{package_location} -ApiKey #{@options.api_key} -Source #{@options.server}"
|
126
124
|
end
|
127
|
-
|
128
|
-
task = Rake::Task.define_task :publish => all_octopus_app_tasks('publish')
|
129
|
-
task.add_description 'Publish all apps to Octopus Server'
|
130
125
|
end
|
131
126
|
end
|
127
|
+
|
128
|
+
desc 'Publish all apps to Octopus Server'
|
129
|
+
task :publish => all_octopus_app_tasks('publish')
|
132
130
|
end
|
133
131
|
|
134
132
|
def all_octopus_app_tasks(task)
|
135
|
-
# It is assumed that this is called within the octo namespace
|
136
133
|
@options.apps.map { |a| "#{task}:#{a.name}" }
|
137
134
|
end
|
138
135
|
|
139
136
|
def add_task_aliases
|
140
|
-
|
141
|
-
task
|
137
|
+
desc 'Package all applications'
|
138
|
+
task :package => [ 'octo:package' ]
|
142
139
|
|
143
|
-
|
144
|
-
task
|
140
|
+
desc 'Publish apps to Octopus Server'
|
141
|
+
task :publish => [ 'octo:publish' ]
|
145
142
|
end
|
146
143
|
end
|
147
144
|
end
|
@@ -91,9 +91,11 @@ module Physique
|
|
91
91
|
@options = solution.publish_nugets
|
92
92
|
return if @options.nil?
|
93
93
|
|
94
|
-
|
95
|
-
|
96
|
-
|
94
|
+
namespace :nuget do
|
95
|
+
add_package_nugets_task
|
96
|
+
add_publish_nugets_task
|
97
|
+
add_publish_nugets_local_task
|
98
|
+
end
|
97
99
|
|
98
100
|
if @options.alias_tasks
|
99
101
|
add_task_aliases
|
@@ -103,39 +105,35 @@ module Physique
|
|
103
105
|
private
|
104
106
|
|
105
107
|
def add_package_nugets_task
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
end
|
108
|
+
desc 'Package all nugets'
|
109
|
+
nugets_pack :package => [ :versionizer, :test ] do |p|
|
110
|
+
ensure_output_location solution.nuget.build_location
|
111
|
+
|
112
|
+
p.configuration = solution.compile.configuration
|
113
|
+
p.out = solution.nuget.build_location
|
114
|
+
p.exe = solution.nuget.exe
|
115
|
+
p.files = @options.project_files
|
116
|
+
p.gen_symbols if @options.gen_symbols
|
117
|
+
p.with_metadata do |m|
|
118
|
+
@options.metadata.set_fields.each do |attr|
|
119
|
+
eval "m.#{attr}= @options.metadata.#{attr}"
|
119
120
|
end
|
120
121
|
end
|
121
|
-
task.add_description 'Package all nugets'
|
122
122
|
end
|
123
123
|
end
|
124
124
|
|
125
125
|
def add_publish_nugets_task
|
126
|
-
|
127
|
-
|
128
|
-
|
126
|
+
desc 'Publish nuget packages to feed'
|
127
|
+
task :publish => [ 'nuget:package' ] do
|
128
|
+
raise ArgumentError, 'You must specify an :api_key to connect to the server' if @options.api_key.blank?
|
129
129
|
|
130
|
-
|
131
|
-
|
130
|
+
nuget_project_names.each do |p|
|
131
|
+
sh nuget_publish_command(p, 'nupkg', @options.feed_url)
|
132
132
|
|
133
|
-
|
134
|
-
|
135
|
-
end
|
133
|
+
if @options.gen_symbols
|
134
|
+
sh nuget_publish_command(p, 'symbols.nupkg', @options.symbols_feed_url)
|
136
135
|
end
|
137
136
|
end
|
138
|
-
task.add_description 'Publish nuget packages to feed'
|
139
137
|
end
|
140
138
|
end
|
141
139
|
|
@@ -146,13 +144,11 @@ module Physique
|
|
146
144
|
def add_publish_nugets_local_task
|
147
145
|
local_path = @options.local_path
|
148
146
|
|
149
|
-
namespace :
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
end
|
155
|
-
task.add_description 'Copy nuget packages to local path'
|
147
|
+
namespace :publish do
|
148
|
+
desc 'Copy nuget packages to local path'
|
149
|
+
task :local => [ 'nuget:package' ] do
|
150
|
+
ensure_output_location local_path
|
151
|
+
FileUtils.cp FileList["#{solution.nuget.build_location}/*"], local_path
|
156
152
|
end
|
157
153
|
end
|
158
154
|
end
|
@@ -162,11 +158,11 @@ module Physique
|
|
162
158
|
end
|
163
159
|
|
164
160
|
def add_task_aliases
|
165
|
-
|
166
|
-
task
|
161
|
+
desc 'Package all nugets'
|
162
|
+
task :package => [ 'nuget:package' ]
|
167
163
|
|
168
|
-
|
169
|
-
task
|
164
|
+
desc 'Publish nuget packages to feed'
|
165
|
+
task :publish => [ 'nuget:publish' ]
|
170
166
|
end
|
171
167
|
end
|
172
168
|
end
|
@@ -25,19 +25,13 @@ module Physique
|
|
25
25
|
configuration = solution.compile.configuration
|
26
26
|
package_dir = solution.nuget.restore_location
|
27
27
|
|
28
|
-
|
28
|
+
desc 'Run unit tests'
|
29
|
+
test_runner :test => :compile do |tests|
|
29
30
|
tests.files = FileList["**/*.Tests/bin/#{configuration}/*.Tests.dll"]
|
30
31
|
tests.exe = locate_tool("#{package_dir}/NUnit.Runners.*/tools/nunit-console.exe")
|
31
32
|
tests.parameters.add('/labels')
|
32
33
|
tests.parameters.add('/trace=Verbose')
|
33
34
|
end
|
34
|
-
task.add_description 'Run unit tests'
|
35
|
-
end
|
36
|
-
|
37
|
-
def test_dependencies
|
38
|
-
dependencies = [ :compile ]
|
39
|
-
dependencies << 'db:rebuild' unless solution.migrator.nil?
|
40
|
-
dependencies
|
41
35
|
end
|
42
36
|
end
|
43
37
|
end
|
@@ -19,10 +19,10 @@ module Physique
|
|
19
19
|
# FileList only correctly handles forward-slashes, even on Windows
|
20
20
|
paths = paths.gsub('\\', '/')
|
21
21
|
|
22
|
-
|
22
|
+
debug { "Extracting paths from the following pattern #{paths}" }
|
23
23
|
paths = FileList[paths] unless paths.respond_to?(:each)
|
24
24
|
|
25
|
-
|
25
|
+
debug { "Attempting to locate tool in the following paths #{paths}" }
|
26
26
|
opts = Map.options(options)
|
27
27
|
opts = opts.apply :find_latest => true
|
28
28
|
paths = paths.collect { |p| which(p) }.compact.sort
|
data/lib/physique/version.rb
CHANGED
data/physique.gemspec
CHANGED
@@ -20,7 +20,8 @@ Gem::Specification.new do |spec|
|
|
20
20
|
|
21
21
|
spec.add_development_dependency 'bundler'
|
22
22
|
spec.add_development_dependency 'rspec', '2.14.1'
|
23
|
+
spec.add_dependency 'rake', '~> 10'
|
23
24
|
spec.add_dependency 'activesupport', '~> 4.1'
|
24
25
|
spec.add_dependency 'map', '~> 6.5'
|
25
|
-
spec.add_dependency 'albacore', '2.
|
26
|
+
spec.add_dependency 'albacore', '~> 2.3'
|
26
27
|
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
require 'physique'
|
2
|
+
|
3
|
+
describe Physique::FluentMigratorConfig do
|
4
|
+
|
5
|
+
it 'should throw when config is missing required values' do
|
6
|
+
%w(instance= name= project= lang= scripts_dir=).each do |p|
|
7
|
+
expect {
|
8
|
+
default_config do |c|
|
9
|
+
c.send p, nil
|
10
|
+
end
|
11
|
+
}.to raise_error(ArgumentError)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
it 'should default to the cs programming language' do
|
16
|
+
project_name = 'Test.Database'
|
17
|
+
opts = default_config do |c|
|
18
|
+
c.project = 'Test.Database'
|
19
|
+
end
|
20
|
+
expect(opts.project_file).to eq("src/#{project_name}/#{project_name}.csproj")
|
21
|
+
end
|
22
|
+
|
23
|
+
it 'should find full project path when specifying the name and language' do
|
24
|
+
project_name = 'Test.Database'
|
25
|
+
opts = default_config do |c|
|
26
|
+
c.lang = :vb
|
27
|
+
end
|
28
|
+
|
29
|
+
expect(opts.project_file).to eq("src/#{project_name}/#{project_name}.vbproj")
|
30
|
+
end
|
31
|
+
|
32
|
+
def default_config
|
33
|
+
config = Physique::FluentMigratorConfig.new.tap do |c|
|
34
|
+
c.instance = '(local)'
|
35
|
+
c.name = 'TestDatabase'
|
36
|
+
c.project = 'Test.Database'
|
37
|
+
|
38
|
+
yield c if block_given?
|
39
|
+
end
|
40
|
+
config.opts
|
41
|
+
end
|
42
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: physique
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.3.
|
4
|
+
version: 0.3.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Robert Scaduto
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-02-
|
11
|
+
date: 2015-02-13 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -38,6 +38,20 @@ dependencies:
|
|
38
38
|
- - '='
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: 2.14.1
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: rake
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ~>
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '10'
|
48
|
+
type: :runtime
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ~>
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '10'
|
41
55
|
- !ruby/object:Gem::Dependency
|
42
56
|
name: activesupport
|
43
57
|
requirement: !ruby/object:Gem::Requirement
|
@@ -70,16 +84,16 @@ dependencies:
|
|
70
84
|
name: albacore
|
71
85
|
requirement: !ruby/object:Gem::Requirement
|
72
86
|
requirements:
|
73
|
-
- -
|
87
|
+
- - ~>
|
74
88
|
- !ruby/object:Gem::Version
|
75
|
-
version: 2.
|
89
|
+
version: '2.3'
|
76
90
|
type: :runtime
|
77
91
|
prerelease: false
|
78
92
|
version_requirements: !ruby/object:Gem::Requirement
|
79
93
|
requirements:
|
80
|
-
- -
|
94
|
+
- - ~>
|
81
95
|
- !ruby/object:Gem::Version
|
82
|
-
version: 2.
|
96
|
+
version: '2.3'
|
83
97
|
description: Beautiful builds for .NET projects
|
84
98
|
email:
|
85
99
|
- rscaduto@thirdwave.it
|
@@ -113,7 +127,7 @@ files:
|
|
113
127
|
- lib/physique/tool_locator.rb
|
114
128
|
- lib/physique/version.rb
|
115
129
|
- physique.gemspec
|
116
|
-
- spec/
|
130
|
+
- spec/fluent_migrator_config_spec.rb
|
117
131
|
- spec/project_spec.rb
|
118
132
|
- spec/publish_nugets_spec.rb
|
119
133
|
- spec/solution_spec.rb
|
@@ -148,7 +162,7 @@ specification_version: 4
|
|
148
162
|
summary: A conventional build framework supporting NUnit, FluentMigrator and Octopus
|
149
163
|
Deploy
|
150
164
|
test_files:
|
151
|
-
- spec/
|
165
|
+
- spec/fluent_migrator_config_spec.rb
|
152
166
|
- spec/project_spec.rb
|
153
167
|
- spec/publish_nugets_spec.rb
|
154
168
|
- spec/solution_spec.rb
|
data/spec/config_spec.rb
DELETED
@@ -1,22 +0,0 @@
|
|
1
|
-
require 'physique'
|
2
|
-
|
3
|
-
describe Physique::FluentMigratorConfig do
|
4
|
-
it 'should find full project path when specifying the name and language' do
|
5
|
-
project_name = 'Test.Database'
|
6
|
-
opts = Physique::FluentMigratorConfig.new.tap { |c|
|
7
|
-
c.project = project_name
|
8
|
-
c.lang = :vb
|
9
|
-
}.opts
|
10
|
-
|
11
|
-
expect(opts.project_file).to eq("src/#{project_name}/#{project_name}.vbproj")
|
12
|
-
end
|
13
|
-
|
14
|
-
it 'should default to the cs programming language' do
|
15
|
-
project_name = 'Test.Database'
|
16
|
-
opts = Physique::FluentMigratorConfig.new.tap { |c|
|
17
|
-
c.project = project_name
|
18
|
-
}.opts
|
19
|
-
|
20
|
-
expect(opts.project_file).to eq("src/#{project_name}/#{project_name}.csproj")
|
21
|
-
end
|
22
|
-
end
|