gitmain 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: 85ad05c833f4687ccbec027180463cd8688bbba6
4
- data.tar.gz: 569d4e4d60c96b2ef31a849df646a3762131f0c3
3
+ metadata.gz: 0970ff8fb78602218d3bc39bb1943baf2ffabdb7
4
+ data.tar.gz: e0e669e4b88c990ca30316921730ca81f3b9e114
5
5
  SHA512:
6
- metadata.gz: cf3ee75273b0446355fce6068d7d07f6515deeae0034010af8ee501b833febe2f07f57e5ada01382a4f1ed8c7d1fbcb64981d2272cfe18bf812d86c3c7e67148
7
- data.tar.gz: 25bdf94720db09de0ae119874b9aa3d35049ed445ec00a791fa8367fc532f2ae79dfe7cdd95230bc4b96dcf22e35b9f85c3db870ea3de86f73f75dd8bc805b50
6
+ metadata.gz: 9ff714a52c49cbacf2498f1d28e49259e1a576ed8ec5dfc23eceff1c19353dc834849c40887c3985ffe8ca348de866b0e9a4441cc88048cf28a0fd8585ecbc41
7
+ data.tar.gz: c08cef6bf5afccf6beee51cd508e6b29aeb0659b7cf139e87328690a43d6fcf35f5ebc0b1c91fdc12614b3fada74e4806e4906396daa9a9f40db3083c50e68aa
@@ -1,5 +1,7 @@
1
+ require 'rugged'
1
2
  require 'gitmain/blob'
2
- require 'gitmain/branch'
3
3
  require 'gitmain/commit'
4
4
  require 'gitmain/repository'
5
+ require 'gitmain/text_blob'
5
6
  require 'gitmain/tree'
7
+ require 'gitmain/version'
@@ -1,4 +1,37 @@
1
1
  module Gitmain
2
- module Blob
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
@@ -1,4 +1,38 @@
1
1
  module Gitmain
2
- module Commit
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
@@ -1,4 +1,97 @@
1
1
  module Gitmain
2
- module Repository
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
@@ -0,0 +1,14 @@
1
+ require 'gitmain/blob'
2
+
3
+ module Gitmain
4
+ class TextBlob < Blob
5
+ def text
6
+ @text ||= _blob&.text
7
+ end
8
+
9
+ def text=(value)
10
+ changed_attributes[:text] = text
11
+ @text = value
12
+ end
13
+ end
14
+ end
@@ -1,4 +1,68 @@
1
1
  module Gitmain
2
- module Tree
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
@@ -1,3 +1,3 @@
1
1
  module Gitmain
2
- VERSION = '0.0.1'
2
+ VERSION = '0.0.2'
3
3
  end
@@ -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
@@ -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.1
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: 2015-12-29 00:00:00.000000000 Z
12
- dependencies: []
13
- description: |2
14
- Gitmain is a collection of Ruby mixins that allow your plain old ruby
15
- objects to infer their attributes from git repositories.
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.4.5.1
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
@@ -1,4 +0,0 @@
1
- module Gitmain
2
- module Branch
3
- end
4
- end