capistrano-stats 1.0.1 → 1.0.2

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 16d87df336c5dd06a9926c57b2084fdbf4ec17d4
4
- data.tar.gz: d95f030b7907b485a5d90c5f95fc297c408fadf8
3
+ metadata.gz: 70df68cdce71eefd709dc7330eb7abb04b9d3022
4
+ data.tar.gz: 039b7a83c79c5c49637c787e73c1be8c04ced66b
5
5
  SHA512:
6
- metadata.gz: b3a99527966e46e16ee7f4ba5cb5a290ac6824bd50c01ef69dba5ec138e2d5d26d32884849cc2ac9d7a02e839b4389503f3efc459b7c0f0e57223dba4dd1c1a2
7
- data.tar.gz: 9dfc3aeea55d8631b1f7111baed83d8312e1eca9845f7a6e4331f1ace92ba38d3fb4faee1c51b814948273faa0718d078b9a4d9fdd8d58b14c3df7c3a4788fc9
6
+ metadata.gz: 3c215b955620a7f74bb0d6afe240e0faffde1ff7f9e70d273fcef9dfd91a8906ec23e0a4204b715ab28c5b90952f49fdbdc13c7474a4caf01b22b5db5a47edea
7
+ data.tar.gz: 95ba78d756baca86714a34de24855589157e93fed9fa0f54ccc310ade71e37e4da42ae8975dcd9b99caad99680f86cfeaef7faf0708f7037b0ba00739a70ec8c
@@ -0,0 +1,28 @@
1
+ # -*- encoding: utf-8 -*-
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'capistrano-stats/version'
5
+
6
+ Gem::Specification.new do |gem|
7
+ gem.name = "capistrano-stats"
8
+ gem.version = Capistrano::Stats::VERSION
9
+ gem.authors = ["Lee Hambley"]
10
+ gem.email = ["lee.hambley@gmail.com"]
11
+ gem.description = %q{Collects anonymous usage statistics about Capistrano to aid with platform support and ruby version targeting.}
12
+ gem.summary = %q{Official metrics to help the development direction of Capistrano}
13
+ gem.homepage = "http://metrics.capistranorb.com/"
14
+
15
+ gem.files = `git ls-files`.split($/)
16
+ gem.require_paths = ["lib"]
17
+
18
+ gem.licenses = ['MIT']
19
+
20
+ gem.post_install_message = <<-eos
21
+ Capistrano will ask you the next time you run it if you would like to share
22
+ anonymous usage statistics with the maintainance team to help guide our
23
+ development efforts. We emplore you to opt-in, but we understand if your
24
+ privacy is important to you in this regard.
25
+ eos
26
+
27
+ end
28
+
@@ -0,0 +1,25 @@
1
+ require File.expand_path('../capistrano-stats/metric-collector', __FILE__)
2
+ require File.expand_path('../capistrano-stats/metric-message', __FILE__)
3
+ require File.expand_path('../capistrano-stats/version', __FILE__)
4
+
5
+ require 'capistrano/version'
6
+
7
+ unless Capistrano.const_defined?('VERSION')
8
+ Capistrano::VERSION = Capistrano::Version
9
+ end
10
+
11
+ case Capistrano::VERSION.to_s.to_i
12
+ when 2
13
+ Capistrano::Configuration.instance.load do
14
+ namespace :metrics do
15
+ task :collect do
16
+ Capistrano::MetricCollector.new(Dir.pwd).collect
17
+ end
18
+ end
19
+ on :start, 'metrics:collect'
20
+ end
21
+ when 3
22
+ load File.expand_path('../../tasks/metrics.rake', __FILE__)
23
+ else
24
+ warn "Unsupported Capistrano Version"
25
+ end
@@ -0,0 +1,104 @@
1
+ require 'socket'
2
+ require 'digest'
3
+ require 'pathname'
4
+
5
+ module Capistrano
6
+
7
+ class MetricCollector
8
+
9
+ attr_reader :pwd
10
+
11
+ def initialize(pwd)
12
+ @pwd = Pathname.new(pwd)
13
+ end
14
+
15
+ def enabled?
16
+ ask_to_enable unless File.exists?(sentry_file)
17
+ File.read(sentry_file).chomp == "true"
18
+ end
19
+
20
+ def collect
21
+ socket = UDPSocket.new
22
+ message.anonymize! unless enabled?
23
+ socket.send(message.to_s, 0, *destination)
24
+ rescue SocketError
25
+ warn "There was a problem tracking statistics, please report to https://github.com/capistrano/stats"
26
+ end
27
+
28
+ private
29
+
30
+ def destination
31
+ target = ENV.fetch('CAPISTRANO_METRICS', 'metrics.capistranorb.com:1200')
32
+ host, port = target.split(':')
33
+
34
+ if port == ""
35
+ raise StandardError.new("Invalid port: \"%s\"" % port)
36
+ else
37
+ port = port.to_i
38
+ end
39
+
40
+ [host, port]
41
+ end
42
+
43
+ def anon_project_hash
44
+ git_remote = `git config --get-regex 'remote\..*\.url'`.chomp.split(' ').last
45
+ @anon_project_hash = "not-git"
46
+ unless git_remote.to_s == ""
47
+ @anon_project_hash = Digest::MD5.hexdigest(git_remote)[0..7]
48
+ end
49
+ @anon_project_hash
50
+ end
51
+
52
+ def ask_to_enable
53
+ return false unless $stdin.tty?
54
+ show_prompt
55
+ result = ask_to_confirm("Do you want to enable statistics? (y/N): ")
56
+ show_thank_you_note(result)
57
+ write_setting(result)
58
+ end
59
+
60
+ def show_prompt
61
+ puts <<-EOF
62
+ Would you like to enable statistics? Here is an example message we would
63
+ send:
64
+
65
+ #{message}
66
+
67
+ EOF
68
+ end
69
+
70
+ def show_thank_you_note(result)
71
+ puts(result ? "Thank you, you may wish to add .capistrano/ to your source
72
+ control database to avoid future prompts" : "Your preferences have
73
+ been saved.")
74
+ end
75
+
76
+ def message
77
+ @message ||= MetricMessage.new({
78
+ :payload => anon_project_hash,
79
+ :ruby_version => RUBY_VERSION,
80
+ :ruby_platform => RUBY_PLATFORM,
81
+ })
82
+ @message
83
+ end
84
+
85
+ def sentry_file
86
+ @pwd.join('.capistrano', 'metrics')
87
+ end
88
+
89
+ def ask_to_confirm(prompt)
90
+ $stdout.write(prompt)
91
+ $stdout.flush
92
+ $stdin.gets.chomp.downcase[0] == ?y ? true : false
93
+ end
94
+
95
+ def write_setting(value)
96
+ Dir.mkdir(sentry_file.dirname) rescue nil
97
+ File.open(sentry_file, "wb") do |f|
98
+ f.write(value)
99
+ end
100
+ end
101
+
102
+ end
103
+
104
+ end
@@ -0,0 +1,49 @@
1
+ require 'time'
2
+
3
+ module Capistrano
4
+
5
+ class MetricMessage
6
+
7
+ VERSION = 1
8
+ SERIALIZE_ATTRIBUTES = [
9
+ :version,
10
+ :datetime,
11
+ :ruby_version,
12
+ :ruby_platform,
13
+ :capistrano_version,
14
+ :payload
15
+ ]
16
+
17
+ def initialize(attributes = {})
18
+ @attributes = attributes.merge({
19
+ :version => VERSION,
20
+ :datetime => Time.now.iso8601,
21
+ :capistrano_version => capistrano_version,
22
+ })
23
+ end
24
+
25
+ def to_s
26
+ @attributes.values_at(*SERIALIZE_ATTRIBUTES).join("|")
27
+ end
28
+
29
+ def anonymize!
30
+ @attributes.each do |attr, value|
31
+ @attributes[attr] = 'anonymous' unless attr == :version
32
+ end
33
+ end
34
+
35
+ private
36
+
37
+ def capistrano_version
38
+ if Capistrano.const_defined?('VERSION')
39
+ Capistrano::VERSION
40
+ elsif Capistrano.const_defined?('Version')
41
+ Capistrano::Version
42
+ else
43
+ "unknown"
44
+ end
45
+ end
46
+
47
+ end
48
+
49
+ end
@@ -0,0 +1,5 @@
1
+ module Capistrano
2
+ module Stats
3
+ VERSION = "1.0.2"
4
+ end
5
+ end
@@ -0,0 +1,7 @@
1
+ namespace :metrics do
2
+ task :collect do
3
+ Capistrano::MetricCollector.new(Dir.pwd).collect
4
+ end
5
+ end
6
+
7
+ task 'deploy:starting' => 'metrics:collect'
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: capistrano-stats
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.1
4
+ version: 1.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Lee Hambley
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-11-24 00:00:00.000000000 Z
11
+ date: 2014-11-25 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: Collects anonymous usage statistics about Capistrano to aid with platform
14
14
  support and ruby version targeting.
@@ -17,7 +17,13 @@ email:
17
17
  executables: []
18
18
  extensions: []
19
19
  extra_rdoc_files: []
20
- files: []
20
+ files:
21
+ - capistrano-stats.gemspec
22
+ - lib/capistrano-stats.rb
23
+ - lib/capistrano-stats/metric-collector.rb
24
+ - lib/capistrano-stats/metric-message.rb
25
+ - lib/capistrano-stats/version.rb
26
+ - tasks/metrics.rake
21
27
  homepage: http://metrics.capistranorb.com/
22
28
  licenses:
23
29
  - MIT