reapack-index 1.0beta3 → 1.0beta4

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,59 @@
1
+ class ReaPack::Index
2
+ class Source
3
+ TAG = 'source'.freeze
4
+ PLATFORM = 'platform'.freeze
5
+ TYPE = 'type'.freeze
6
+ FILE = 'file'.freeze
7
+
8
+ PLATFORMS = {
9
+ all: nil,
10
+ windows: :all, win32: :windows, win64: :windows,
11
+ darwin: :all, darwin32: :darwin, darwin64: :darwin,
12
+ }.freeze
13
+
14
+ class << self
15
+ def is_platform?(input)
16
+ PLATFORMS.has_key? input&.to_sym
17
+ end
18
+ end
19
+
20
+ def initialize(url = nil)
21
+ @url = url
22
+ @platform = :all
23
+ end
24
+
25
+ attr_reader :platform, :type
26
+ attr_accessor :file, :url
27
+
28
+ def platform=(new_platform)
29
+ new_platform ||= :all
30
+
31
+ unless self.class.is_platform? new_platform
32
+ raise Error, "invalid platform '#{new_platform}'"
33
+ end
34
+
35
+ @platform = new_platform.to_sym
36
+ end
37
+
38
+ def type=(new_type)
39
+ return @type = new_type if new_type.nil?
40
+
41
+ unless ReaPack::Index.is_type? new_type
42
+ raise Error, "invalid type '#{new_type}'"
43
+ end
44
+
45
+ @type = new_type.to_sym
46
+ end
47
+
48
+ def make_node(parent)
49
+ @node = Nokogiri::XML::Node.new TAG, parent.document
50
+ @node[PLATFORM] = @platform
51
+ @node[TYPE] = @type if @type
52
+ @node[FILE] = @file if @file
53
+ @node.content = Addressable::URI.encode @url
54
+ @node.parent = parent
55
+ rescue Addressable::URI::InvalidURIError => e
56
+ raise Error, e.message
57
+ end
58
+ end
59
+ end
@@ -5,9 +5,8 @@ class ReaPack::Index
5
5
  AUTHOR = 'author'.freeze
6
6
  TIME = 'time'.freeze
7
7
 
8
- def initialize(node, parent = nil)
8
+ def initialize(node)
9
9
  super
10
-
11
10
  @changelog = Changelog.new @node
12
11
  end
13
12
 
@@ -64,13 +63,10 @@ class ReaPack::Index
64
63
  new_sources = hash_sources children(Source::TAG)
65
64
  @dirty = was_dirty || old_sources != new_sources
66
65
 
67
- if new_sources.empty?
68
- raise Error, 'no sources found. @provides tag missing?'
69
- end
66
+ raise Error, 'no files provided' if new_sources.empty?
70
67
  end
71
68
 
72
- def add_source(src, file = nil, url = nil)
73
- src = Source.new src, file, url unless src.is_a? Source
69
+ def add_source(src)
74
70
  src.make_node @node
75
71
 
76
72
  @dirty = true
@@ -84,51 +80,6 @@ class ReaPack::Index
84
80
  end
85
81
  end
86
82
 
87
- class Source
88
- TAG = 'source'.freeze
89
- PLATFORM = 'platform'.freeze
90
- FILE = 'file'.freeze
91
-
92
- PLATFORMS = [
93
- :all,
94
- :windows, :win32, :win64,
95
- :darwin, :darwin32, :darwin64,
96
- ].freeze
97
-
98
- def self.validate_platform(platform)
99
- return unless platform # nil platform will be replaced by the default
100
-
101
- unless PLATFORMS.include? platform.to_sym
102
- raise Error, 'invalid platform %s' % platform
103
- end
104
- end
105
-
106
- def initialize(platform = nil, file = nil, url = nil)
107
- self.platform = platform
108
- self.file = file
109
- self.url = url
110
- end
111
-
112
- def platform=(new_platform)
113
- new_platform = :all if new_platform.nil?
114
-
115
- self.class.validate_platform new_platform
116
-
117
- @platform = new_platform
118
- end
119
-
120
- attr_reader :platform
121
- attr_accessor :file, :url
122
-
123
- def make_node(parent)
124
- @node = Nokogiri::XML::Node.new TAG, parent.document
125
- @node.parent = parent
126
- @node[PLATFORM] = @platform
127
- @node[FILE] = @file if @file
128
- @node.content = Addressable::URI.encode @url
129
- end
130
- end
131
-
132
83
  class Changelog
133
84
  TAG = 'changelog'.freeze
