twigg 0.0.1 → 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: f3e52b0f0bd210a32cf32644f0b9eb53c19b24c5
4
- data.tar.gz: aa750f08ceb9795ef9e8d2f3b970470bf0c3e869
3
+ metadata.gz: 08f8b0a5dc7eaafda3901ab196d782d98f6aecba
4
+ data.tar.gz: 5b7524480befd14000a0571316787ba5b4ba6194
5
5
  SHA512:
6
- metadata.gz: 2d2cda3048d6a225c48d0e62ac26b3dd012b2be379e45584c088381c3f4d5d901ae154e1565d5f0d4af74b8f11e3c99cc3025bb66196bdfe1f9c65705695e5e4
7
- data.tar.gz: 66d36587d5b4e8339517cc1f78ade317a77f132cb634f409b689744ba932c85787f54350a6868b57fa0688ff12cfef82ad259ec3071834057db606c3ff72a756
6
+ metadata.gz: 1e0219ae5d8e788b11db183b962889e1ec6153a01f519bbf82a304e1ac5d6e61ad4ad46ee3d9a3ac9e4afab08b49930e20762f11e530ecba01b3e22ee0c4781e
7
+ data.tar.gz: f50671909a2c1f24da4ee39ea5317a71f93e5d7c80cf64216971b3dd222701c0c3c70208334d62f8a99265cb9bc378aa55906dafa2afa1a20d9732db95366d53
@@ -0,0 +1,85 @@
1
+ require 'digest/sha1'
2
+
3
+ module Twigg
4
+ # The Cacher module is an abstraction around caching that offers two public
5
+ # methods, {Twigg::Cacher.get} and {Twigg::Cacher.set}.
6
+ #
7
+ # If the twigg-cache gem is installed and enabled, delegates the storing of
8
+ # cached items to Memcached. In the absence of the gem, every cache lookup is
9
+ # treated as a miss.
10
+ module Cacher
11
+ # Dummy Memcached client that always misses.
12
+ class DummyClient
13
+ def get(key); end
14
+ def set(key); end
15
+ end
16
+
17
+ class << self
18
+ include Dependency # for with_dependency
19
+
20
+ # Gets stored value for `key`; in the event of a cache miss, yields to
21
+ # `block`, and caches and returns the result. `*args`, if present, are
22
+ # hashed and appended to key to permit the results of different calls to
23
+ # the same method to be conveniently stored and retrieved independently.
24
+ #
25
+ # Note: if a `nil` or `false` value is ever stored in the cache, this
26
+ # method will consider any lookup of the corresponding key to be a miss,
27
+ # because we employ a simply truthiness check to determine presence.
28
+ def get(key, *args, &block)
29
+ raise ArgumentError, 'block required by not given' unless block_given?
30
+ digest = hashed_key_and_args(key, *args)
31
+ client.get(digest) || set(key, *args, &block)
32
+ end
33
+
34
+ # Stores the result of yielding to `block` in the cache, with `key` as
35
+ # key, and returns the result.
36
+ #
37
+ # As with {get}, any `*args`, if present, are hashed and appended to the
38
+ # key to premit the results of different calls to the same method to be
39
+ # conveniently stored and retrieved independently.
40
+ def set(key, *args, &block)
41
+ digest = hashed_key_and_args(key, *args)
42
+ yield.tap { |result| client.set(digest, result) }
43
+ end
44
+
45
+ private
46
+
47
+ def client
48
+ @client ||= (caching? ? Cache::Client.new : DummyClient.new)
49
+ end
50
+
51
+ def caching?
52
+ return false unless Config.cache.enabled # don't want to load the gem
53
+ return true if defined?(Twigg::Cache) # gem was already loaded
54
+ with_dependency('twigg-cache') { true } # will die if can't load
55
+ end
56
+
57
+ # Produces a composite cache key based on `key` and a digest of `args`.
58
+ #
59
+ # If `args` contains non-shallow objects such as hashes or arrays, uses
60
+ # recursion to incorporate the contents of those objects in the digest.
61
+ #
62
+ # Will raise an exception if `args` or any object encontered via recursion
63
+ # is not a "simple" object (Hash, Array, String, NilClas, Numeric, or
64
+ # Symbol).
65
+ def hashed_key_and_args(key, *args)
66
+ base = args.inject('') do |memo, arg|
67
+ memo << (':' + arg.class.to_s + ':') << case arg
68
+ when Array
69
+ hashed_key_and_args(key, *arg)
70
+ when Hash
71
+ hashed_key_and_args(key, *arg.to_a)
72
+ when NilClass,Numeric, String, Symbol
73
+ arg.to_s
74
+ else
75
+ raise ArgumentError, 'can only compute digest for primitive objects'
76
+ end
77
+
78
+ Digest::SHA1::hexdigest(memo)
79
+ end
80
+
81
+ key + ':' + base
82
+ end
83
+ end
84
+ end
85
+ end
@@ -5,6 +5,7 @@ module Twigg
5
5
 
6
6
  def initialize(*args)
7
7
  super
8
+ # sigh.. need something declarative to DRY up this repetitive set-up
8
9
  Help.new('stats').run! if @args.size > 2
9
10
 
10
11
  @repositories_directory = @args[0] || Config.repositories_directory
data/lib/twigg/commit.rb CHANGED
@@ -34,7 +34,7 @@ module Twigg
34
34
  end
