pirka 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
data/app/update.rb ADDED
@@ -0,0 +1,67 @@
1
+ require "English"
2
+ require "pathname"
3
+ require "uri"
4
+ require "pirka/library"
5
+ require_relative "subcommand"
6
+
7
+ module Pirka
8
+ class App
9
+ class Update
10
+ PROGRAM_NAME = "update"
11
+ DESCRIPTION = "Update library files by remote files"
12
+
13
+ include Subcommand
14
+
15
+ URI = ::URI.parse("https://gitlab.com/KitaitiMakoto/pirka-library.git")
16
+
17
+ def run(argv)
18
+ parse_options! argv
19
+ ensure_git_command
20
+ dir = determine_directory(URI)
21
+ if dir.directory?
22
+ update_repository(URI, dir)
23
+ else
24
+ clone_repository(URI, dir)
25
+ $stderr.puts "Library was cloned to:"
26
+ $stdout.puts dir
27
+ @config.additional_directories << dir
28
+ @config.library_repositories << URI
29
+ begin
30
+ @config.save
31
+ $stderr.puts "and added to config file #{@config.filepath.to_s.dump}"
32
+ rescue Errno::EACCESS => error
33
+ $stderr.puts "Couldn't save config file to #{@config.filepath.to_s.dump}"
34
+ $stderr.puts error
35
+ end
36
+ end
37
+ end
38
+
39
+ def ensure_git_command
40
+ raise "Cannot find `git` command" unless system("type", "git")
41
+ end
42
+
43
+ # @todo Make more generic
44
+ def determine_directory(uri)
45
+ (Pathname.new(Dir.home)/".local/share/pirka"/uri.host/uri.path[1..-1]).sub_ext("")
46
+ end
47
+
48
+ def clone_repository(uri, dir)
49
+ run_command "git clone #{uri} #{dir}"
50
+ end
51
+
52
+ # @todo Make more generic
53
+ def update_repository(uri, dir)
54
+ Dir.chdir dir do
55
+ run_command "git fetch origin master && git checkout origin/master"
56
+ end
57
+ end
58
+
59
+ def run_command(command)
60
+ output = `#{command}`
61
+ $stderr.puts "Executing \`#{command}\`"
62
+ raise "Failed to execute \`#{command}\`" unless $CHILD_STATUS.success?
63
+ output
64
+ end
65
+ end
66
+ end
67
+ end
data/app.rb ADDED
@@ -0,0 +1,74 @@
1
+ require "optparse"
2
+ require "pirka/version"
3
+ require "pirka/config"
4
+
5
+ gem "epub-parser", Pirka::EPUB_PARSER_VERSION
6
+
7
+ module Pirka
8
+ class App
9
+ DESCRIPTION = "Pirka highlights source code syntax in EPUB files"
10
+ APPS = {}
11
+
12
+ def initialize
13
+ @config = nil
14
+ @tmp_opts = {
15
+ "additional_directories" => []
16
+ }
17
+ end
18
+
19
+ def run(argv)
20
+ parse_options! argv
21
+ app = APPS[argv.first] ? APPS[argv.shift] : Highlight
22
+ app.new(@config).run(argv)
23
+ end
24
+
25
+ private
26
+
27
+ def parse_options!(argv)
28
+ config_path = Config.filepath
29
+
30
+ parser = OptionParser.new {|opt|
31
+ opt.version = Pirka::VERSION
32
+
33
+ opt.banner = <<EOB
34
+ #{DESCRIPTION}
35
+
36
+ Usage: #{opt.program_name} [global options] [<command>] [options]
37
+ EOB
38
+
39
+ opt.separator ""
40
+ opt.separator "Global options:"
41
+ opt.on "-c", "--config=FILE", "Config file. Defaults to #{Config.filepath}", Pathname do |path|
42
+ config_path = path
43
+ end
44
+ opt.on "-s", "--data-home=DIRECTORY", "Directory to *SAVE* library data", Pathname do |path|
45
+ @tmp_opts["data_home"] = path
46
+ end
47
+ opt.on "-d", "--directory=DIRECTORY", "Directory to *SEARCH* library data.", "Specify multiple times to add multiple directories.", Pathname do |path|
48
+ @tmp_opts["additional_directories"] << path
49
+ end
50
+
51
+ opt.separator ""
52
+ opt.separator "Commands:"
53
+ width = APPS.keys.collect(&:length).max
54
+ APPS.each_pair do |command, app|
55
+ opt.separator opt.summary_indent + command.ljust(width) +
56
+ opt.summary_indent * 2 + app::DESCRIPTION
57
+ end
58
+ opt.separator "If command is ommitted, highlight is used with no option"
59
+ }
60
+ parser.order! argv
61
+ @config = config_path.file? ? Config.load_file(config_path) : Config.new
62
+ @config.data_home = @tmp_opts["data_home"] if @tmp_opts["data_home"]
63
+ @config.additional_directories = @tmp_opts["additional_directories"] unless @tmp_opts["additional_directories"].empty?
64
+
65
+ Library.data_home = @config.data_home
66
+ Library.additional_directories = @config.additional_directories
67
+ end
68
+ end
69
+ end
70
+
71
+ require_relative "app/highlight"
72
+ require_relative "app/detect"
73
+ require_relative "app/update"
74
+ require_relative "app/lib"
data/bin/pirka ADDED
@@ -0,0 +1,17 @@
1
+ #!/usr/bin/env ruby
2
+ require_relative "../app"
3
+
4
+ root = File.expand_path(File.join(File.dirname(__FILE__),'..'))
5
+ if File.directory?(File.join(root,'.git'))
6
+ Dir.chdir(root) do
7
+ begin
8
+ require 'bundler/setup'
9
+ rescue LoadError => e
10
+ warn e.message
11
+ warn "Run `gem install bundler` to install Bundler"
12
+ exit -1
13
+ end
14
+ end
15
+ end
16
+
17
+ Pirka::App.new.run(ARGV)
@@ -0,0 +1,110 @@
1
+ require "pathname"
2
+ require "yaml"
3
+ require "pirka/library"
4
+
5
+ module Pirka
6
+ class Config
7
+ FILE_NAME = "pirka.yaml"
8
+ XDG_CONFIG_HOME = Pathname.new(".config")
9
+ CONFIG_FILE= XDG_CONFIG_HOME/FILE_NAME
10
+ XDG_CONFIG_DIRS = [Pathname.new("/etc/xdg")]
11
+ CONFIG_DIRS = XDG_CONFIG_DIRS.collect {|dir| dir/FILE_NAME}
12
+
13
+ @config_home = nil
14
+ @additional_directories = []
15
+
16
+ class << self
17
+ attr_accessor :config_home, :additional_directories
18
+
19
+ def directories(user = nil)
20
+ config_dirs = ENV["XDG_CONFIG_DIRS"] ?
21
+ ENX["XDG_CONFIG_DIR"].split(":").collect {|dir| Pathname.new(dir)} :
22
+ CONFIG_DIRS
23
+ config_home = ENV["XDG_CONFIG_HOME"] ?
24
+ Pathname.new(ENV["XDG_CONFIG_HOME"]) :
25
+ Pathname.new(Dir.home(user))/XDG_CONFIG_HOME
26
+ ([@config_home, config_home] + @additional_directories + config_dirs).compact
27
+ end
28
+
29
+ def config_directory(user = nil)
30
+ directories.first
31
+ end
32
+
33
+ def load_file(path)
34
+ load_hash(
35
+ YAML.load_file(path).each_with_object({}) {|(key, value), h|
36
+ h[key] = case key
37
+ when "data_home"
38
+ Pathname(value)
39
+ when "additional_directories"
40
+ value.collect {|val| Pathname(val)}
41
+ when "library_repositories"
42
+ value.collect {|val| URI(val)}
43
+ else
44
+ value
45
+ end
46
+ })
47
+ end
48
+
49
+ def load_hash(h)
50
+ config = new
51
+ %w[data_home additional_directories library_repositories].each do |attr|
52
+ config.__send__("#{attr}=", h[attr]) if h[attr]
53
+ end
54
+ config
55
+ end
56
+
57
+ def filepath
58
+ config_directory/FILE_NAME
59
+ end
60
+ end
61
+
62
+ attr_accessor :data_home, :additional_directories, :library_repositories
63
+
64
+ # @todo Consider login user
65
+ def initialize
66
+ @data_home = nil
67
+ @additional_directories = []
68
+ @library_repositories = []
69
+ end
70
+
71
+ # @todo Consider login user
72
+ def path_from_repository(repository_uri)
73
+ Library.data_directory/dirname_from_repository(repository_uri)
74
+ end
75
+
76
+ # @todo Consider URIs other than Git HTTPS URI
77
+ def dirname_from_repository(repository_uri)
78
+ repository_uri.host/repository_uri.path[1..-1].sub_ext("")
79
+ end
80
+
81
+ def config_directory(user = nil)
82
+ self.class.config_directory(user)
83
+ end
84
+
85
+ def filepath
86
+ self.class.filepath
87
+ end
88
+
89
+ def save(path = nil)
90
+ path = Pathname(path || filepath)
91
+ path.dirname.mkpath unless path.dirname.directory?
92
+ path.write to_yaml
93
+ path
94
+ end
95
+
96
+ def to_h
97
+ h = {}
98
+ h["data_home"] = @data_home.to_path if @data_home
99
+ %w[additional_directories library_repositories].each do |key|
100
+ value = __send__(key)
101
+ h[key] = value.collect(&:to_s) unless value.empty?
102
+ end
103
+ h
104
+ end
105
+
106
+ def to_yaml
107
+ to_h.to_yaml
108
+ end
109
+ end
110
+ end
@@ -0,0 +1,152 @@
1
+ require "pathname"
2
+ require "base64"
3
+ require "yaml"
4
+ require "epub/parser/cfi"
5
+
6
+ module Pirka
7
+ # Environment variables affect this class:
8
+ # XDG_DATA_HOME: Directory to store library files and read. Defaults to $HOME/.local/share
9
+ # XDG_DATA_DIRS: Directories to search library files. Separated with a colon ':'. Defaults to /usr/local/share:/usr/share
10
+ #
11
+ # @see https://standards.freedesktop.org/basedir-spec/basedir-spec-latest.html
12
+ class Library
13
+ DIR_NAME = "pirka/local"
14
+ EXT = ".yaml"
15
+ SUBDIR_LENGTH = 4
16
+ XDG_DATA_HOME = Pathname.new(".local/share")
17
+ DATA_HOME = XDG_DATA_HOME/DIR_NAME
18
+ XDG_DATA_DIRS = [Pathname.new("/usr/local/share"), Pathname.new("/usr/share")]
19
+ DATA_DIRS = XDG_DATA_DIRS.collect {|dir| dir/DIR_NAME}
20
+
21
+ @data_home = nil
22
+ @additional_directories = []
23
+
24
+ class << self
25
+ attr_accessor :data_home, :additional_directories
26
+
27
+ # @return [Array<Pathname>]
28
+ def directories(user = nil)
29
+ data_dirs = ENV["XDG_DATA_DIRS"] ?
30
+ ENV["XDG_DATA_DIRS"].split(":").collect {|dir| Pathname.new(dir)/DIR_NAME} :
31
+ DATA_DIRS
32
+ data_home = ENV["XDG_DATA_HOME"] ?
33
+ Pathname.new(ENV["XDG_DATA_HOME"])/DIR_NAME :
34
+ Pathname.new(Dir.home(user))/DATA_HOME
35
+ ([@data_home, data_home] + @additional_directories + data_dirs).compact
36
+ end
37
+
38
+ # @see https://standards.freedesktop.org/basedir-spec/basedir-spec-latest.html
39
+ def data_directory(user = nil)
40
+ directories.first
41
+ end
42
+
43
+ # @param [String] release_identifier
44
+ # @return [Library, nil]
45
+ def find_by_release_identifier(release_identifier)
46
+ lib_path = filename(release_identifier)
47
+ directories.each do |dir|
48
+ path = dir/lib_path
49
+ return load_file(path) if path.file?
50
+ end
51
+ nil
52
+ end
53
+
54
+ # @param [String] release_identifier Release Identifier
55
+ # @return [String] String that `Release Identifier` property in metadata is encoded based on RFC 4648 "Base 64 Encoding with URL and Filename Safe Alphabet"
56
+ # @see https://tools.ietf.org/html/rfc4648#page-7
57
+ # @todo Better name
58
+ def basename_without_ext(release_identifier)
59
+ Base64.urlsafe_encode64(release_identifier)
60
+ end
61
+
62
+ def filename(release_identifier)
63
+ name = basename_without_ext(release_identifier)
64
+ name.insert(SUBDIR_LENGTH, "/") if name.length > SUBDIR_LENGTH
65
+ name + EXT
66
+ end
67
+
68
+ # @param [Pathname, String] path
69
+ # @return [Library]
70
+ def load_file(path)
71
+ load_hash(YAML.load_file(path.to_s))
72
+ end
73
+
74
+ # @param [Hash] h
75
+ # @return [Library]
76
+ def load_hash(h)
77
+ library = new
78
+
79
+ h.each_pair do |key, value|
80
+ if key == "codelist"
81
+ value.each_pair do |cfi, data|
82
+ library.codelist[EPUB::Parser::CFI.parse(cfi)] = data
83
+ end
84
+ else
85
+ library.metadata[key] = value
86
+ end
87
+ end
88
+
89
+ library
90
+ end
91
+ end
92
+
93
+ attr_reader :metadata, :codelist
94
+
95
+ # @param [Pathname, String, nil] directory for library files. When `nil` passed, default directories are used
96
+ def initialize
97
+ @metadata = {}
98
+ @codelist = {}
99
+ end
100
+
101
+ def data_directory(user = nil)
102
+ self.class.data_directory(user)
103
+ end
104
+
105
+ def filename
106
+ raise "Release Identifier is not set" unless @metadata["Release Identifier"]
107
+ self.class.filename(@metadata["Release Identifier"])
108
+ end
109
+
110
+ # @param [Pathname, String, nil] path File path to save library data.
111
+ # When `nil` is passwd, default directory + filename determined by Release Identifier is used
112
+ # @return [Pathname] File path that library data was saved
113
+ def save(path = nil)
114
+ path = data_directory/filename unless path
115
+ path = Pathname(path)
116
+ path.dirname.mkpath unless path.dirname.directory?
117
+ path.write to_yaml
118
+ path
119
+ end
120
+
121
+ # Iterate over codelist in order of EPUB CFI
122
+ # @overload each
123
+ # @yieldparam [EPUB::CFI] cfi EPUB CFI indicating code element
124
+ # @yieldparam [String] language Language name
125
+ # @overload each
126
+ # @return [Enumerator] Enumerator which iterates over cfi and lang
127
+ def each
128
+ sorted_list = @codelist.each_pair.sort_by {|(cfi, lang)| cfi}
129
+ if block_given?
130
+ sorted_list.each do |(cfi, lang)|
131
+ yield cfi, lang
132
+ end
133
+ else
134
+ sorted_list.each
135
+ end
136
+ end
137
+
138
+ # @return [Hash]
139
+ def to_h
140
+ metadata.merge({
141
+ "codelist" => each.with_object({}) {|(cfi, value), list|
142
+ list[cfi.to_fragment] = value
143
+ }
144
+ })
145
+ end
146
+
147
+ # @return [String]
148
+ def to_yaml
149
+ to_h.to_yaml
150
+ end
151
+ end
152
+ end
@@ -0,0 +1,22 @@
1
+ #
2
+ # Copyright (c) 2017 KITAITI Makoto (KitaitiMakoto at gmail.com)
3
+ #
4
+ # pirka is free software: you can redistribute it and/or modify
5
+ # it under the terms of the GNU General Public License as published by
6
+ # the Free Software Foundation, either version 3 of the License, or
7
+ # (at your option) any later version.
8
+ #
9
+ # pirka is distributed in the hope that it will be useful,
10
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
11
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12
+ # GNU General Public License for more details.
13
+ #
14
+ # You should have received a copy of the GNU General Public License
15
+ # along with pirka. If not, see <http://www.gnu.org/licenses/>.
16
+ #
17
+
18
+ module Pirka
19
+ # pirka version
20
+ VERSION = "0.1.0"
21
+ EPUB_PARSER_VERSION = "0.3.1"
22
+ end
data/lib/pirka.rb ADDED
@@ -0,0 +1 @@
1
+ require 'pirka/version'
data/pirka.gemspec ADDED
@@ -0,0 +1,49 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ lib = File.expand_path('../lib', __FILE__)
4
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
5
+ require 'pirka/version'
6
+
7
+ Gem::Specification.new do |gem|
8
+ gem.name = "pirka"
9
+ gem.version = Pirka::VERSION
10
+ gem.summary = %q{Syntax highlighting tool for EPUB books}
11
+ gem.description = %q{Pirka highlights source code syntax in EPUB books}
12
+ gem.license = "GPL"
13
+ gem.authors = ["KITAITI Makoto"]
14
+ gem.email = "KitaitiMakoto@gmail.com"
15
+ gem.homepage = "https://gitlab.com/KitaitiMakoto/pirka"
16
+
17
+ gem.files = `git ls-files`.split($/)
18
+
19
+ `git submodule --quiet foreach --recursive pwd`.split($/).each do |submodule|
20
+ submodule.sub!("#{Dir.pwd}/",'')
21
+
22
+ Dir.chdir(submodule) do
23
+ `git ls-files`.split($/).map do |subpath|
24
+ gem.files << File.join(submodule,subpath)
25
+ end
26
+ end
27
+ end
28
+ gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
29
+ gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
30
+ gem.require_paths = ['lib']
31
+
32
+ gem.add_runtime_dependency 'epub-parser', Pirka::EPUB_PARSER_VERSION
33
+ gem.add_runtime_dependency 'epub-maker'
34
+ gem.add_runtime_dependency 'rouge'
35
+ gem.add_runtime_dependency 'rouge-lexers-fluentd'
36
+ gem.add_runtime_dependency 'optparse-pathname'
37
+ gem.add_runtime_dependency 'colored'
38
+
39
+ gem.add_development_dependency 'bundler'
40
+ gem.add_development_dependency 'rake'
41
+ gem.add_development_dependency 'test-unit'
42
+ gem.add_development_dependency 'test-unit-notify'
43
+ gem.add_development_dependency 'simplecov'
44
+ gem.add_development_dependency 'rubygems-tasks'
45
+ gem.add_development_dependency 'yard'
46
+ gem.add_development_dependency 'pry'
47
+ gem.add_development_dependency 'pry-doc'
48
+ gem.add_development_dependency 'zipruby'
49
+ end
@@ -0,0 +1,10 @@
1
+ ---
2
+ Release Identifier: abc
3
+ title: abc
4
+ codelist:
5
+ epubcfi(/6/30!/4/2/56/2):
6
+ language: nginx
7
+ epubcfi(/6/30!/4/2/58/2):
8
+ language: nginx
9
+ epubcfi(/6/31!/4/2/56/2):
10
+ language: nginx
data/test/helper.rb ADDED
@@ -0,0 +1,18 @@
1
+ require 'rubygems'
2
+
3
+ begin
4
+ require 'bundler/setup'
5
+ rescue LoadError => error
6
+ abort error.message
7
+ end
8
+
9
+ require "simplecov"
10
+ SimpleCov.start do
11
+ add_filter "/test"
12
+ end
13
+
14
+ require 'test/unit'
15
+ require "test/unit/notify"
16
+
17
+ class Test::Unit::TestCase
18
+ end
@@ -0,0 +1,152 @@
1
+ require "helper"
2
+ require "yaml"
3
+ require "tmpdir"
4
+ require "pirka/library"
5
+ require "epub/parser/cfi"
6
+
7
+ class TestLibrary < Test::Unit::TestCase
8
+ def setup
9
+ Pirka::Library.data_home = nil
10
+ Pirka::Library.additional_directories.clear
11
+ @library = Pirka::Library.new
12
+ @library.metadata["Release Identifier"] = "abc"
13
+ @library.metadata["title"] = "abc"
14
+ @library.codelist[EPUB::CFI("/6/30!/4/2/58/2")] = {"language" => "nginx"}
15
+ @library.codelist[EPUB::CFI("/6/31!/4/2/56/2")] = {"language" => "nginx"}
16
+ @library.codelist[EPUB::CFI("/6/30!/4/2/56/2")] = {"language" => "nginx"}
17
+ @fixure_path = "test/fixtures/YWJj.yaml"
18
+ @yaml = <<EOY
19
+ ---
20
+ Release Identifier: abc
21
+ title: abc
22
+ codelist:
23
+ epubcfi(/6/30!/4/2/56/2):
24
+ language: nginx
25
+ epubcfi(/6/30!/4/2/58/2):
26
+ language: nginx
27
+ epubcfi(/6/31!/4/2/56/2):
28
+ language: nginx
29
+ EOY
30
+ end
31
+
32
+ def test_load_hash
33
+ actual = Pirka::Library.load_hash(YAML.load(@yaml))
34
+ assert_equal @library.metadata, actual.metadata
35
+ assert_equal @library.each.to_a, actual.each.to_a
36
+ end
37
+
38
+ def test_load_file
39
+ actual = Pirka::Library.load_file(@fixure_path)
40
+ assert_equal @library.metadata, actual.metadata
41
+ assert_equal @library.each.to_a, actual.each.to_a
42
+ end
43
+
44
+ def test_each_iterates_over_list_in_order_of_cfi
45
+ cfis = %w[/6/30!/4/2/56/2
46
+ /6/30!/4/2/58/2
47
+ /6/31!/4/2/56/2]
48
+ i = 0
49
+ @library.each do |(cfi, _)|
50
+ assert_equal cfi.to_s, cfis[i]
51
+ i += 1
52
+ end
53
+ end
54
+
55
+ def test_each_returns_enumerator
56
+ assert_equal %w[/6/30!/4/2/56/2
57
+ /6/30!/4/2/58/2
58
+ /6/31!/4/2/56/2],
59
+ @library.each.collect {|(cfi, _)| cfi.to_s}
60
+ end
61
+
62
+ def test_to_yaml
63
+ expected = YAML.load(@yaml)
64
+ actual = YAML.load(@library.to_yaml)
65
+ assert_equal expected, actual
66
+ end
67
+
68
+ def test_save_to_path_when_path_specified
69
+ Dir.mktmpdir "pirka" do |dir|
70
+ path = Pathname.new(dir)/"arbitral-filename.yaml"
71
+ @library.save(path)
72
+ data = YAML.load_file(path.to_path)
73
+ codelist = data.delete("codelist")
74
+ assert_equal @library.metadata, data
75
+
76
+ expected_codelist = @library.each.with_object({}) {|(cfi, value), list|
77
+ list[cfi.to_fragment] = value
78
+ }
79
+ assert_equal expected_codelist, codelist
80
+ end
81
+ end
82
+
83
+ def test_save_to_default_directory_when_path_not_specified
84
+ Dir.mktmpdir "pirka" do |dir|
85
+ xdh = ENV["XDG_DATA_HOME"]
86
+ begin
87
+ ENV["XDG_DATA_HOME"] = dir
88
+ @library.save
89
+ ensure
90
+ ENV["XDG_DATA_HOME"] = xdh
91
+ end
92
+ path = Pathname.new(dir)/"pirka/local/YWJj.yaml"
93
+ assert_path_exist path
94
+
95
+ data = YAML.load_file(path)
96
+ codelist = data.delete("codelist")
97
+ assert_equal @library.metadata, data
98
+
99
+ expected_codelist = @library.each.with_object({}) {|(cfi, value), list|
100
+ list[cfi.to_fragment] = value
101
+ }
102
+ assert_equal expected_codelist, codelist
103
+ end
104
+ end
105
+
106
+ def test_save_to_specified_directory_when_data_home_is_specified
107
+ Dir.mktmpdir "pirka" do |dir|
108
+ Pirka::Library.data_home = Pathname.new(dir)
109
+ library = Pirka::Library.new
110
+ library.metadata["Release Identifier"] = "abc"
111
+ library.metadata["title"] = "abc"
112
+ library.codelist[EPUB::CFI("/6/30!/4/2/58/2")] = {"language" => "nginx"}
113
+ library.codelist[EPUB::CFI("/6/31!/4/2/56/2")] = {"language" => "nginx"}
114
+ library.codelist[EPUB::CFI("/6/30!/4/2/56/2")] = {"language" => "nginx"}
115
+
116
+ library.save
117
+
118
+ path = Pathname.new("#{dir}/YWJj.yaml")
119
+ assert_path_exist path.to_path
120
+ assert_equal @yaml, path.read
121
+ end
122
+ end
123
+
124
+ def test_save_makes_subdirectory_when_basename_is_longer_than_4_characters
125
+ Dir.mktmpdir "pirka" do |dir|
126
+ Pirka::Library.data_home = Pathname.new(dir)
127
+ library = Pirka::Library.new
128
+ library.metadata["Release Identifier"] = "abcd"
129
+
130
+ library.save
131
+ path = Pathname.new(dir)/"YWJj/ZA==.yaml"
132
+ assert_path_exist path
133
+ end
134
+ end
135
+
136
+ def test_find_by_release_identifier
137
+ Dir.mktmpdir "pirka" do |dir|
138
+ path = Pathname.new(dir)/"pirka/local/YWJj.yaml"
139
+ path.dirname.mkpath
140
+ path.write(@yaml)
141
+ xdh = ENV["XDG_DATA_HOME"]
142
+ begin
143
+ ENV["XDG_DATA_HOME"] = dir
144
+ library = Pirka::Library.find_by_release_identifier("abc")
145
+ ensure
146
+ ENV["XDG_DATA_HOME"] = xdh
147
+ end
148
+ assert_equal @library.metadata, library.metadata
149
+ assert_equal @library.each.to_a, library.each.to_a
150
+ end
151
+ end
152
+ end
@@ -0,0 +1,12 @@
1
+ require 'helper'
2
+ require 'pirka'
3
+
4
+ class TestPirka < Test::Unit::TestCase
5
+
6
+ def test_version
7
+ version = Pirka.const_get('VERSION')
8
+
9
+ assert !version.empty?, 'should have a VERSION constant'
10
+ end
11
+
12
+ end