issue-beaver 0.1.0

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.
@@ -0,0 +1,51 @@
1
+ require 'active_support/concern'
2
+ require 'active_model'
3
+
4
+ module IssueBeaver
5
+ module Shared
6
+ module AttributesModel
7
+
8
+ extend ActiveSupport::Concern
9
+
10
+
11
+ included do
12
+
13
+ attr_accessor :attributes
14
+
15
+ include ActiveModel::AttributeMethods
16
+
17
+ include ActiveModel::Dirty
18
+
19
+ attribute_method_suffix '='
20
+
21
+
22
+ def attribute(key)
23
+ attributes[key]
24
+ end
25
+
26
+
27
+ def attribute=(key, value)
28
+ attribute_will_change!(key) unless value == attributes[key]
29
+ attributes[key] = value
30
+ end
31
+
32
+
33
+ def update_attributes(attrs)
34
+ attrs.each do |key, value|
35
+ send(:attribute=, key, value)
36
+ end
37
+ end
38
+
39
+
40
+ def modifier
41
+ if new?
42
+ "added"
43
+ elsif changed?
44
+ "modified"
45
+ end
46
+ end
47
+
48
+ end
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,16 @@
1
+ class Hash
2
+
3
+ def except(*blacklist)
4
+ {}.tap do |h|
5
+ (keys - blacklist - blacklist.map(&:to_s)).each { |k| h[k] = self[k] }
6
+ end
7
+ end
8
+
9
+
10
+ def only(*whitelist)
11
+ {}.tap do |h|
12
+ (keys & (whitelist | whitelist.map(&:to_s))).each { |k| h[k] = self[k] }
13
+ end
14
+ end
15
+
16
+ end
@@ -0,0 +1,27 @@
1
+ module IssueBeaver
2
+ module Shared
3
+ class ModelCollection
4
+
5
+ def initialize(model, array)
6
+ @model = model
7
+ @array = array
8
+ end
9
+
10
+
11
+ def dup
12
+ self.class.new(@model, @array.dup)
13
+ end
14
+
15
+
16
+ def method_missing(name, *args, &block)
17
+ if @model.respond_to?(name)
18
+ target = @model
19
+ else
20
+ target = @array
21
+ end
22
+ target.send(name, *args, &block)
23
+ end
24
+
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,3 @@
1
+ require 'issue_beaver/shared/hash'
2
+ require 'issue_beaver/shared/attributes_model'
3
+ require 'issue_beaver/shared/model_collection'
@@ -0,0 +1,7 @@
1
+ $LOAD_PATH.unshift File.expand_path('../../lib', __FILE__)
2
+
3
+ require 'enumerable/merge'
4
+ require 'issue_beaver/shared'
5
+ require 'issue_beaver/grammars'
6
+ require 'issue_beaver/models'
7
+ require 'issue_beaver/runner'
@@ -0,0 +1,132 @@
1
+ # https://gist.github.com/2040373
2
+ # Ask for a password from CLI,
3
+ # if it exists.
4
+ module Password
5
+
6
+ # --- Platform inspectors
7
+
8
+ def windows? ; RUBY_PLATFORM =~ /win(32|dows|ce)|djgpp|(ms|cyg|bcc)win|mingw32/i end
9
+ def jruby? ; RUBY_PLATFORM =~ /java/i end
10
+ def os2? ; RUBY_PLATFORM =~ /os2/i end
11
+ def beos? ; RUBY_PLATFORM =~ /beos/i end
12
+ def unix? ; !jruby? && !windows? && !os2? && !beos? end
13
+ # NOTE: 99.999% of mac detection code has a subtle flaw.
14
+ # i.e.: RUBY_PLATFORM =~ /darwin|apple|mac/i
15
+
16
+ def mac? ; RUBY_PLATFORM =~ /.*(sal|86).*-darwin1/i end # e.g.. 'x86_64-darwin11.3.0' MRI 1.9.3 Lion
17
+ # 'x86_64-apple-darwin11.3.0' Rubinius Lion
18
+ # 'i686-darwin11.3.0' RubyEnterprise Lion
19
+ # 'universal-darwin10.0' MacRuby Lion
20
+
21
+ def ios? ; RUBY_PLATFORM =~ /arm-darwin/i end # e.g., 'arm-darwin9'
22
+
23
+ # Can you spot the implication?
24
+
25
+ def linux? ; RUBY_PLATFORM =~ /linux/i end
26
+ # patches welcome: rh, oel, sl, slc, cent, fed, ubt, deb, mint, sles, suse, arch, parabola, nixos, ad ⧝
27
+ def bsd? ; freebsd? || netbsd? || openbsd? end
28
+ def freebsd? ; RUBY_PLATFORM =~ /freebsd/i end
29
+ def netbsd? ; RUBY_PLATFORM =~ /netbsd/i end
30
+ def openbsd? ; RUBY_PLATFORM =~ /openbsd/i end
31
+ def solaris? ; RUBY_PLATFORM =~ /solaris/i end
32
+
33
+ # TODO: cleanly chain signal handlers to prevent leaving -(echo|icanon)
34
+
35
+ # --- Lé code
36
+
37
+ def ask_for_password_on_unix(prompt = "Enter password: ")
38
+ raise 'Could not ask for password because there is no interactive terminal (tty)' unless $stdin.tty?
39
+ unless prompt.nil?
40
+ $stderr.print prompt
41
+ $stderr.flush
42
+ end
43
+ raise 'Could not disable echo to ask for password security' unless system 'stty -echo -icanon'
44
+ password = $stdin.gets
45
+ password.chomp! if password
46
+ password
47
+ ensure
48
+ raise 'Could not re-enable echo while securely asking for password' unless system 'stty echo icanon'
49
+ end
50
+
51
+ def ask_for_password_on_windows(prompt = "Enter password: ")
52
+ raise 'Could not ask for password because there is no interactive terminal (tty)' unless $stdin.tty?
53
+
54
+ require 'Win32API'
55
+
56
+ char = nil
57
+ password = ''
58
+
59
+ unless prompt.nil?
60
+ $stderr.print prompt
61
+ $stderr.flush
62
+ end
63
+
64
+ while char = Win32API.new("crtdll", "_getch", [ ], "L").Call do
65
+ break if char == 10 || char == 13 # return or newline
66
+ if char == 127 || char == 8 # backspace and delete
67
+ password[-1] = ' '
68
+ password.slice!(-1, 1)
69
+ else
70
+ password << char.chr
71
+ end
72
+ end
73
+ char = ' '
74
+
75
+ $stderr.puts
76
+ password
77
+ end
78
+
79
+ def ask_for_password_on_jruby(prompt = "Enter password: ")
80
+ raise 'Could not ask for password because there is no interactive terminal (tty)' unless $stdin.tty?
81
+
82
+ password=''
83
+
84
+ require 'java'
85
+ include_class 'java.lang.System'
86
+ include_class 'java.io.Console'
87
+
88
+ unless prompt.nil?
89
+ $stderr.print prompt
90
+ $stderr.flush
91
+ end
92
+
93
+ console = System.console()
94
+ return unless console != java.null
95
+ loop do
96
+ break unless (read_passwd = console.readPassword()) != java.null
97
+ passwd_chr = java.lang.String.new(read_passwd).to_string
98
+ case passwd_chr
99
+ when "\e" # ESC
100
+ password.length.times do |i|
101
+ password[i] = ' '
102
+ end
103
+ return nil
104
+ when "", "\r", "\n" # Enter (for certain), ..., ...
105
+ break
106
+ when "\177", "\b" # Ctrl-H, Bkspace
107
+ if password.length > 0
108
+ password[-1] = ' '
109
+ password.slice!(-1, 1)
110
+ end
111
+ when "\004" # Ctrl-D
112
+ password.length.times do |i|
113
+ password[i] = ' '
114
+ end
115
+ password = ''
116
+ else
117
+ password << passwd_chr
118
+ end
119
+ end
120
+
121
+ $stderr.puts
122
+ passwd
123
+ end
124
+
125
+ def ask(prompt = "Enter password: ")
126
+ %w|windows unix jruby|.each do |platform|
127
+ eval "return ask_for_password_on_#{platform}(prompt) if #{platform}?"
128
+ end
129
+ raise "Could not read password on unknown Ruby platform: #{RUBY_DESCRIPTION}"
130
+ end
131
+ extend self
132
+ end
@@ -0,0 +1,6 @@
1
+ class Foo
2
+ # TODO: This line should be found in the tests
3
+ def foo(a,b,c)
4
+ puts "Hello World!"
5
+ end
6
+ end
@@ -0,0 +1,16 @@
1
+ class Foo
2
+ # TODO: This line should be found in the tests
3
+ # And this should be found
4
+ # as the body
5
+ def foo(a,b,c)
6
+ puts "Hello World!"
7
+ end
8
+ # TODO: Second comment
9
+
10
+ # Not the body
11
+
12
+ # TODO: Change to 42 @foobar
13
+ def bar
14
+ 23
15
+ end
16
+ end
@@ -0,0 +1,60 @@
1
+ require_relative '../spec_helper'
2
+
3
+ describe IssueBeaver::Grammars::RubyCommentsParser do
4
+
5
+ context "ruby.rb" do
6
+ let(:ruby_code) { File.read('./spec/fixtures/ruby.rb') }
7
+ subject { IssueBeaver::Grammars::RubyCommentsParser.new.parse(ruby_code) }
8
+ let(:comment) {subject.comments[0]}
9
+
10
+ it "should find the one comment" do
11
+ subject.comments.length.should == 1
12
+ end
13
+
14
+ it "should have correct properties" do
15
+ comment['begin_line'].should == 2
16
+ comment['title'].should == "This line should be found in the tests"
17
+ end
18
+
19
+ it "should find the comment body" do
20
+ comment['body'].should == nil
21
+ end
22
+ end
23
+
24
+ context "ruby2.rb" do
25
+ let(:ruby_code) { File.read('./spec/fixtures/ruby2.rb') }
26
+ subject { IssueBeaver::Grammars::RubyCommentsParser.new.parse(ruby_code) }
27
+ let(:comments) {subject.comments}
28
+
29
+ it "should find the number of comment" do
30
+ comments.length.should == 3
31
+ end
32
+
33
+ it "should have correct properties" do
34
+ comments[0]['begin_line'].should == 2
35
+ comments[0]['title'].should == "This line should be found in the tests"
36
+ end
37
+
38
+ it "should find the comment body" do
39
+ comments[0]['body'].should == "And this should be found\nas the body"
40
+ end
41
+
42
+ it "should have correct properties" do
43
+ comments[1]['begin_line'].should == 8
44
+ comments[1]['title'].should == "Second comment"
45
+ end
46
+
47
+ it "should find the comment body" do
48
+ comments[1]['body'].should == nil
49
+ end
50
+
51
+ it "should find the title without assignee" do
52
+ comments[2]['title'].should == "Change to 42"
53
+ end
54
+
55
+ it "should find the assignee" do
56
+ comments[2]['assignee'].should == "foobar"
57
+ end
58
+ end
59
+
60
+ end
@@ -0,0 +1,2 @@
1
+ require 'rspec'
2
+ require './lib/issue_beaver'
metadata ADDED
@@ -0,0 +1,78 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: issue-beaver
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Stephan Eckardt
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2012-09-23 00:00:00.000000000 Z
13
+ dependencies: []
14
+ description: Issue Beaver creates Github Issues for TODO comments in your source code
15
+ email:
16
+ - mail@stephaneckardt.com
17
+ executables:
18
+ - issuebeaver
19
+ extensions: []
20
+ extra_rdoc_files: []
21
+ files:
22
+ - .rspec
23
+ - Gemfile
24
+ - Gemfile.lock
25
+ - README.md
26
+ - Rakefile
27
+ - bin/issuebeaver
28
+ - issue-beaver.gemspec
29
+ - lib/enumerable/merge.rb
30
+ - lib/issue_beaver.rb
31
+ - lib/issue_beaver/grammars.rb
32
+ - lib/issue_beaver/grammars/ruby_comments.rb
33
+ - lib/issue_beaver/grammars/ruby_comments.treetop
34
+ - lib/issue_beaver/models.rb
35
+ - lib/issue_beaver/models/git.rb
36
+ - lib/issue_beaver/models/github_issue.rb
37
+ - lib/issue_beaver/models/github_issue_repository.rb
38
+ - lib/issue_beaver/models/merger.rb
39
+ - lib/issue_beaver/models/todo_comments.rb
40
+ - lib/issue_beaver/runner.rb
41
+ - lib/issue_beaver/shared.rb
42
+ - lib/issue_beaver/shared/attributes_model.rb
43
+ - lib/issue_beaver/shared/hash.rb
44
+ - lib/issue_beaver/shared/model_collection.rb
45
+ - lib/password/password.rb
46
+ - spec/fixtures/ruby.rb
47
+ - spec/fixtures/ruby2.rb
48
+ - spec/grammars/ruby_comments_spec.rb
49
+ - spec/spec_helper.rb
50
+ homepage: https://github.com/eckardt/issue-beaver
51
+ licenses: []
52
+ post_install_message:
53
+ rdoc_options: []
54
+ require_paths:
55
+ - lib
56
+ required_ruby_version: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ! '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ required_rubygems_version: !ruby/object:Gem::Requirement
63
+ none: false
64
+ requirements:
65
+ - - ! '>='
66
+ - !ruby/object:Gem::Version
67
+ version: '0'
68
+ requirements: []
69
+ rubyforge_project:
70
+ rubygems_version: 1.8.24
71
+ signing_key:
72
+ specification_version: 3
73
+ summary: Issue Beaver creates Github Issues for TODO comments in your source code
74
+ test_files:
75
+ - spec/fixtures/ruby.rb
76
+ - spec/fixtures/ruby2.rb
77
+ - spec/grammars/ruby_comments_spec.rb
78
+ - spec/spec_helper.rb