35
35
 
36
36
  def filtered_commit_message
37
- @filtered_commit_message ||= @body.lines.reject do |line|
37
+ @filtered_commit_message ||= @body.reject do |line|
38
38
  line =~ /^[a-z-]+: /i # filter out Change-Id:, Signed-off-by: etc
39
39
  end.concat([@subject]).join("\n").chomp
40
40
  end
@@ -71,6 +71,8 @@ module Twigg
71
71
  self.class.new(commits_for_author)
72
72
  end
73
73
 
74
+ # Special case: if `team` is `nil`, select people who don't belong to a
75
+ # team.
74
76
  def select_team(team)
75
77
  members = Set.new(Config.teams[team])
76
78
 
data/lib/twigg/config.rb CHANGED
@@ -39,8 +39,9 @@ module Twigg
39
39
  end
40
40
  end
41
41
 
42
- def initialize
43
- @settings = Settings.new(config_from_argv ||
42
+ def initialize(twiggrc: nil)
43
+ @settings = Settings.new(config_from_file(twiggrc) ||
44
+ config_from_argv ||
44
45
  config_from_env ||
45
46
  config_from_home)
46
47
  end
@@ -53,6 +54,8 @@ module Twigg
53
54
  end
54
55
 
55
56
  def config_from_file(path)
57
+ return unless path
58
+
56
59
  YAML.load_file(path).tap do |contents|
57
60
  if File.world_readable?(path)
58
61
  warn "#{path} is world-readable"
@@ -77,11 +80,11 @@ module Twigg
77
80
  # twigg-app.gemspec), which means that this happens before the
78
81
  # Twigg::Command.run method gets a chance to set things up properly.
79
82
  path = consume_option(%w[-c --config], ARGV)
80
- config_from_file(path) if path
83
+ config_from_file(path)
81
84
  end
82
85
 
83
86
  def config_from_env
84
- config_from_file(ENV['TWIGGRC']) if ENV['TWIGGRC']
87
+ config_from_file(ENV['TWIGGRC'])
85
88
  end
86
89
 
87
90
  TWIGGRC = '.twiggrc'
@@ -2,6 +2,8 @@ module Twigg
2
2
  module Dependency
3
3
  private
4
4
 
5
+ # could add noisy: true, or graceful: false (or similar option) here if we
6
+ # wanted to infer the presence of the twigg-cache gem
5
7
  def with_dependency(gem, &block)
6
8
  require gem
7
9
  yield
data/lib/twigg/repo.rb CHANGED
@@ -100,25 +100,23 @@ module Twigg
100
100
  loop do
101
101
  begin
102
102
  commit = { repo: self }
103
+ commit[:body] = []
104
+ commit[:stat] = Hash.new(0)
103
105
  commit[:commit] = lines.next.chomp
104
106
  commit[:author] = lines.next.chomp
105
107
  commit[:date] = Time.at(lines.next.chomp.to_i).to_date
106
108
  commit[:subject] = lines.next.chomp rescue ''
107
109
 
108
- commit[:body] = []
109
110
  while lines.peek =~ /^ {4}(.*)$/ && lines.next
110
111
  commit[:body] << $~[1]
111
112
  end
112
- commit[:body] = commit[:body].join("\n")
113
113
  lines.next if lines.peek == "\n" # blank separator line
114
114
 
115
- commit[:stat] = Hash.new(0)
116
115
  while lines.peek =~ /^(\d+|-)\t(\d+|-)\t.+$/ && lines.next
117
116
  commit[:stat][:additions] += $~[1].to_i
118
117
  commit[:stat][:deletions] += $~[2].to_i
119
118
  end
120
119
  lines.next if lines.peek == "\n" # blank separator line
121
-
122
120
  rescue StopIteration
123
121
  break # end of output
124
122
  ensure
@@ -30,6 +30,14 @@ module Twigg
30
30
  end
31
31
  end
32
32
 
33
+ namespace :cache do
34
+ setting :enabled, default: false
35
+ setting :expiry, default: 3600 # 1 hour
36
+ setting :host, default: 'localhost'
37
+ setting :namespace, default: 'twigg'
38
+ setting :port, default: 11211
39
+ end
40
+
33
41
  setting :default_days, default: 7
34
42
 
35
43
  namespace :gerrit do
data/lib/twigg/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Twigg
2
- VERSION = '0.0.1'
2
+ VERSION = '0.0.2'
3
3
  end
data/lib/twigg.rb CHANGED
@@ -1,6 +1,7 @@
1
1
  require 'pathname'
2
2
 
3
3
  module Twigg
4
+ autoload :Cacher, 'twigg/cacher'
4
5
  autoload :Command, 'twigg/command'
5
6
  autoload :Commit, 'twigg/commit'
6
7
  autoload :CommitSet, 'twigg/commit_set'
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: twigg
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Causes Engineering
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-08-17 00:00:00.000000000 Z
11
+ date: 2013-08-22 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -90,6 +90,7 @@ extra_rdoc_files: []
90
90
  files:
91
91
  - bin/twigg
92
92
  - files/github.pem
93
+ - lib/twigg/cacher.rb
93
94
  - lib/twigg/command/git.rb
94
95
  - lib/twigg/command/git_host.rb
95
96
  - lib/twigg/command/git_hub.rb