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 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