134
85
 
@@ -9,18 +9,19 @@ Gem::Specification.new do |spec|
9
9
  spec.version = ReaPack::Index::VERSION
10
10
  spec.authors = ['cfillion']
11
11
  spec.email = ['reapack-index@cfillion.tk']
12
- spec.summary = 'Package indexer for ReaPack-based repositories'
12
+ spec.summary = 'Package indexer for git-based ReaPack repositories'
13
13
  spec.homepage = 'https://github.com/cfillion/reapack-index'
14
- spec.license = "GPL-3.0+"
14
+ spec.license = 'GPL-3.0+'
15
15
 
16
16
  spec.files = `git ls-files -z`.split("\x0")
17
17
  spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
18
  spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
- spec.require_paths = ["lib"]
19
+ spec.require_paths = ['lib']
20
+
21
+ spec.required_ruby_version = '>= 2.3'
20
22
 
21
23
  spec.add_development_dependency 'bundler', '~> 1.10'
22
24
  spec.add_development_dependency 'coveralls', '~> 0.8'
23
- spec.add_development_dependency 'git', '~> 1.3'
24
25
  spec.add_development_dependency 'minitest', '~> 5.8'
25
26
  spec.add_development_dependency 'rake', '~> 11.0'
26
27
  spec.add_development_dependency 'simplecov', '~> 0.11'
@@ -28,8 +29,8 @@ Gem::Specification.new do |spec|
28
29
  spec.add_runtime_dependency 'addressable', '~> 2.4'
29
30
  spec.add_runtime_dependency 'colorize', '~> 0.7'
30
31
  spec.add_runtime_dependency 'gitable', '~> 0.3'
31
- spec.add_runtime_dependency 'metaheader', '~> 1.0'
32
- spec.add_runtime_dependency 'nokogiri', '~> 1.6'
32
+ spec.add_runtime_dependency 'metaheader', '~> 1.1'
33
+ spec.add_runtime_dependency 'nokogiri', '~> 1.6.8.rc2'
33
34
  spec.add_runtime_dependency 'pandoc-ruby', '~> 2.0'
34
35
  spec.add_runtime_dependency 'rugged', '~> 0.24'
35
36
  end
@@ -2,11 +2,11 @@
2
2
  !include Sections.nsh
3
3
  !include StrRep.nsh
4
4
 
5
- !define VERSION "1.0beta3"
5
+ !define VERSION "1.0beta4"
6
6
  !define NAME "ReaPack Index ${VERSION}"
7
7
  !define LONG_VERSION "0.1.0.0"
8
8
 
9
- !define RUBY_VERSION "2.2.4"
9
+ !define RUBY_VERSION "2.3.0"
10
10
  !define RUBYINSTALLER_FILE "rubyinstaller-${RUBY_VERSION}.exe"
11
11
  !define RUBYINSTALLER_URL \
12
12
  "http://dl.bintray.com/oneclick/rubyinstaller/${RUBYINSTALLER_FILE}"
@@ -19,7 +19,7 @@
19
19
  !define RUGGED_VERSION "0.24.0"
20
20
  !define RUGGED_FILE "rugged-${RUGGED_VERSION}-%PLATFORM%.gem"
21
21
  !define RUGGED_URL \
22
- "https://github.com/cfillion/reapack-index/releases/download/v${VERSION}/${RUGGED_FILE}"
22
+ "https://github.com/cfillion/reapack-index/releases/download/v1.0beta4/${RUGGED_FILE}"
23
23
 
24
24
  Name "${NAME}"
25
25
  OutFile "reapack-index-${VERSION}.exe"
@@ -124,11 +124,15 @@ SectionEnd
124
124
  Function .onInit
125
125
  !insertmacro RELOAD_PATH
