samus 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (52) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE +22 -0
  3. data/README.md +255 -0
  4. data/bin/samus +87 -0
  5. data/commands/build/archive-git-full +3 -0
  6. data/commands/build/archive-git-full.help.md +7 -0
  7. data/commands/build/archive-tgz +3 -0
  8. data/commands/build/archive-tgz.help.md +7 -0
  9. data/commands/build/archive-zip +3 -0
  10. data/commands/build/archive-zip.help.md +7 -0
  11. data/commands/build/fs-copy +3 -0
  12. data/commands/build/fs-copy.help.md +8 -0
  13. data/commands/build/fs-mkdir +3 -0
  14. data/commands/build/fs-mkdir.help.md +7 -0
  15. data/commands/build/fs-rmrf +3 -0
  16. data/commands/build/fs-rmrf.help.md +7 -0
  17. data/commands/build/fs-sedfiles +7 -0
  18. data/commands/build/fs-sedfiles.help.md +8 -0
  19. data/commands/build/gem-build +5 -0
  20. data/commands/build/gem-build.help.md +7 -0
  21. data/commands/build/git-archive +3 -0
  22. data/commands/build/git-archive.help.md +8 -0
  23. data/commands/build/git-commit +7 -0
  24. data/commands/build/git-commit.help.md +8 -0
  25. data/commands/build/git-merge +9 -0
  26. data/commands/build/git-merge.help.md +8 -0
  27. data/commands/build/npm-test +3 -0
  28. data/commands/build/npm-test.help.md +7 -0
  29. data/commands/build/rake-task +3 -0
  30. data/commands/build/rake-task.help.md +7 -0
  31. data/commands/publish/cf-invalidate +16 -0
  32. data/commands/publish/cf-invalidate.help.md +8 -0
  33. data/commands/publish/gem-push +6 -0
  34. data/commands/publish/gem-push.help.md +7 -0
  35. data/commands/publish/git-push +15 -0
  36. data/commands/publish/git-push.help.md +8 -0
  37. data/commands/publish/npm-publish +3 -0
  38. data/commands/publish/npm-publish.help.md +7 -0
  39. data/commands/publish/s3-put +13 -0
  40. data/commands/publish/s3-put.help.md +10 -0
  41. data/lib/samus.rb +37 -0
  42. data/lib/samus/action.rb +60 -0
  43. data/lib/samus/build_action.rb +46 -0
  44. data/lib/samus/builder.rb +101 -0
  45. data/lib/samus/command.rb +99 -0
  46. data/lib/samus/credentials.rb +48 -0
  47. data/lib/samus/publish_action.rb +7 -0
  48. data/lib/samus/publisher.rb +38 -0
  49. data/lib/samus/version.rb +3 -0
  50. data/samus.gemspec +13 -0
  51. data/samus.json +44 -0
  52. metadata +95 -0
