gitmain 0.0.1 → 0.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 +4 -4
- data/lib/gitmain.rb +3 -1
- data/lib/gitmain/blob.rb +34 -1
- data/lib/gitmain/commit.rb +35 -1
- data/lib/gitmain/repository.rb +94 -1
- data/lib/gitmain/text_blob.rb +14 -0
- data/lib/gitmain/tree.rb +65 -1
- data/lib/gitmain/version.rb +1 -1
- data/test/gitmain/blob_test.rb +56 -0
- data/test/gitmain/commit_test.rb +68 -0
- data/test/gitmain/repository_test.rb +196 -0
- data/test/gitmain/subclass_test.rb +42 -0
- data/test/gitmain/text_blob_test.rb +27 -0
- data/test/gitmain/tree_test.rb +117 -0
- data/test/test_helper.rb +97 -0
- metadata +35 -9
- data/lib/gitmain/branch.rb +0 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 0970ff8fb78602218d3bc39bb1943baf2ffabdb7
|
4
|
+
data.tar.gz: e0e669e4b88c990ca30316921730ca81f3b9e114
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9ff714a52c49cbacf2498f1d28e49259e1a576ed8ec5dfc23eceff1c19353dc834849c40887c3985ffe8ca348de866b0e9a4441cc88048cf28a0fd8585ecbc41
|
7
|
+
data.tar.gz: c08cef6bf5afccf6beee51cd508e6b29aeb0659b7cf139e87328690a43d6fcf35f5ebc0b1c91fdc12614b3fada74e4806e4906396daa9a9f40db3083c50e68aa
|
data/lib/gitmain.rb
CHANGED
data/lib/gitmain/blob.rb
CHANGED
@@ -1,4 +1,37 @@
|
|
1
1
|
module Gitmain
|
2
|
-
|
2
|
+
class Blob
|
3
|
+
attr_reader :id, :name, :path, :repository
|
4
|
+
|
5
|
+
def initialize(repository, id, path = nil, name = nil)
|
6
|
+
raise ArgumentError, 'provide a valid repository' unless repository.kind_of?(Gitmain::Repository)
|
7
|
+
raise ArgumentError, 'provide a valid blob id' unless id.to_s.match(/\A[0-9a-f]{40}\z/)
|
8
|
+
@repository = repository
|
9
|
+
@id = id
|
10
|
+
@path = path
|
11
|
+
@name = name
|
12
|
+
end
|
13
|
+
|
14
|
+
def changed_attributes
|
15
|
+
@changed_attributes ||= {}
|
16
|
+
end
|
17
|
+
|
18
|
+
def content
|
19
|
+
@content ||= _blob&.content
|
20
|
+
end
|
21
|
+
|
22
|
+
def content=(value)
|
23
|
+
changed_attributes[:content] = content
|
24
|
+
@content = value
|
25
|
+
end
|
26
|
+
|
27
|
+
def file_name
|
28
|
+
File.join(*[path, name].map(&:to_s).reject(&:empty?))
|
29
|
+
end
|
30
|
+
|
31
|
+
private
|
32
|
+
|
33
|
+
def _blob
|
34
|
+
@_blob ||= repository.rugged(id)
|
35
|
+
end
|
3
36
|
end
|
4
37
|
end
|
data/lib/gitmain/commit.rb
CHANGED
@@ -1,4 +1,38 @@
|
|
1
1
|
module Gitmain
|
2
|
-
|
2
|
+
class Commit
|
3
|
+
attr_reader :id, :repository
|
4
|
+
|
5
|
+
def initialize(repository, id)
|
6
|
+
raise ArgumentError, 'provide a valid repository' unless repository.kind_of?(Gitmain::Repository)
|
7
|
+
raise ArgumentError, 'provide a valid commit id' unless id.to_s.match(/\A[0-9a-f]{40}\z/)
|
8
|
+
@repository = repository
|
9
|
+
@id = id
|
10
|
+
end
|
11
|
+
|
12
|
+
def author_email
|
13
|
+
_commit&.author[:email]
|
14
|
+
end
|
15
|
+
|
16
|
+
def author_name
|
17
|
+
_commit&.author[:name]
|
18
|
+
end
|
19
|
+
|
20
|
+
def message
|
21
|
+
_commit&.message
|
22
|
+
end
|
23
|
+
|
24
|
+
def parent_ids
|
25
|
+
_commit&.parent_ids
|
26
|
+
end
|
27
|
+
|
28
|
+
def time
|
29
|
+
_commit&.time
|
30
|
+
end
|
31
|
+
|
32
|
+
private
|
33
|
+
|
34
|
+
def _commit
|
35
|
+
@_commit ||= repository.rugged(id)
|
36
|
+
end
|
3
37
|
end
|
4
38
|
end
|
data/lib/gitmain/repository.rb
CHANGED
@@ -1,4 +1,97 @@
|
|
1
1
|
module Gitmain
|
2
|
-
|
2
|
+
class Repository
|
3
|
+
attr_reader :branch, :name
|
4
|
+
|
5
|
+
def self.default_branch(value = nil)
|
6
|
+
@default_branch = value unless value.to_s.empty?
|
7
|
+
|
8
|
+
if @default_branch.to_s.empty?
|
9
|
+
'master'
|
10
|
+
else
|
11
|
+
@default_branch
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
def self.dirname(value = nil)
|
16
|
+
@dirname = value unless value.to_s.empty?
|
17
|
+
|
18
|
+
if @dirname.to_s.empty?
|
19
|
+
raise ArgumentError, 'provide a value to set @dirname'
|
20
|
+
else
|
21
|
+
@dirname
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
def self.init(name)
|
26
|
+
raise ArgumentError, 'provide a valid name' unless name.match(/\A[\w\-]+\z/)
|
27
|
+
Rugged::Repository.init_at(File.join(dirname, "#{name}.git"), :bare)
|
28
|
+
new(name)
|
29
|
+
end
|
30
|
+
|
31
|
+
def initialize(name, branch = self.class.default_branch)
|
32
|
+
raise ArgumentError, 'provide a valid name' unless name.match(/\A[\w\-]+\z/)
|
33
|
+
raise ArgumentError, 'provide a valid branch' unless branch.match(/\A[\w\-]+\z/)
|
34
|
+
|
35
|
+
begin
|
36
|
+
@_repo = Rugged::Repository.new(File.join(self.class.dirname, "#{name}.git"))
|
37
|
+
rescue
|
38
|
+
raise ArgumentError, 'could not load repository'
|
39
|
+
end
|
40
|
+
|
41
|
+
unless @_repo.bare?
|
42
|
+
raise ArgumentError, 'must be a bare repository'
|
43
|
+
end
|
44
|
+
|
45
|
+
if @_repo.branches.each_name.include?(branch)
|
46
|
+
@_branch = @_repo.branches[branch]
|
47
|
+
elsif !@_repo.empty?
|
48
|
+
raise ArgumentError, 'must provide an existing branch'
|
49
|
+
end
|
50
|
+
|
51
|
+
@name = name
|
52
|
+
@branch = branch
|
53
|
+
end
|
54
|
+
|
55
|
+
def commit(klass: Gitmain::Commit)
|
56
|
+
klass.new(self, commit_id) if commit_id
|
57
|
+
end
|
58
|
+
|
59
|
+
def commit_id
|
60
|
+
@_branch&.target&.oid
|
61
|
+
end
|
62
|
+
|
63
|
+
def checkout(branch)
|
64
|
+
if @_repo.branches.each_name.include?(branch)
|
65
|
+
@_branch = @_repo.branches[branch]
|
66
|
+
@branch = branch
|
67
|
+
elsif @_repo.branches.each_name.include?(self.class.default_branch)
|
68
|
+
@_branch = @_repo.branches.create(branch, self.class.default_branch)
|
69
|
+
@branch = branch
|
70
|
+
else
|
71
|
+
raise ArgumentError, "default branch not yet setup"
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
def rename(name)
|
76
|
+
FileUtils.mv(File.join(self.class.dirname, "#@name.git"), File.join(self.class.dirname, "#{name}.git"))
|
77
|
+
@_repo = Rugged::Repository.new(File.join(self.class.dirname, "#{name}.git"))
|
78
|
+
@name = name
|
79
|
+
end
|
80
|
+
|
81
|
+
def rugged(id)
|
82
|
+
@_repo&.lookup(id)
|
83
|
+
end
|
84
|
+
|
85
|
+
def setup?
|
86
|
+
@_repo && !@_repo.empty? && @_repo.branches[self.class.default_branch]
|
87
|
+
end
|
88
|
+
|
89
|
+
def tree(klass: Gitmain::Tree)
|
90
|
+
klass.new(self, tree_id) if tree_id
|
91
|
+
end
|
92
|
+
|
93
|
+
def tree_id
|
94
|
+
@_branch&.target&.tree_id
|
95
|
+
end
|
3
96
|
end
|
4
97
|
end
|
data/lib/gitmain/tree.rb
CHANGED
@@ -1,4 +1,68 @@
|
|
1
1
|
module Gitmain
|
2
|
-
|
2
|
+
class Tree
|
3
|
+
attr_reader :id, :name, :path, :repository
|
4
|
+
|
5
|
+
def initialize(repository, id, path = nil, name = nil)
|
6
|
+
raise ArgumentError, 'provide a valid repository' unless repository.kind_of?(Gitmain::Repository)
|
7
|
+
raise ArgumentError, 'provide a valid tree id' unless id.to_s.match(/\A[0-9a-f]{40}\z/)
|
8
|
+
@repository = repository
|
9
|
+
@id = id
|
10
|
+
@path = path
|
11
|
+
@name = name
|
12
|
+
end
|
13
|
+
|
14
|
+
def blobs(klass: Gitmain::Blob, recursive: false)
|
15
|
+
if recursive
|
16
|
+
_tree.walk(:postorder).map do |root, object|
|
17
|
+
if object[:type] == :blob
|
18
|
+
blob_path = File.join(*[path, name, root].map(&:to_s).reject(&:empty?))
|
19
|
+
blob_path.sub!(/\/\z/, '')
|
20
|
+
blob_path = nil if blob_path.empty?
|
21
|
+
klass.new(repository, object[:oid], blob_path, object[:name])
|
22
|
+
end
|
23
|
+
end.compact
|
24
|
+
else
|
25
|
+
_tree.each.map do |object|
|
26
|
+
if object[:type] == :blob
|
27
|
+
blob_path = File.join(*[path, name].map(&:to_s).reject(&:empty?))
|
28
|
+
blob_path.sub!(/\/\z/, '')
|
29
|
+
blob_path = nil if blob_path.empty?
|
30
|
+
klass.new(repository, object[:oid], blob_path, object[:name])
|
31
|
+
end
|
32
|
+
end.compact
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
def file_name
|
37
|
+
File.join(*[path, name].map(&:to_s).reject(&:empty?))
|
38
|
+
end
|
39
|
+
|
40
|
+
def trees(klass: Gitmain::Tree, recursive: false)
|
41
|
+
if recursive
|
42
|
+
_tree.walk(:postorder).map do |root, object|
|
43
|
+
if object[:type] == :tree
|
44
|
+
tree_path = File.join(*[path, name, root].map(&:to_s).reject(&:empty?))
|
45
|
+
tree_path.sub!(/\/\z/, '')
|
46
|
+
tree_path = nil if tree_path.empty?
|
47
|
+
klass.new(repository, object[:oid], tree_path, object[:name])
|
48
|
+
end
|
49
|
+
end.compact
|
50
|
+
else
|
51
|
+
_tree.each.map do |object|
|
52
|
+
if object[:type] == :tree
|
53
|
+
tree_path = File.join(*[path, name].map(&:to_s).reject(&:empty?))
|
54
|
+
tree_path.sub!(/\/\z/, '')
|
55
|
+
tree_path = nil if tree_path.empty?
|
56
|
+
klass.new(repository, object[:oid], tree_path, object[:name])
|
57
|
+
end
|
58
|
+
end.compact
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
private
|
63
|
+
|
64
|
+
def _tree
|
65
|
+
@_tree ||= repository.rugged(id)
|
66
|
+
end
|
3
67
|
end
|
4
68
|
end
|
data/lib/gitmain/version.rb
CHANGED
@@ -0,0 +1,56 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class Gitmain::BlobTest < Minitest::Test
|
4
|
+
def test_initialize_requires_repository
|
5
|
+
assert_raises(ArgumentError) do
|
6
|
+
Gitmain::Blob.new('', '')
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
def test_initialize_requires_id
|
11
|
+
assert_raises(ArgumentError) do
|
12
|
+
empty_repository do |repository|
|
13
|
+
Gitmain::Blob.new(repository, '')
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
def test_initialized_values_are_retrievable
|
19
|
+
setup_repository do |repository|
|
20
|
+
blob = Gitmain::Blob.new(repository, '3245b20dc91de6cd85203c7184430a969689ac56')
|
21
|
+
assert_equal repository, blob.repository
|
22
|
+
assert_equal '3245b20dc91de6cd85203c7184430a969689ac56', blob.id
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
def test_changed_attributes
|
27
|
+
setup_repository do |repository|
|
28
|
+
blob = Gitmain::Blob.new(repository, '3245b20dc91de6cd85203c7184430a969689ac56')
|
29
|
+
assert_equal({}, blob.changed_attributes)
|
30
|
+
blob.content = 'Hello Gitmain World!'
|
31
|
+
assert_equal({ content: 'Hello World.' }, blob.changed_attributes)
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
def test_content
|
36
|
+
setup_repository do |repository|
|
37
|
+
blob = Gitmain::Blob.new(repository, '3245b20dc91de6cd85203c7184430a969689ac56')
|
38
|
+
assert_equal 'Hello World.', blob.content
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
def test_setting_content
|
43
|
+
setup_repository do |repository|
|
44
|
+
blob = Gitmain::Blob.new(repository, '3245b20dc91de6cd85203c7184430a969689ac56')
|
45
|
+
blob.content = 'Hello Gitmain World!'
|
46
|
+
assert_equal 'Hello Gitmain World!', blob.content
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
def test_file_name
|
51
|
+
setup_repository do |repository|
|
52
|
+
blob = Gitmain::Blob.new(repository, '5eddd8887f867c74cef97aa385448b56554b3454', 'lib', 'project.rb')
|
53
|
+
assert_equal 'lib/project.rb', blob.file_name
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
@@ -0,0 +1,68 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
|
4
|
+
class Gitmain::CommitTest < Minitest::Test
|
5
|
+
def test_initialize_requires_repository
|
6
|
+
assert_raises(ArgumentError) do
|
7
|
+
Gitmain::Commit.new('', '')
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
def test_initialize_requires_id
|
12
|
+
assert_raises(ArgumentError) do
|
13
|
+
empty_repository do |repository|
|
14
|
+
Gitmain::Commit.new(repository, '')
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
def test_initialized_values_are_retrievable
|
20
|
+
setup_repository do |repository|
|
21
|
+
commit = Gitmain::Commit.new(repository, 'd3d5eb0dcc42e58901414e24eb8b02c8b699b2d9')
|
22
|
+
assert_equal repository, commit.repository
|
23
|
+
assert_equal 'd3d5eb0dcc42e58901414e24eb8b02c8b699b2d9', commit.id
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
def test_author_email
|
28
|
+
setup_repository do |repository|
|
29
|
+
commit = Gitmain::Commit.new(repository, 'd3d5eb0dcc42e58901414e24eb8b02c8b699b2d9')
|
30
|
+
assert_equal 'gitmain@local', commit.author_email
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
def test_author_name
|
35
|
+
setup_repository do |repository|
|
36
|
+
commit = Gitmain::Commit.new(repository, 'd3d5eb0dcc42e58901414e24eb8b02c8b699b2d9')
|
37
|
+
assert_equal 'Gitmain', commit.author_name
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
def test_message
|
42
|
+
setup_repository do |repository|
|
43
|
+
commit = Gitmain::Commit.new(repository, 'd3d5eb0dcc42e58901414e24eb8b02c8b699b2d9')
|
44
|
+
assert_equal 'Full Repository Commit', commit.message
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
def test_parent_ids_with_root
|
49
|
+
setup_repository do |repository|
|
50
|
+
commit = Gitmain::Commit.new(repository, 'd3d5eb0dcc42e58901414e24eb8b02c8b699b2d9')
|
51
|
+
assert_empty commit.parent_ids
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
def test_parent_ids
|
56
|
+
setup_repository do |repository|
|
57
|
+
commit = Gitmain::Commit.new(repository, 'fb9d8f1ad958db545cc7b3374bed2b2c92db6545')
|
58
|
+
assert_equal ['d3d5eb0dcc42e58901414e24eb8b02c8b699b2d9'], commit.parent_ids
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
def test_time
|
63
|
+
setup_repository do |repository|
|
64
|
+
commit = Gitmain::Commit.new(repository, 'd3d5eb0dcc42e58901414e24eb8b02c8b699b2d9')
|
65
|
+
assert commit.time == Time.new(2016, 2, 15, 1, 2, 3)
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
@@ -0,0 +1,196 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class Gitmain::RepositoryTest < Minitest::Test
|
4
|
+
def setup
|
5
|
+
super
|
6
|
+
Gitmain::Repository.instance_variable_set(:@default_branch, nil)
|
7
|
+
Gitmain::Repository.instance_variable_set(:@dirname, nil)
|
8
|
+
end
|
9
|
+
|
10
|
+
def test_repository_default_branch_returns_default_value
|
11
|
+
assert_equal 'master', Gitmain::Repository.default_branch
|
12
|
+
end
|
13
|
+
|
14
|
+
def test_repository_default_branch_receives_and_returns_value
|
15
|
+
assert_equal 'production', Gitmain::Repository.default_branch('production')
|
16
|
+
assert_equal 'production', Gitmain::Repository.default_branch
|
17
|
+
end
|
18
|
+
|
19
|
+
def test_repository_dirname_must_receive_a_value
|
20
|
+
assert_raises(ArgumentError) do
|
21
|
+
Gitmain::Repository.dirname
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
def test_repository_dirname_receives_and_returns_value
|
26
|
+
assert_equal '/test', Gitmain::Repository.dirname('/test')
|
27
|
+
assert_equal '/test', Gitmain::Repository.dirname
|
28
|
+
end
|
29
|
+
|
30
|
+
def test_repository_init_requires_name
|
31
|
+
assert_raises(ArgumentError) do
|
32
|
+
Gitmain::Repository.init('')
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
def test_repository_init_returns_new_instance
|
37
|
+
Gitmain::Repository.dirname(repo_dirname)
|
38
|
+
repository = Gitmain::Repository.init('asdf-123')
|
39
|
+
assert repository.is_a?(Gitmain::Repository)
|
40
|
+
assert_equal repository.name, 'asdf-123'
|
41
|
+
end
|
42
|
+
|
43
|
+
def test_initialize_requires_name
|
44
|
+
assert_raises(ArgumentError) do
|
45
|
+
Gitmain::Repository.new('', '')
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
def test_initialize_requires_repository_name
|
50
|
+
assert_raises(ArgumentError) do
|
51
|
+
Gitmain::Repository.dirname(repo_dirname)
|
52
|
+
Gitmain::Repository.new('asdf-123', '')
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
def test_initialize_requires_bare_repository_name
|
57
|
+
assert_raises(ArgumentError) do
|
58
|
+
full_repository
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
def test_initialize_requires_branch
|
63
|
+
assert_raises(ArgumentError) do
|
64
|
+
Gitmain::Repository.dirname(repo_dirname)
|
65
|
+
Gitmain::Repository.new('repository', '')
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
def test_initialize_empty_repository_sets_rugged_repo
|
70
|
+
empty_repository do |repository|
|
71
|
+
rugged_repo = repository.instance_variable_get(:@_repo)
|
72
|
+
assert_equal rugged_repo.class, Rugged::Repository
|
73
|
+
assert_equal rugged_repo.path, File.join(repo_dirname, 'repository.git/')
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
def test_initialize_setup_repository_sets_rugged_repo_and_branch
|
78
|
+
setup_repository do |repository|
|
79
|
+
rugged_repo = repository.instance_variable_get(:@_repo)
|
80
|
+
assert_equal rugged_repo.class, Rugged::Repository
|
81
|
+
assert_equal rugged_repo.path, File.join(repo_dirname, 'repository.git/')
|
82
|
+
rugged_branch = repository.instance_variable_get(:@_branch)
|
83
|
+
assert_equal rugged_branch.class, Rugged::Branch
|
84
|
+
assert_equal rugged_branch.name, 'master'
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
def test_initialize_setup_repository_requires_known_branch
|
89
|
+
assert_raises(ArgumentError) do
|
90
|
+
setup_repository('dev')
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
def test_initialized_values_are_retrievable
|
95
|
+
empty_repository do |repository|
|
96
|
+
assert_equal 'repository', repository.name
|
97
|
+
assert_equal 'master', repository.branch
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
101
|
+
def test_initialize_allows_default_branch
|
102
|
+
empty_repository do |repository|
|
103
|
+
assert_equal Gitmain::Repository.default_branch, repository.branch
|
104
|
+
end
|
105
|
+
end
|
106
|
+
|
107
|
+
def test_commit_returns_nil_if_empty
|
108
|
+
empty_repository do |repository|
|
109
|
+
assert_nil repository.commit
|
110
|
+
end
|
111
|
+
end
|
112
|
+
|
113
|
+
def test_commit_returns_commit_instance
|
114
|
+
setup_repository do |repository|
|
115
|
+
rugged_repo = repository.instance_variable_get(:@_repo)
|
116
|
+
assert repository.commit.is_a?(Gitmain::Commit)
|
117
|
+
assert_equal repository.commit.repository, repository
|
118
|
+
assert_equal repository.commit.id, rugged_repo.branches['master'].target.oid
|
119
|
+
end
|
120
|
+
end
|
121
|
+
|
122
|
+
def test_commit_id_returns_nil_if_empty
|
123
|
+
empty_repository do |repository|
|
124
|
+
assert_nil repository.commit_id
|
125
|
+
end
|
126
|
+
end
|
127
|
+
|
128
|
+
def test_commit_id_returns_commit_sha
|
129
|
+
setup_repository do |repository|
|
130
|
+
rugged_repo = repository.instance_variable_get(:@_repo)
|
131
|
+
assert_equal rugged_repo.branches['master'].target.oid, repository.commit_id
|
132
|
+
end
|
133
|
+
end
|
134
|
+
|
135
|
+
def test_checkout_sets_branch
|
136
|
+
setup_repository do |repository|
|
137
|
+
assert_equal 'dev', repository.checkout('dev')
|
138
|
+
assert_equal 'dev', repository.branch
|
139
|
+
rugged_repo = repository.instance_variable_get(:@_repo)
|
140
|
+
assert_equal rugged_repo.branches['master'].target.tree_id, rugged_repo.branches['dev'].target.tree_id
|
141
|
+
end
|
142
|
+
end
|
143
|
+
|
144
|
+
def test_rename_sets_name
|
145
|
+
empty_repository do |repository|
|
146
|
+
assert_equal 'renamed', repository.rename('renamed')
|
147
|
+
assert_equal 'renamed', repository.name
|
148
|
+
end
|
149
|
+
end
|
150
|
+
|
151
|
+
def test_rename_affects_repository
|
152
|
+
empty_repository do |repository|
|
153
|
+
repository.rename('renamed')
|
154
|
+
rugged_repo = repository.instance_variable_get(:@_repo)
|
155
|
+
assert_equal rugged_repo.path, File.join(repo_dirname, 'renamed.git/')
|
156
|
+
end
|
157
|
+
end
|
158
|
+
|
159
|
+
def test_setup?
|
160
|
+
empty_repository do |repository|
|
161
|
+
refute repository.setup?
|
162
|
+
end
|
163
|
+
|
164
|
+
setup_repository do |repository|
|
165
|
+
assert repository.setup?
|
166
|
+
end
|
167
|
+
end
|
168
|
+
|
169
|
+
def test_tree_returns_nil_if_empty
|
170
|
+
empty_repository do |repository|
|
171
|
+
assert_nil repository.tree
|
172
|
+
end
|
173
|
+
end
|
174
|
+
|
175
|
+
def test_tree_returns_tree_instance
|
176
|
+
setup_repository do |repository|
|
177
|
+
rugged_repo = repository.instance_variable_get(:@_repo)
|
178
|
+
assert repository.tree.is_a?(Gitmain::Tree)
|
179
|
+
assert_equal repository.tree.repository, repository
|
180
|
+
assert_equal repository.tree.id, rugged_repo.branches['master'].target.tree_id
|
181
|
+
end
|
182
|
+
end
|
183
|
+
|
184
|
+
def test_tree_id_returns_nil_if_empty
|
185
|
+
empty_repository do |repository|
|
186
|
+
assert_nil repository.tree_id
|
187
|
+
end
|
188
|
+
end
|
189
|
+
|
190
|
+
def test_tree_id_returns_tree_sha
|
191
|
+
setup_repository do |repository|
|
192
|
+
rugged_repo = repository.instance_variable_get(:@_repo)
|
193
|
+
assert_equal repository.tree_id, rugged_repo.branches['master'].target.tree_id
|
194
|
+
end
|
195
|
+
end
|
196
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class BlobSubclass < Gitmain::Blob
|
4
|
+
end
|
5
|
+
|
6
|
+
class CommitSubclass < Gitmain::Commit
|
7
|
+
end
|
8
|
+
|
9
|
+
class TreeSubclass < Gitmain::Tree
|
10
|
+
end
|
11
|
+
|
12
|
+
class Gitmain::SubclassTest < Minitest::Test
|
13
|
+
def test_repository_commit_returns_customizable_commit_instance
|
14
|
+
setup_repository do |repository|
|
15
|
+
rugged_repo = repository.instance_variable_get(:@_repo)
|
16
|
+
assert repository.commit(klass: CommitSubclass).is_a?(CommitSubclass)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
def test_repository_tree_returns_customizable_tree_instance
|
21
|
+
setup_repository do |repository|
|
22
|
+
rugged_repo = repository.instance_variable_get(:@_repo)
|
23
|
+
assert repository.tree(klass: TreeSubclass).is_a?(TreeSubclass)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
def test_tree_blobs_returns_customizable_blob_instances
|
28
|
+
setup_repository do |repository|
|
29
|
+
tree = Gitmain::Tree.new(repository, repository.tree_id)
|
30
|
+
blob = tree.blobs(klass: BlobSubclass).first
|
31
|
+
assert blob.is_a?(BlobSubclass)
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
def test_trees
|
36
|
+
setup_repository do |repository|
|
37
|
+
tree = Gitmain::Tree.new(repository, repository.tree_id)
|
38
|
+
tree = tree.trees(klass: TreeSubclass).first
|
39
|
+
assert tree.is_a?(TreeSubclass)
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class Gitmain::TextBlobTest < Minitest::Test
|
4
|
+
def test_text
|
5
|
+
setup_repository do |repository|
|
6
|
+
blob = Gitmain::TextBlob.new(repository, '3245b20dc91de6cd85203c7184430a969689ac56')
|
7
|
+
assert_equal 'Hello World.', blob.text
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
def test_changed_attributes
|
12
|
+
setup_repository do |repository|
|
13
|
+
blob = Gitmain::TextBlob.new(repository, '3245b20dc91de6cd85203c7184430a969689ac56')
|
14
|
+
assert_equal({}, blob.changed_attributes)
|
15
|
+
blob.text = 'Hello Gitmain World!'
|
16
|
+
assert_equal({ text: 'Hello World.' }, blob.changed_attributes)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
def test_setting_text
|
21
|
+
setup_repository do |repository|
|
22
|
+
blob = Gitmain::TextBlob.new(repository, '3245b20dc91de6cd85203c7184430a969689ac56')
|
23
|
+
blob.text = 'Hello Gitmain World!'
|
24
|
+
assert_equal 'Hello Gitmain World!', blob.text
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,117 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class Gitmain::TreeTest < Minitest::Test
|
4
|
+
def test_initialize_requires_repository
|
5
|
+
assert_raises(ArgumentError) do
|
6
|
+
Gitmain::Tree.new('', '')
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
def test_initialize_requires_id
|
11
|
+
assert_raises(ArgumentError) do
|
12
|
+
empty_repository do |repository|
|
13
|
+
Gitmain::Tree.new(repository, '')
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
def test_initialized_values_are_retrievable
|
19
|
+
setup_repository do |repository|
|
20
|
+
tree = Gitmain::Tree.new(repository, repository.tree_id)
|
21
|
+
assert_equal repository, tree.repository
|
22
|
+
assert_equal repository.tree_id, tree.id
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
def test_blobs
|
27
|
+
setup_repository do |repository|
|
28
|
+
tree = Gitmain::Tree.new(repository, repository.tree_id)
|
29
|
+
blobs = tree.blobs
|
30
|
+
assert_equal 1, blobs.length
|
31
|
+
assert_blob blobs[0], repository, '3245b20dc91de6cd85203c7184430a969689ac56', 'README.md', nil
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
def test_blobs_recursively
|
36
|
+
setup_repository do |repository|
|
37
|
+
tree = Gitmain::Tree.new(repository, repository.tree_id)
|
38
|
+
blobs = tree.blobs(recursive: true)
|
39
|
+
assert_equal 6, blobs.length
|
40
|
+
assert_blob blobs[0], repository, '3245b20dc91de6cd85203c7184430a969689ac56', 'README.md', nil
|
41
|
+
assert_blob blobs[1], repository, '5eddd8887f867c74cef97aa385448b56554b3454', 'project.rb', 'lib'
|
42
|
+
assert_blob blobs[2], repository, '57f650530905c305e7e84554974e5c635fa89c14', 'module.rb', 'lib/project'
|
43
|
+
assert_blob blobs[3], repository, '4ffb2ae6bc8d01fc3e1e91291af58ae7e3f1d12f', 'module_test.rb', 'test/project'
|
44
|
+
assert_blob blobs[4], repository, 'f9d5f423b12dceacb756ac6770fba6267d732d8b', 'other_test.rb', 'test/project/nested'
|
45
|
+
assert_blob blobs[5], repository, 'e912ebf3225ea67b4612e431f6eb9805615544a7', 'test_helper.rb', 'test'
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
def test_trees
|
50
|
+
setup_repository do |repository|
|
51
|
+
tree = Gitmain::Tree.new(repository, repository.tree_id)
|
52
|
+
trees = tree.trees
|
53
|
+
assert_equal 2, trees.length
|
54
|
+
assert_tree trees[0], repository, 'dee8c1e1f54639d65453b72e2c698e2b84be8954', 'lib', nil
|
55
|
+
assert_tree trees[1], repository, 'd8280db63f0294724e2f95c371324be626fc3656', 'test', nil
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
def test_trees_recursively
|
60
|
+
setup_repository do |repository|
|
61
|
+
tree = Gitmain::Tree.new(repository, repository.tree_id)
|
62
|
+
trees = tree.trees(recursive: true)
|
63
|
+
assert_equal 5, trees.length
|
64
|
+
assert_tree trees[0], repository, '3eec4e80e151a2b5ddbd688d4cd5d4cd6b09cfdc', 'project', 'lib'
|
65
|
+
assert_tree trees[1], repository, 'dee8c1e1f54639d65453b72e2c698e2b84be8954', 'lib', nil
|
66
|
+
assert_tree trees[2], repository, '6f8ea40fcbd86bf53c514ec7e2246d468dfb2b80', 'nested', 'test/project'
|
67
|
+
assert_tree trees[3], repository, 'c062683857593d744b3e03671fdcf344cb4ab699', 'project', 'test'
|
68
|
+
assert_tree trees[4], repository, 'd8280db63f0294724e2f95c371324be626fc3656', 'test', nil
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
def test_non_root_blobs
|
73
|
+
setup_repository do |repository|
|
74
|
+
tree = Gitmain::Tree.new(repository, 'd8280db63f0294724e2f95c371324be626fc3656', nil, 'test')
|
75
|
+
blobs = tree.blobs
|
76
|
+
assert_equal 1, blobs.length
|
77
|
+
assert_blob blobs[0], repository, 'e912ebf3225ea67b4612e431f6eb9805615544a7', 'test_helper.rb', 'test'
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
def test_non_root_blobs_recursively
|
82
|
+
setup_repository do |repository|
|
83
|
+
tree = Gitmain::Tree.new(repository, 'd8280db63f0294724e2f95c371324be626fc3656', nil, 'test')
|
84
|
+
blobs = tree.blobs(recursive: true)
|
85
|
+
assert_equal 3, blobs.length
|
86
|
+
assert_blob blobs[0], repository, '4ffb2ae6bc8d01fc3e1e91291af58ae7e3f1d12f', 'module_test.rb', 'test/project'
|
87
|
+
assert_blob blobs[1], repository, 'f9d5f423b12dceacb756ac6770fba6267d732d8b', 'other_test.rb', 'test/project/nested'
|
88
|
+
assert_blob blobs[2], repository, 'e912ebf3225ea67b4612e431f6eb9805615544a7', 'test_helper.rb', 'test'
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
92
|
+
def test_non_root_trees
|
93
|
+
setup_repository do |repository|
|
94
|
+
tree = Gitmain::Tree.new(repository, 'd8280db63f0294724e2f95c371324be626fc3656', nil, 'test')
|
95
|
+
trees = tree.trees
|
96
|
+
assert_equal 1, trees.length
|
97
|
+
assert_tree trees[0], repository, 'c062683857593d744b3e03671fdcf344cb4ab699', 'project', 'test'
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
101
|
+
def test_non_root_trees_recursively
|
102
|
+
setup_repository do |repository|
|
103
|
+
tree = Gitmain::Tree.new(repository, 'd8280db63f0294724e2f95c371324be626fc3656', nil, 'test')
|
104
|
+
trees = tree.trees(recursive: true)
|
105
|
+
assert_equal 2, trees.length
|
106
|
+
assert_tree trees[0], repository, '6f8ea40fcbd86bf53c514ec7e2246d468dfb2b80', 'nested', 'test/project'
|
107
|
+
assert_tree trees[1], repository, 'c062683857593d744b3e03671fdcf344cb4ab699', 'project', 'test'
|
108
|
+
end
|
109
|
+
end
|
110
|
+
|
111
|
+
def test_file_name
|
112
|
+
setup_repository do |repository|
|
113
|
+
tree = Gitmain::Tree.new(repository, 'c062683857593d744b3e03671fdcf344cb4ab699', 'test', 'project')
|
114
|
+
assert_equal 'test/project', tree.file_name
|
115
|
+
end
|
116
|
+
end
|
117
|
+
end
|
data/test/test_helper.rb
ADDED
@@ -0,0 +1,97 @@
|
|
1
|
+
require_relative '../lib/gitmain'
|
2
|
+
require 'minitest'
|
3
|
+
require 'minitest/autorun'
|
4
|
+
require 'minitest/pride'
|
5
|
+
require 'rugged'
|
6
|
+
|
7
|
+
class Minitest::Test
|
8
|
+
def assert_blob(blob, repository, id, name, path)
|
9
|
+
assert blob.is_a?(Gitmain::Blob)
|
10
|
+
assert_equal repository, blob.repository
|
11
|
+
assert_equal id, blob.id
|
12
|
+
assert_equal name, blob.name
|
13
|
+
assert_equal path, blob.path
|
14
|
+
end
|
15
|
+
|
16
|
+
def assert_tree(tree, repository, id, name, path)
|
17
|
+
assert tree.is_a?(Gitmain::Tree)
|
18
|
+
assert_equal repository, tree.repository
|
19
|
+
assert_equal id, tree.id
|
20
|
+
assert_equal name, tree.name
|
21
|
+
assert_equal path, tree.path
|
22
|
+
end
|
23
|
+
|
24
|
+
def repo_dirname
|
25
|
+
File.expand_path('../../../tmp', __FILE__)
|
26
|
+
end
|
27
|
+
|
28
|
+
def setup
|
29
|
+
FileUtils.rm_rf(repo_dirname)
|
30
|
+
FileUtils.mkdir(repo_dirname)
|
31
|
+
end
|
32
|
+
|
33
|
+
def teardown
|
34
|
+
FileUtils.rm_rf(repo_dirname)
|
35
|
+
end
|
36
|
+
|
37
|
+
def empty_repository
|
38
|
+
FileUtils.rm_rf(File.join(repo_dirname, 'repository.git'))
|
39
|
+
Rugged::Repository.init_at(File.join(repo_dirname, 'repository.git'), :bare)
|
40
|
+
Gitmain::Repository.dirname(repo_dirname)
|
41
|
+
repository = Gitmain::Repository.new('repository')
|
42
|
+
yield repository if block_given?
|
43
|
+
FileUtils.rm_rf(File.join(repo_dirname, 'repository.git'))
|
44
|
+
end
|
45
|
+
|
46
|
+
def full_repository
|
47
|
+
FileUtils.rm_rf(File.join(repo_dirname, 'full.git'))
|
48
|
+
Rugged::Repository.init_at(File.join(repo_dirname, 'full.git'))
|
49
|
+
Gitmain::Repository.dirname(repo_dirname)
|
50
|
+
repository = Gitmain::Repository.new('full')
|
51
|
+
yield repository if block_given?
|
52
|
+
FileUtils.rm_rf(File.join(repo_dirname, 'full.git'))
|
53
|
+
end
|
54
|
+
|
55
|
+
def setup_repository(branch = 'master')
|
56
|
+
FileUtils.rm_rf(File.join(repo_dirname, 'repository.git'))
|
57
|
+
Rugged::Repository.init_at(File.join(repo_dirname, 'repository.git'), :bare)
|
58
|
+
FileUtils.rm_rf(File.join(repo_dirname, 'full_repository'))
|
59
|
+
FileUtils.mkdir_p(File.join(repo_dirname, 'full_repository'))
|
60
|
+
repo = Rugged::Repository.init_at(File.join(repo_dirname, 'full_repository'))
|
61
|
+
index = repo.index
|
62
|
+
oid = repo.write('Hello World.', :blob)
|
63
|
+
index.add(path: 'README.md', oid: oid, mode: 0100644)
|
64
|
+
oid = repo.write('# Project Setup', :blob)
|
65
|
+
index.add(path: 'lib/project.rb', oid: oid, mode: 0100644)
|
66
|
+
oid = repo.write('# Project Module', :blob)
|
67
|
+
index.add(path: 'lib/project/module.rb', oid: oid, mode: 0100644)
|
68
|
+
oid = repo.write('# Test Helper', :blob)
|
69
|
+
index.add(path: 'test/test_helper.rb', oid: oid, mode: 0100644)
|
70
|
+
oid = repo.write('# Module Test', :blob)
|
71
|
+
index.add(path: 'test/project/module_test.rb', oid: oid, mode: 0100644)
|
72
|
+
options = {}
|
73
|
+
options[:tree] = index.write_tree(repo)
|
74
|
+
options[:author] = options[:committer] = { email: 'gitmain@local', name: 'Gitmain', time: Time.new(2016, 2, 15, 1, 2, 3) }
|
75
|
+
options[:message] = 'Full Repository Commit'
|
76
|
+
options[:parents] = []
|
77
|
+
options[:update_ref] = 'refs/heads/master'
|
78
|
+
commit_id = Rugged::Commit.create(repo, options)
|
79
|
+
index = repo.index
|
80
|
+
oid = repo.write('# Nested Other Test', :blob)
|
81
|
+
index.add(path: 'test/project/nested/other_test.rb', oid: oid, mode: 0100644)
|
82
|
+
options = {}
|
83
|
+
options[:tree] = index.write_tree(repo)
|
84
|
+
options[:author] = options[:committer] = { email: 'gitmain@local', name: 'Gitmain', time: Time.new(2016, 2, 15, 1, 2, 3) }
|
85
|
+
options[:message] = 'Second Commit'
|
86
|
+
options[:parents] = [commit_id]
|
87
|
+
options[:update_ref] = 'refs/heads/master'
|
88
|
+
commit_id = Rugged::Commit.create(repo, options)
|
89
|
+
remote = repo.remotes.create_anonymous "file://#{File.join(repo_dirname, 'repository.git')}"
|
90
|
+
remote.push 'refs/heads/master'
|
91
|
+
Gitmain::Repository.dirname(repo_dirname)
|
92
|
+
repository = Gitmain::Repository.new('repository', branch)
|
93
|
+
yield repository if block_given?
|
94
|
+
FileUtils.rm_rf(File.join(repo_dirname, 'repository.git'))
|
95
|
+
FileUtils.rm_rf(File.join(repo_dirname, 'full_repository.git'))
|
96
|
+
end
|
97
|
+
end
|
metadata
CHANGED
@@ -1,18 +1,30 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: gitmain
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Theodore Kimble
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
12
|
-
dependencies:
|
13
|
-
|
14
|
-
|
15
|
-
|
11
|
+
date: 2016-02-15 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: rugged
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
27
|
+
description: ''
|
16
28
|
email:
|
17
29
|
- mail@theodorekimble.com
|
18
30
|
executables: []
|
@@ -23,11 +35,18 @@ files:
|
|
23
35
|
- README.md
|
24
36
|
- lib/gitmain.rb
|
25
37
|
- lib/gitmain/blob.rb
|
26
|
-
- lib/gitmain/branch.rb
|
27
38
|
- lib/gitmain/commit.rb
|
28
39
|
- lib/gitmain/repository.rb
|
40
|
+
- lib/gitmain/text_blob.rb
|
29
41
|
- lib/gitmain/tree.rb
|
30
42
|
- lib/gitmain/version.rb
|
43
|
+
- test/gitmain/blob_test.rb
|
44
|
+
- test/gitmain/commit_test.rb
|
45
|
+
- test/gitmain/repository_test.rb
|
46
|
+
- test/gitmain/subclass_test.rb
|
47
|
+
- test/gitmain/text_blob_test.rb
|
48
|
+
- test/gitmain/tree_test.rb
|
49
|
+
- test/test_helper.rb
|
31
50
|
homepage: https://github.com/theodorekimble/gitmain
|
32
51
|
licenses:
|
33
52
|
- MIT
|
@@ -48,8 +67,15 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
48
67
|
version: '0'
|
49
68
|
requirements: []
|
50
69
|
rubyforge_project:
|
51
|
-
rubygems_version: 2.
|
70
|
+
rubygems_version: 2.5.1
|
52
71
|
signing_key:
|
53
72
|
specification_version: 4
|
54
73
|
summary: Build Ruby Domain Models backed by Git Repositories
|
55
|
-
test_files:
|
74
|
+
test_files:
|
75
|
+
- test/gitmain/blob_test.rb
|
76
|
+
- test/gitmain/commit_test.rb
|
77
|
+
- test/gitmain/repository_test.rb
|
78
|
+
- test/gitmain/subclass_test.rb
|
79
|
+
- test/gitmain/text_blob_test.rb
|
80
|
+
- test/gitmain/tree_test.rb
|
81
|
+
- test/test_helper.rb
|
data/lib/gitmain/branch.rb
DELETED