126
126
  nsExec::ExecToStack '"ruby" -e " \
127
+ rubyver = Gem::Version.new(RUBY_VERSION); \
128
+ exit 2 unless rubyver >= Gem::Version.new(\"${RUBY_VERSION}\"); \
129
+ ; \
127
130
  spec = Gem::Specification.find_all_by_name(\"rugged\").first; \
128
131
  req = Gem::Requirement.new(\"~> ${RUGGED_VERSION}\"); \
129
- raise unless spec && req =~ spec.version'
132
+ exit 3 unless spec && req =~ spec.version'
130
133
  Pop $0
131
134
 
135
+ StrCmp $0 "2" +2 0 ; ruby out of date
132
136
  StrCmp $0 "error" 0 +6 ; failed to launch ruby
133
137
  SectionGetFlags ${InstallRuby} $1
134
138
  IntOp $1 $1 | ${SF_SELECTED}
@@ -136,7 +140,7 @@ Function .onInit
136
140
  SectionSetFlags ${InstallRuby} $1
137
141
  Goto +2 ; also install rugged
138
142
 
139
- StrCmp $0 "1" 0 +5 ; rugged is not installed
143
+ StrCmp $0 "3" 0 +5 ; rugged missing/out of date
140
144
  SectionGetFlags ${InstallRugged} $1
141
145
  IntOp $1 $1 | ${SF_SELECTED}
142
146
  IntOp $1 $1 | ${SF_RO}
@@ -0,0 +1,190 @@
1
+ require File.expand_path '../../helper', __FILE__
2
+
3
+ TestCLI ||= Class.new MiniTest::Test
4
+
5
+ class TestCLI::Check < MiniTest::Test
6
+ include CLIHelper
7
+
8
+ def test_pass
9
+ expected = <<-STDERR
10
+ ..
11
+
12
+ Finished checks for 2 packages with 0 failures
13
+ STDERR
14
+
15
+ setup = proc { mkfile 'index.xml', '<index name="test"/>' }
16
+
17
+ wrapper ['--check'], setup: setup do
18
+ mkfile 'test1.lua', '@version 1.0'
19
+ mkfile 'test2.lua', '@version 1.0'
20
+
21
+ assert_output nil, expected do
22
+ assert_equal true, @cli.run
23
+ end
24
+ end
25
+ end
26
+
27
+ def test_failure
28
+ expected = <<-STDERR
29
+ F.
30
+
31
+ 1) cat/test1.lua failed:
32
+ missing tag 'version'
33
+ missing value for tag 'author'
34
+
35
+ Finished checks for 2 packages with 1 failure
36
+ STDERR
37
+
38
+ setup = proc { mkfile 'index.xml', '<index name="test"/>' }
39
+
40
+ wrapper ['--check'], setup: setup do
41
+ mkfile 'cat/test1.lua', '@author'
42
+ mkfile 'cat/test2.lua', '@version 1.0'
43
+
44
+ assert_output nil, expected do
45
+ assert_equal false, @cli.run
46
+ end
47
+ end
48
+ end
49
+
50
+ def test_uses_scan
51
+ expected = <<-STDERR
52
+ F
53
+
54
+ 1) Hello/World.lua failed:
55
+ file not found 'background.png'
56
+
57
+ Finished checks for 1 package with 1 failure
58
+ STDERR
59
+
60
+ setup = proc {
61
+ mkfile 'index.xml', <<-XML
62
+ <index name="test">
63
+ <category name="Hello">
64
+ <reapack name="World.lua" type="script">
65
+ <version name="1.0"/>
66
+ </reapack>
67
+ </category>
68
+ </index>
69
+ XML
70
+ }
71
+
72
+ wrapper ['--check'], setup: setup do
73
+ mkfile 'Hello/World.lua', "@version 1.0\n@provides background.png"
74
+
75
+ assert_output nil, expected do
76
+ assert_equal false, @cli.run
77
+ end
78
+ end
79
+ end
80
+
81
+ def test_quiet
82
+ expected = <<-STDERR
83
+ 1) cat/test1.lua failed:
84
+ missing tag 'version'
85
+ missing value for tag 'author'
86
+
87
+ 2) cat/test2.lua failed:
88
+ missing tag 'version'
89
+ STDERR
90
+
91
+ setup = proc { mkfile 'index.xml', '<index name="test"/>' }
92
+
93
+ wrapper ['--check', '--quiet'], setup: setup do
94
+ mkfile 'cat/test1.lua', '@author'
95
+ mkfile 'cat/test2.lua'
96
+ mkfile 'cat/test3.lua', '@version 1.0'
97
+
98
+ assert_output nil, expected do
99
+ assert_equal false, @cli.run
100
+ end
101
+ end
102
+ end
103
+
104
+ def test_ignore
105
+ setup = proc {
106
+ Dir.chdir @git.path
107
+ mkfile 'index.xml', '<index name="test"/>'
108
+ }
109
+
110
+ expected = <<-STDERR
111
+ .
112
+
113
+ Finished checks for 1 package with 0 failures
114
+ STDERR
115
+
116
+ wrapper ['--check', '--ignore=Hello', '--ignore=Chunky/Bacon.lua',
117
+ '--ignore=test2.lua', '--ignore=Directory/test'], setup: setup do
118
+ mkfile 'Hello/World.lua', 'konnichiwa'
119
+ mkfile 'Chunky/Bacon.lua', 'konnichiwa'
120
+ mkfile 'Directory/test/1.lua', 'konnichiwa'
121
+ mkfile 'Directory/test2.lua', '@version 1.0'
122
+
123
+ assert_output nil, expected do
124
+ @cli.run
125
+ end
126
+ end
127
+ end
128
+
129
+ def test_ignore_from_config
130
+ expected = <<-STDERR
131
+ .
132
+
133
+ Finished checks for 1 package with 0 failures
134
+ STDERR
135
+
136
+ setup = proc {
137
+ mkfile '.reapack-index.conf', <<-CONFIG
138
+ --ignore=Hello
139
+ --ignore=Chunky/Bacon.lua
140
+ --ignore=test2.lua
141
+ CONFIG
142
+
143
+ mkfile 'index.xml', '<index name="test"/>'
144
+ }
145
+
146
+ wrapper ['--check'], setup: setup do
147
+ mkfile 'Hello/World.lua', 'konnichiwa'
148
+ mkfile 'Chunky/Bacon.lua', 'konnichiwa'
149
+ mkfile 'Directory/test2.lua', '@version 1.0'
150
+
151
+ assert_output nil, expected do
152
+ @cli.run
153
+ end
154
+ end
155
+ end
156
+
157
+ def test_unset_name_warning
158
+ wrapper ['--check'] do
159
+ assert_output nil, /index is unnamed/i do
160
+ @cli.run
161
+ end
162
+ end
163
+ end
164
+
165
+ def test_verbose
166
+ expected = <<-STDERR
167
+ Path/To/test1.lua: failed
168
+ test2.lua: passed
169
+
170
+ 1) Path/To/test1.lua failed:
171
+ missing tag 'version'
172
+ missing value for tag 'author'
173
+
174
+ Finished checks for 2 packages with 1 failure
175
+ STDERR
176
+
177
+ setup = proc { mkfile 'index.xml', '<index name="test"/>' }
178
+
179
+ _, stderr = capture_io do
180
+ wrapper ['--check', '--verbose'], setup: setup do
181
+ mkfile 'Path/To/test1.lua', '@author'
182
+ mkfile 'test2.lua', '@version 1.0'
183
+
184
+ assert_equal false, @cli.run
185
+ end
186
+ end
187
+
188
+ assert_match expected, stderr
189
+ end
190
+ end
@@ -0,0 +1,194 @@
1
+ require File.expand_path '../../helper', __FILE__
2
+
3
+ TestCLI ||= Class.new MiniTest::Test
4
+
5
+ class TestCLI::Metadata < MiniTest::Test
6
+ include CLIHelper
7
+
8
+ def test_website_link
9
+ wrapper ['-l http://cfillion.tk'] do
10
+ assert_output "1 new website link, empty index\n" do
11
+ assert_equal true, @cli.run
12
+ end
13
+
14
+ assert_match 'rel="website">http://cfillion.tk</link>', read_index
15
+ end
16
+ end
17
+
18
+ def test_donation_link
19
+ wrapper ['--donation-link', 'Link Label=http://cfillion.tk'] do
20
+ assert_output "1 new donation link, empty index\n" do
21
+ assert_equal true, @cli.run
22
+ end
23
+
24
+ assert_match 'rel="donation" href="http://cfillion.tk">Link Label</link>',
25
+ read_index
26
+ end
27
+ end
28
+
29
+ def test_invalid_link
30
+ wrapper ['--link', 'shinsekai yori', '--donation-link', 'hello world',
31
+ '--link', 'http://cfillion.tk'] do
32
+ stdout, stderr = capture_io do
33
+ assert_equal true, @cli.run
34
+ end
35
+
36
+ assert_equal "1 new website link, empty index\n", stdout
37
+ assert_match /warning: --link: invalid link 'shinsekai yori'/i, stderr
38
+ assert_match /warning: --donation-link: invalid link 'hello world'/i, stderr
39
+ assert_match 'rel="website">http://cfillion.tk</link>', read_index
40
+ end
41
+ end
42
+
43
+ def test_remove_link
44
+ wrapper ['--link', 'http://test.com', '--link', '-http://test.com'] do
45
+ assert_output "1 new website link, 1 removed website link, empty index\n" do
46
+ assert_equal true, @cli.run
47
+ end
48
+
49
+ refute_match 'rel="website">http://test.com</link>', read_index
50
+ end
51
+ end
52
+
53
+ def test_list_links
54
+ setup = proc {
55
+ mkfile 'index.xml', <<-XML
56
+ <?xml version="1.0" encoding="utf-8"?>
57
+ <index version="1">
58
+ <metadata>
59
+ <link rel="website" href="http://anidb.net/a9002">Shinsekai Yori</link>
60
+ <link rel="donation" href="http://paypal.com">Donate!</link>
61
+ <link rel="website">http://cfillion.tk</link>
62
+ XML
63
+ }
64
+
65
+ wrapper ['--ls-links'], setup: setup do
66
+ stdin, stderr = capture_io do
67
+ assert_equal true, @cli.run
68
+ end
69
+
70
+ expected = <<-OUT
71
+ [website] Shinsekai Yori (http://anidb.net/a9002)
72
+ [website] http://cfillion.tk
73
+ [donation] Donate! (http://paypal.com)
74
+ OUT
75
+
76
+ assert_equal expected, stdin
77
+ assert_empty stderr
78
+ end
79
+ end
80
+
81
+ def test_about
82
+ opts = ['--about']
83
+ setup = proc { opts << mkfile('README.md', '# Hello World') }
84
+
85
+ wrapper opts, setup: setup do
86
+ assert_output "1 modified metadata, empty index\n" do
87
+ assert_equal true, @cli.run
88
+ end
89
+
90
+ assert_match 'Hello World', read_index
91
+ end
92
+ end
93
+
94
+ def test_about_file_not_found
95
+ # 404.md is read in the working directory
96
+ wrapper ['--about=404.md'] do
97
+ assert_output "empty index\n",
98
+ /warning: --about: no such file or directory - 404.md/i do
99
+ assert_equal true, @cli.run
100
+ end
101
+ end
102
+ end
103
+
104
+ def test_about_pandoc_not_found
105
+ old_path = ENV['PATH']
106
+
107
+ opts = ['--about']
108
+
109
+ setup = proc {
110
+ opts << mkfile('README.md', '# Hello World')
111
+ }
112
+
113
+ wrapper opts, setup: setup do
114
+ assert_output "empty index\n", /pandoc executable cannot be found/i do
115
+ ENV['PATH'] = String.new
116
+ assert_equal true, @cli.run
117
+ end
118
+ end
119
+ ensure
120
+ ENV['PATH'] = old_path
121
+ end
122
+
123
+ def test_about_clear
124
+ setup = proc {
125
+ mkfile 'index.xml', <<-XML
126
+ <index>
127
+ <metadata>
128
+ <description><![CDATA[Hello World]]></description>
129
+ </metadata>
130
+ </index>
131
+ XML
132
+ }
133
+
134
+ wrapper ['--remove-about'], setup: setup do
135
+ assert_output "1 modified metadata\n" do
136
+ assert_equal true, @cli.run
137
+ end
138
+
139
+ refute_match 'Hello World', read_index
140
+ end
141
+ end
142
+
143
+ def test_about_dump
144
+ setup = proc {
145
+ mkfile 'index.xml', <<-XML
146
+ <index>
147
+ <metadata>
148
+ <description><![CDATA[Hello World]]></description>
149
+ </metadata>
150
+ </index>
151
+ XML
152
+ }
153
+
154
+ wrapper ['--dump-about'], setup: setup do
155
+ assert_output 'Hello World' do
156
+ assert_equal true, @cli.run
157
+ end
158
+ end
159
+ end
160
+
161
+ def test_unset_name_warning
162
+ wrapper do
163
+ _, stderr = capture_io do
164
+ assert_equal true, @cli.run
165
+ end
166
+
167
+ assert_match /index is unnamed/i, stderr
168
+ refute_match File.dirname($0), stderr
169
+ refute_match 'name', read_index
170
+ end
171
+ end
172
+
173
+ def test_set_name
174
+ wrapper ['--name=Hello World'] do
175
+ _, stderr = capture_io do
176
+ assert_equal true, @cli.run
177
+ end
178
+
179
+ refute_match /index is unnamed/i, stderr
180
+ assert_match 'name="Hello World"', read_index
181
+ end
182
+ end
183
+
184
+ def test_set_name_invalid
185
+ wrapper ['--name=Hello/World'] do
186
+ _, stderr = capture_io do
187
+ assert_equal true, @cli.run
188
+ end
189
+
190
+ refute_match /The name of this index is unset/i, stderr
191
+ assert_match /invalid name 'Hello\/World'/i, stderr
192
+ end
193
+ end
194
+ end