@@ -0,0 +1,99 @@
1
+ module Samus
2
+ class Command
3
+ class << self
4
+ def command_paths; @@command_paths end
5
+
6
+ def list_commands(stage = nil)
7
+ stages = {}
8
+ command_paths.each do |path|
9
+ Dir.glob(File.join(path, '*', '*')).each do |dir|
10
+ type, name = *dir.split(File::SEPARATOR)[-2,2]
11
+ next if name =~ /\.md$/
12
+ next if stage && stage != type
13
+ (stages[type] ||= []).push(new(type, name))
14
+ end
15
+ end
16
+
17
+ puts "Commands:"
18
+ puts ""
19
+ stages.each do |type, commands|
20
+ puts "#{type}:"
21
+ puts ""
22
+ commands.sort.each do |command|
23
+ puts(" * %-20s%s" % [command.name, command.help_text.split(/\r?\n/)[0]])
24
+ end
25
+ puts ""
26
+ end
27
+ end
28
+ end
29
+
30
+ @@command_paths = [File.expand_path(File.join(File.dirname(__FILE__), '..', '..', 'commands'))]
31
+
32
+ attr_reader :stage, :name
33
+
34
+ def initialize(stage, name)
35
+ @name = name
36
+ @stage = stage
37
+ load_full_path
38
+ end
39
+
40
+ def show_help
41
+ puts "#{stage.capitalize} Command: #{name}"
42
+ puts ""
43
+ puts help_text
44
+ end
45
+
46
+ def help_text
47
+ @help_text ||= File.exist?(help_path) ? File.read(help_path) : ""
48
+ end
49
+
50
+ def log_command(env = {}, arguments = [])
51
+ e = env.map {|k,v| k =~ /^(AWS|__)/ ? nil : "#{k}=#{v.inspect}" }.compact.join(" ")
52
+ e = e + " " if e.size > 0
53
+ puts("[C] " + e + name + (arguments ? " " + arguments.join(" ") : ""))
54
+ end
55
+
56
+ def run(opts = {})
57
+ env = (opts[:arguments] || {}).inject({}) {|h, (k, v)| h["_#{k}"] = v; h }
58
+ arguments = opts[:files] || []
59
+ dry_run = opts[:dry_run] || false
60
+ allow_fail = opts[:allow_fail] || false
61
+ pwd = opts[:pwd]
62
+ old_pwd = Dir.pwd
63
+
64
+ log_command(env, arguments)
65
+ if !dry_run
66
+ exec_in_dir(pwd) do
67
+ system(env, @full_path + " " + (arguments ? arguments.join(" ") : ""))
68
+ end
69
+ if $?.to_i != 0
70
+ puts "[E] Last command failed with #{$?}#{allow_fail ? ' but allowFail=true' : ', exiting'}."
71
+ exit($?.to_i) unless allow_fail
72
+ end
73
+ end
74
+ end
75
+
76
+ def <=>(other)
77
+ name <=> other.name
78
+ end
79
+
80
+ private
81
+
82
+ def exec_in_dir(dir, &block)
83
+ dir ? Dir.chdir(dir, &block) : yield
84
+ end
85
+
86
+ def load_full_path
87
+ if path = self.class.command_paths.find {|path| File.exist?(File.join(path, stage, name)) }
88
+ @full_path = File.join(path, stage, name)
89
+ else
90
+ Samus.error "Could not find command: #{name} " +
91
+ "(cmd_paths=#{self.class.command_paths.join(':')})"
92
+ end
93
+ end
94
+
95
+ def help_path
96
+ @help_path ||= @full_path + '.help.md'
97
+ end
98
+ end
99
+ end
@@ -0,0 +1,48 @@
1
+ module Samus
2
+ class Credentials
3
+ attr_reader :name
4
+
5
+ @@credentials = {}
6
+
7
+ def initialize(name)
8
+ @name = name
9
+ load_credential_file
10
+ end
11
+
12
+ def load
13
+ return @@credentials[name] if @@credentials[name]
14
+
15
+ hsh = {}
16
+ data = nil
17
+ if File.executable?(@file)
18
+ data = `#{@file}`
19
+ if $?.to_i != 0
20
+ Samus.error "Loading credential #{name} failed with #{$?}"
21
+ end
22
+ else
23
+ data = File.read(@file)
24
+ end
25
+
26
+ data.split(/\r?\n/).each do |line|
27
+ name, value = *line.strip.split(':')
28
+ hsh["_creds_#{name.strip.downcase}"] = value.strip
29
+ end
30
+
31
+ @@credentials[name] = hsh
32
+ end
33
+
34
+ private
35
+
36
+ def load_credential_file
37
+ Samus.config_paths.each do |path|
38
+ file = File.join(path, 'credentials', name)
39
+ if File.exist?(file)
40
+ @file = file
41
+ return
42
+ end
43
+ end
44
+ Samus.error "Could not find credential: #{name} " +
45
+ "(SAMUS_CONFIG_PATH=#{Samus.config_paths.join(':')})"
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,7 @@
1
+ require_relative './action'
2
+
3
+ module Samus
4
+ class PublishAction < Action
5
+ def stage; 'publish' end
6
+ end
7
+ end
@@ -0,0 +1,38 @@
1
+ require 'json'
2
+
3
+ require_relative './publish_action'
4
+
5
+ module Samus
6
+ class Publisher
7
+ def initialize(dir)
8
+ @dir = dir
9
+ @stage = 'publish'
10
+ end
11
+
12
+ def publish(dry_run = false)
13
+ Dir.chdir(@dir) do
14
+ actions.map do |action|
15
+ PublishAction.new(:dry_run => dry_run, :arguments => {
16
+ 'version' => manifest['version']
17
+ }).load(action)
18
+ end.each do |action|
19
+ action.run
20
+ end
21
+ end
22
+ end
23
+
24
+ private
25
+
26
+ def actions
27
+ manifest['actions']
28
+ end
29
+
30
+ def manifest
31
+ @manifest ||= JSON.parse(File.read(manifest_file))
32
+ end
33
+
34
+ def manifest_file
35
+ @manifest_file ||= File.join(@dir, 'manifest.json')
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,3 @@
1
+ module Samus
2
+ VERSION = '1.0.0'
3
+ end
@@ -0,0 +1,13 @@
1
+ require File.expand_path('../lib/samus/version', __FILE__)
2
+
3
+ Gem::Specification.new do |s|
4
+ s.name = 'samus'
5
+ s.summary = 'Samus helps you release Open Source Software.'
6
+ s.version = Samus::VERSION
7
+ s.author = 'Loren Segal'
8
+ s.email = 'lsegal@soen.ca'
9
+ s.homepage = 'http://github.com/lsegal/samus'
10
+ s.files = `git ls-files`.split(/\s+/)
11
+ s.executables = ['samus']
12
+ s.license = 'BSD'
13
+ end
@@ -0,0 +1,44 @@
1
+ {
2
+ "actions": [
3
+ {
4
+ "action": "fs-sedfiles",
5
+ "files": ["lib/samus/version.rb"],
6
+ "arguments": {
7
+ "search": "VERSION = ['\"](.+?)['\"]",
8
+ "replace": "VERSION = '$version'"
9
+ }
10
+ },
11
+ {
12
+ "action": "git-commit",
13
+ "files": ["lib/samus/version.rb"]
14
+ },
15
+ {
16
+ "action": "git-merge",
17
+ "arguments": {
18
+ "branch": "master"
19
+ }
20
+ },
21
+ {
22
+ "action": "archive-git-full",
23
+ "files": ["git.tgz"],
24
+ "publish": [{
25
+ "action": "git-push",
26
+ "arguments": {
27
+ "remotes": "origin",
28
+ "refs": "master v$version"
29
+ }
30
+ }]
31
+ },
32
+ {
33
+ "action": "gem-build",
34
+ "files": ["*.gemspec"],
35
+ "publish": [
36
+ {
37
+ "action": "gem-push",
38
+ "files": ["*.gem"],
39
+ "credentials": "lsegal.rubygems"
40
+ }
41
+ ]
42
+ }
43
+ ]
44
+ }
metadata ADDED
@@ -0,0 +1,95 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: samus
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Loren Segal
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2014-02-02 00:00:00.000000000 Z
12
+ dependencies: []
13
+ description:
14
+ email: lsegal@soen.ca
15
+ executables:
16
+ - samus
17
+ extensions: []
18
+ extra_rdoc_files: []
19
+ files:
20
+ - LICENSE
21
+ - README.md
22
+ - bin/samus
23
+ - commands/build/archive-git-full
24
+ - commands/build/archive-git-full.help.md
25
+ - commands/build/archive-tgz
26
+ - commands/build/archive-tgz.help.md
27
+ - commands/build/archive-zip
28
+ - commands/build/archive-zip.help.md
29
+ - commands/build/fs-copy
30
+ - commands/build/fs-copy.help.md
31
+ - commands/build/fs-mkdir
32
+ - commands/build/fs-mkdir.help.md
33
+ - commands/build/fs-rmrf
34
+ - commands/build/fs-rmrf.help.md
35
+ - commands/build/fs-sedfiles
36
+ - commands/build/fs-sedfiles.help.md
37
+ - commands/build/gem-build
38
+ - commands/build/gem-build.help.md
39
+ - commands/build/git-archive
40
+ - commands/build/git-archive.help.md
41
+ - commands/build/git-commit
42
+ - commands/build/git-commit.help.md
43
+ - commands/build/git-merge
44
+ - commands/build/git-merge.help.md
45
+ - commands/build/npm-test
46
+ - commands/build/npm-test.help.md
47
+ - commands/build/rake-task
48
+ - commands/build/rake-task.help.md
49
+ - commands/publish/cf-invalidate
50
+ - commands/publish/cf-invalidate.help.md
51
+ - commands/publish/gem-push
52
+ - commands/publish/gem-push.help.md
53
+ - commands/publish/git-push
54
+ - commands/publish/git-push.help.md
55
+ - commands/publish/npm-publish
56
+ - commands/publish/npm-publish.help.md
57
+ - commands/publish/s3-put
58
+ - commands/publish/s3-put.help.md
59
+ - lib/samus.rb
60
+ - lib/samus/action.rb
61
+ - lib/samus/build_action.rb
62
+ - lib/samus/builder.rb
63
+ - lib/samus/command.rb
64
+ - lib/samus/credentials.rb
65
+ - lib/samus/publish_action.rb
66
+ - lib/samus/publisher.rb
67
+ - lib/samus/version.rb
68
+ - samus.gemspec
69
+ - samus.json
70
+ homepage: http://github.com/lsegal/samus
71
+ licenses:
72
+ - BSD
73
+ metadata: {}
74
+ post_install_message:
75
+ rdoc_options: []
76
+ require_paths:
77
+ - lib
78
+ required_ruby_version: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - '>='
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ required_rubygems_version: !ruby/object:Gem::Requirement
84
+ requirements:
85
+ - - '>='
86
+ - !ruby/object:Gem::Version
87
+ version: '0'
88
+ requirements: []
89
+ rubyforge_project:
90
+ rubygems_version: 2.0.3
91
+ signing_key:
92
+ specification_version: 4
93
+ summary: Samus helps you release Open Source Software.
94
+ test_files: []
95
+ has_rdoc: