nabokov 0.1.0
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 +7 -0
- data/.gitattributes +1 -0
- data/.gitignore +43 -0
- data/.rspec +2 -0
- data/.rubocop.yml +113 -0
- data/.travis.yml +14 -0
- data/CHANGELOG.md +5 -0
- data/Gemfile +9 -0
- data/LICENSE +21 -0
- data/README.md +16 -0
- data/Rakefile +22 -0
- data/bin/nabokov +5 -0
- data/lib/nabokov/commands/runner.rb +22 -0
- data/lib/nabokov/commands/setup.rb +75 -0
- data/lib/nabokov/commands/syncers/localizations_repo_syncer.rb +101 -0
- data/lib/nabokov/commands/syncers/project_syncer.rb +106 -0
- data/lib/nabokov/commands/syncers/syncer.rb +68 -0
- data/lib/nabokov/core/file_manager.rb +36 -0
- data/lib/nabokov/core/nabokovfile.rb +66 -0
- data/lib/nabokov/core/nabokovfile_content_validator.rb +51 -0
- data/lib/nabokov/core/nabokovfile_keys.rb +34 -0
- data/lib/nabokov/git/git_repo.rb +137 -0
- data/lib/nabokov/helpers/informator.rb +83 -0
- data/lib/nabokov/helpers/merger.rb +86 -0
- data/lib/nabokov/models/strings_file.rb +7 -0
- data/lib/nabokov/version.rb +8 -0
- data/lib/nabokov.rb +14 -0
- data/nabokov.gemspec +31 -0
- data/spec/fixtures/.DS_Store +0 -0
- data/spec/fixtures/README.md +1 -0
- data/spec/fixtures/de.strings +1 -0
- data/spec/fixtures/en.strings +1 -0
- data/spec/fixtures/nabokovfile_example.yaml +9 -0
- data/spec/fixtures/nabokovfile_example_invalid.yaml +2 -0
- data/spec/fixtures/nabokovfile_example_without_master_branch.yaml +8 -0
- data/spec/fixtures/test_git_setup/existed_pre_commit_file +0 -0
- data/spec/fixtures/test_git_setup/existed_pre_commit_file_alias +0 -0
- data/spec/fixtures/test_git_setup/not_executable_pre_commit_file +0 -0
- data/spec/fixtures/test_localizations_repo_syncer/localizations_repo_fixtures/README.md +1 -0
- data/spec/fixtures/test_localizations_repo_syncer/nabokovfile.yaml +8 -0
- data/spec/fixtures/test_project_syncer/localizations_repo_fixtures/de.strings +2 -0
- data/spec/fixtures/test_project_syncer/localizations_repo_fixtures/en.strings +2 -0
- data/spec/fixtures/test_project_syncer/project_repo_fixtures/de.strings +2 -0
- data/spec/fixtures/test_project_syncer/project_repo_fixtures/en.strings +2 -0
- data/spec/fixtures/test_project_syncer/project_repo_fixtures/nabokovfile.yaml +9 -0
- data/spec/lib/nabokov/commands/localizations_repo_syncer_spec.rb +137 -0
- data/spec/lib/nabokov/commands/project_syncer_spec.rb +61 -0
- data/spec/lib/nabokov/commands/runner_spec.rb +7 -0
- data/spec/lib/nabokov/commands/setup_spec.rb +101 -0
- data/spec/lib/nabokov/commands/syncer_spec.rb +23 -0
- data/spec/lib/nabokov/core/file_manager_spec.rb +115 -0
- data/spec/lib/nabokov/core/nabokovfile_content_validator_spec.rb +155 -0
- data/spec/lib/nabokov/core/nabokovfile_keyes_spec.rb +31 -0
- data/spec/lib/nabokov/core/nabokovfile_spec.rb +53 -0
- data/spec/lib/nabokov/git/git_repo_spec.rb +670 -0
- data/spec/lib/nabokov/helpers/informator_spec.rb +49 -0
- data/spec/lib/nabokov/helpers/merger_spec.rb +114 -0
- data/spec/lib/nabokov/models/strings_file_spec.rb +7 -0
- data/spec/spec_helper.rb +11 -0
- metadata +238 -0
@@ -0,0 +1,137 @@
|
|
1
|
+
require "nabokov/commands/syncers/localizations_repo_syncer"
|
2
|
+
require "nabokov/git/git_repo"
|
3
|
+
require "nabokov/helpers/merger"
|
4
|
+
require "nabokov/helpers/informator"
|
5
|
+
|
6
|
+
describe Nabokov::LocalizationsRepoSyncer do
|
7
|
+
before(:each) do
|
8
|
+
allow(STDOUT).to receive(:puts)
|
9
|
+
end
|
10
|
+
|
11
|
+
it "is not an abstract command" do
|
12
|
+
expect(Nabokov::LocalizationsRepoSyncer.abstract_command).to be_falsy
|
13
|
+
end
|
14
|
+
|
15
|
+
describe "run" do
|
16
|
+
context "when the repo is empty" do
|
17
|
+
before(:all) do
|
18
|
+
@test_git_repo_path = File.expand_path("spec/fixtures/test_localizations_repo_syncer/localizations_repo")
|
19
|
+
@test_git_repo_url = "https://github.com/Antondomashnev/nabokov_example.git"
|
20
|
+
end
|
21
|
+
|
22
|
+
before(:each) do
|
23
|
+
prepare_repo(@test_git_repo_path, "spec/fixtures/test_localizations_repo_syncer/localizations_repo_fixtures/.")
|
24
|
+
|
25
|
+
@mock_nabokovfile = Nabokov::Nabokovfile.new("spec/fixtures/test_localizations_repo_syncer/nabokovfile.yaml")
|
26
|
+
allow(@mock_nabokovfile).to receive(:localizations_repo_local_path).and_return(@test_git_repo_path)
|
27
|
+
|
28
|
+
@mock_git_repo = Nabokov::GitRepo.new(@test_git_repo_path, @test_git_repo_url, object_double(Git::Base))
|
29
|
+
allow(@mock_git_repo).to receive(:log).with(1).and_return("1234567890")
|
30
|
+
|
31
|
+
@merger = Nabokov::Merger.new(object_double(Nabokov::Informator), object_double(Nabokov::GitRepo))
|
32
|
+
|
33
|
+
allow(Nabokov::Nabokovfile).to receive(:new).with(anything).and_return(@mock_nabokovfile)
|
34
|
+
allow(Nabokov::GitRepo).to receive(:new).with(anything, anything).and_return(@mock_git_repo)
|
35
|
+
allow(Nabokov::Merger).to receive(:new).with(anything, anything, anything).and_return(@merger)
|
36
|
+
|
37
|
+
allow_any_instance_of(Nabokov::Informator).to receive(:wait_for_return)
|
38
|
+
end
|
39
|
+
|
40
|
+
after(:each) do
|
41
|
+
FileUtils.rm_rf(Dir.glob("spec/fixtures/test_localizations_repo_syncer/localizations_repo"))
|
42
|
+
end
|
43
|
+
|
44
|
+
context "when files don't have any changes to sync" do
|
45
|
+
before do
|
46
|
+
allow(@mock_git_repo).to receive(:changes?).and_return(false)
|
47
|
+
end
|
48
|
+
|
49
|
+
it "runs the commands in the correct order" do
|
50
|
+
expect(@mock_git_repo).to receive(:init).ordered
|
51
|
+
expect(@mock_git_repo).to receive(:checkout_branch).with("master").ordered
|
52
|
+
expect(@mock_git_repo).to receive(:checkout_branch).with("nabokov/temporary_branch").ordered
|
53
|
+
expect(@mock_git_repo).to receive(:add).with("#{@test_git_repo_path}/en.strings").ordered
|
54
|
+
expect(@mock_git_repo).to receive(:add).with("#{@test_git_repo_path}/de.strings").ordered
|
55
|
+
expect(@mock_git_repo).to receive(:checkout_branch).with("master").ordered
|
56
|
+
expect(@mock_git_repo).to receive(:pull).ordered
|
57
|
+
expect(@mock_git_repo).to receive(:delete_branch).with("nabokov/temporary_branch").ordered
|
58
|
+
|
59
|
+
Nabokov::LocalizationsRepoSyncer.run(["--nabokovfile=spec/fixtures/nabokovfile_example_without_master_branch.yaml"])
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
context "when files have changes to sync" do
|
64
|
+
before do
|
65
|
+
allow(@mock_git_repo).to receive(:changes?).and_return(true)
|
66
|
+
end
|
67
|
+
|
68
|
+
context "when merge doesn't have conflicts" do
|
69
|
+
before do
|
70
|
+
allow(@merger).to receive(:merge).with("master", "nabokov/temporary_branch").and_return(Nabokov::MergerResult::SUCCEEDED)
|
71
|
+
end
|
72
|
+
|
73
|
+
it "runs the commands in the correct order" do
|
74
|
+
expect(@mock_git_repo).to receive(:init).ordered
|
75
|
+
expect(@mock_git_repo).to receive(:checkout_branch).with("master").ordered
|
76
|
+
expect(@mock_git_repo).to receive(:checkout_branch).with("nabokov/temporary_branch").ordered
|
77
|
+
expect(@mock_git_repo).to receive(:add).with("#{@test_git_repo_path}/en.strings").ordered
|
78
|
+
expect(@mock_git_repo).to receive(:commit).with("Nabokov localization file 'en' update...").ordered
|
79
|
+
expect(@mock_git_repo).to receive(:add).with("#{@test_git_repo_path}/de.strings").ordered
|
80
|
+
expect(@mock_git_repo).to receive(:commit).with("Nabokov localization file 'de' update...").ordered
|
81
|
+
expect(@mock_git_repo).to receive(:checkout_branch).with("master").ordered
|
82
|
+
expect(@mock_git_repo).to receive(:pull).ordered
|
83
|
+
expect(@mock_git_repo).to receive(:push).ordered
|
84
|
+
expect(@mock_git_repo).to receive(:delete_branch).with("nabokov/temporary_branch").ordered
|
85
|
+
|
86
|
+
Nabokov::LocalizationsRepoSyncer.run(["--nabokovfile=spec/fixtures/nabokovfile_example_without_master_branch.yaml"])
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
context "when merge has conflicts" do
|
91
|
+
context "when merge is aborted" do
|
92
|
+
before do
|
93
|
+
allow(@merger).to receive(:merge).with("master", "nabokov/temporary_branch").and_return(Nabokov::MergerResult::ABORTED)
|
94
|
+
end
|
95
|
+
|
96
|
+
it "runs the commands in the correct order" do
|
97
|
+
expect(@mock_git_repo).to receive(:init).ordered
|
98
|
+
expect(@mock_git_repo).to receive(:checkout_branch).with("master").ordered
|
99
|
+
expect(@mock_git_repo).to receive(:checkout_branch).with("nabokov/temporary_branch").ordered
|
100
|
+
expect(@mock_git_repo).to receive(:add).with("#{@test_git_repo_path}/en.strings").ordered
|
101
|
+
expect(@mock_git_repo).to receive(:commit).with("Nabokov localization file 'en' update...").ordered
|
102
|
+
expect(@mock_git_repo).to receive(:add).with("#{@test_git_repo_path}/de.strings").ordered
|
103
|
+
expect(@mock_git_repo).to receive(:commit).with("Nabokov localization file 'de' update...").ordered
|
104
|
+
expect(@mock_git_repo).to receive(:checkout_branch).with("master").ordered
|
105
|
+
expect(@mock_git_repo).to receive(:pull).ordered
|
106
|
+
expect(@mock_git_repo).to receive(:delete_branch).with("nabokov/temporary_branch").ordered
|
107
|
+
|
108
|
+
Nabokov::LocalizationsRepoSyncer.run(["--nabokovfile=spec/fixtures/nabokovfile_example_without_master_branch.yaml"])
|
109
|
+
end
|
110
|
+
end
|
111
|
+
|
112
|
+
context "when merge is succeeded" do
|
113
|
+
before do
|
114
|
+
allow(@merger).to receive(:merge).with("master", "nabokov/temporary_branch").and_return(Nabokov::MergerResult::SUCCEEDED)
|
115
|
+
end
|
116
|
+
|
117
|
+
it "runs the commands in the correct order" do
|
118
|
+
expect(@mock_git_repo).to receive(:init).ordered
|
119
|
+
expect(@mock_git_repo).to receive(:checkout_branch).with("master").ordered
|
120
|
+
expect(@mock_git_repo).to receive(:checkout_branch).with("nabokov/temporary_branch").ordered
|
121
|
+
expect(@mock_git_repo).to receive(:add).with("#{@test_git_repo_path}/en.strings").ordered
|
122
|
+
expect(@mock_git_repo).to receive(:commit).with("Nabokov localization file 'en' update...").ordered
|
123
|
+
expect(@mock_git_repo).to receive(:add).with("#{@test_git_repo_path}/de.strings").ordered
|
124
|
+
expect(@mock_git_repo).to receive(:commit).with("Nabokov localization file 'de' update...").ordered
|
125
|
+
expect(@mock_git_repo).to receive(:checkout_branch).with("master").ordered
|
126
|
+
expect(@mock_git_repo).to receive(:pull).ordered
|
127
|
+
expect(@mock_git_repo).to receive(:push).ordered
|
128
|
+
expect(@mock_git_repo).to receive(:delete_branch).with("nabokov/temporary_branch").ordered
|
129
|
+
|
130
|
+
Nabokov::LocalizationsRepoSyncer.run(["--nabokovfile=spec/fixtures/nabokovfile_example_without_master_branch.yaml"])
|
131
|
+
end
|
132
|
+
end
|
133
|
+
end
|
134
|
+
end
|
135
|
+
end
|
136
|
+
end
|
137
|
+
end
|
@@ -0,0 +1,61 @@
|
|
1
|
+
require "nabokov/commands/syncers/project_syncer"
|
2
|
+
require "fileutils"
|
3
|
+
|
4
|
+
describe Nabokov::ProjectSyncer do
|
5
|
+
before(:each) do
|
6
|
+
allow(STDOUT).to receive(:puts)
|
7
|
+
end
|
8
|
+
|
9
|
+
it "is not an abstract command" do
|
10
|
+
expect(Nabokov::ProjectSyncer.abstract_command).to be_falsy
|
11
|
+
end
|
12
|
+
|
13
|
+
describe "run" do
|
14
|
+
context "when localiztions repo containes all localization files from the project repo" do
|
15
|
+
before(:all) do
|
16
|
+
@test_localizations_repo_path = "spec/fixtures/test_project_syncer/localizations_repo"
|
17
|
+
@test_project_repo_path = "spec/fixtures/test_project_syncer/project_repo"
|
18
|
+
end
|
19
|
+
|
20
|
+
before(:each) do
|
21
|
+
prepare_repo(@test_localizations_repo_path, "spec/fixtures/test_project_syncer/localizations_repo_fixtures/.")
|
22
|
+
prepare_repo(@test_project_repo_path, "spec/fixtures/test_project_syncer/project_repo_fixtures/.")
|
23
|
+
|
24
|
+
@mock_nabokovfile = Nabokov::Nabokovfile.new("spec/fixtures/test_project_syncer/project_repo/nabokovfile.yaml")
|
25
|
+
allow(@mock_nabokovfile).to receive(:localizations_repo_local_path).and_return(@test_localizations_repo_path)
|
26
|
+
|
27
|
+
@mock_localizations_repo = Nabokov::GitRepo.new(@mock_nabokovfile.localizations_repo_local_path, @mock_nabokovfile.localizations_repo_url)
|
28
|
+
allow(@mock_localizations_repo).to receive(:pull)
|
29
|
+
|
30
|
+
@mock_project_repo = Nabokov::GitRepo.new(@mock_nabokovfile.project_local_path)
|
31
|
+
|
32
|
+
allow(Nabokov::Nabokovfile).to receive(:new).with("spec/fixtures/test_project_syncer/project_repo/nabokovfile.yaml").and_return(@mock_nabokovfile)
|
33
|
+
allow(Nabokov::GitRepo).to receive(:new).with(@mock_nabokovfile.localizations_repo_local_path, @mock_nabokovfile.localizations_repo_url).and_return(@mock_localizations_repo)
|
34
|
+
allow(Nabokov::GitRepo).to receive(:new).with(@mock_nabokovfile.project_local_path).and_return(@mock_project_repo)
|
35
|
+
end
|
36
|
+
|
37
|
+
after do
|
38
|
+
FileUtils.rm_rf(Dir.glob(@test_localizations_repo_path))
|
39
|
+
FileUtils.rm_rf(Dir.glob(@test_project_repo_path))
|
40
|
+
end
|
41
|
+
|
42
|
+
it "should merge remote localizations with project's localization" do
|
43
|
+
Nabokov::ProjectSyncer.run(["--nabokovfile=spec/fixtures/test_project_syncer/project_repo/nabokovfile.yaml"])
|
44
|
+
|
45
|
+
expected_en_localization_strings = ["\"hello\" = \"Hello\";\n", "\"bye\" = \"Bye\";\n"]
|
46
|
+
actual_en_localization_strings = []
|
47
|
+
File.readlines("#{@test_project_repo_path}/en.strings").each do |line|
|
48
|
+
actual_en_localization_strings << line
|
49
|
+
end
|
50
|
+
expect(actual_en_localization_strings).to eql(expected_en_localization_strings)
|
51
|
+
|
52
|
+
expected_de_localization_strings = ["\"hello\" = \"Hallo\";\n", "\"bye\" = \"Tschuss\";\n"]
|
53
|
+
actual_de_localization_strings = []
|
54
|
+
File.readlines("#{@test_project_repo_path}/de.strings").each do |line|
|
55
|
+
actual_de_localization_strings << line
|
56
|
+
end
|
57
|
+
expect(actual_de_localization_strings).to eql(expected_de_localization_strings)
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
@@ -0,0 +1,101 @@
|
|
1
|
+
require "nabokov/commands/setup"
|
2
|
+
require "fileutils"
|
3
|
+
require "git"
|
4
|
+
|
5
|
+
describe Nabokov::Setup do
|
6
|
+
describe "run" do
|
7
|
+
before(:all) do
|
8
|
+
FileUtils.mkdir_p("spec/fixtures/test_git_setup/git_folder")
|
9
|
+
Git.init("spec/fixtures/test_git_setup/git_folder")
|
10
|
+
end
|
11
|
+
|
12
|
+
after(:all) do
|
13
|
+
FileUtils.rm_rf("spec/fixtures/test_git_setup/git_folder")
|
14
|
+
end
|
15
|
+
|
16
|
+
before(:each) do
|
17
|
+
allow(STDOUT).to receive(:puts)
|
18
|
+
end
|
19
|
+
|
20
|
+
context "when pre_commit_file path is a file" do
|
21
|
+
it "uses the given path" do
|
22
|
+
setup = Nabokov::Setup.run(["--pre_commit_file=spec/fixtures/test_git_setup/existed_pre_commit_file", "--git_path=spec/fixtures/test_git_setup"])
|
23
|
+
expect(setup.pre_commit_file).to eql("spec/fixtures/test_git_setup/existed_pre_commit_file")
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
context "when pre_commit_file path is a symlink" do
|
28
|
+
it "uses the real path" do
|
29
|
+
setup = Nabokov::Setup.run(["--pre_commit_file=spec/fixtures/test_git_setup/existed_pre_commit_file_alias", "--git_path=spec/fixtures/test_git_setup"])
|
30
|
+
expect(setup.pre_commit_file).to end_with("spec/fixtures/test_git_setup/existed_pre_commit_file")
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
context "when pre_commit_file doesn't exist" do
|
35
|
+
context "when the given git_path there is no folder" do
|
36
|
+
it "raises an exception" do
|
37
|
+
expect { Nabokov::Setup.run(["--pre_commit_file=spec/fixtures/test_git_setup/missing_file", "--git_path=spec/fixtures/test_git_setup_fake"]) }.to raise_error(".git folder is not found at 'spec/fixtures/test_git_setup_fake'")
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
it "creates a pre_commit_file at the given git_path/hooks/pre_commit" do
|
42
|
+
setup = Nabokov::Setup.run(["--pre_commit_file=spec/fixtures/test_git_setup/missing_file", "--git_path=spec/fixtures/test_git_setup/git_folder/.git"])
|
43
|
+
expect(File.exist?(setup.pre_commit_file)).to be_truthy
|
44
|
+
FileUtils.rm_rf(Dir.glob("spec/fixtures/test_git_setup/git_folder/.git/*"))
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
context "when pre_commit_file is not executable" do
|
49
|
+
it "raises an exception" do
|
50
|
+
input = ["--pre_commit_file=spec/fixtures/test_git_setup/not_executable_pre_commit_file", "--git_path=spec/fixtures/test_git_setup/git_folder/.git"]
|
51
|
+
expect { Nabokov::Setup.run(input) }.to raise_error("pre commit file at 'spec/fixtures/test_git_setup/not_executable_pre_commit_file' is not executable by the effective user id of this process")
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
context "when current git repo is not listed in pre_commit_file" do
|
56
|
+
before(:each) do
|
57
|
+
input = ["--pre_commit_file=spec/fixtures/test_git_setup/existed_pre_commit_file", "--git_path=spec/fixtures/test_git_setup/git_folder/.git"]
|
58
|
+
Nabokov::Setup.run(input)
|
59
|
+
end
|
60
|
+
|
61
|
+
after(:each) do
|
62
|
+
File.truncate("spec/fixtures/test_git_setup/existed_pre_commit_file", 0)
|
63
|
+
end
|
64
|
+
|
65
|
+
it "puts into pre commit line to tell that file is executable" do
|
66
|
+
result = File.foreach("spec/fixtures/test_git_setup/existed_pre_commit_file").any? do |line|
|
67
|
+
line.include?("#!\/usr\/bin\/env bash")
|
68
|
+
end
|
69
|
+
expect(result).to be_truthy
|
70
|
+
end
|
71
|
+
|
72
|
+
it "puts into pre commit line about current repo path" do
|
73
|
+
result = File.foreach("spec/fixtures/test_git_setup/existed_pre_commit_file").any? do |line|
|
74
|
+
line.include?("current_repo_path=\$(git rev-parse --show-toplevel)")
|
75
|
+
end
|
76
|
+
expect(result).to be_truthy
|
77
|
+
end
|
78
|
+
|
79
|
+
it "puts into pre commit line about nabokovfile path" do
|
80
|
+
result = File.foreach("spec/fixtures/test_git_setup/existed_pre_commit_file").any? do |line|
|
81
|
+
line.include?("nabokovfile_path=\"$current_repo_path\/Nabokovfile.yaml\"")
|
82
|
+
end
|
83
|
+
expect(result).to be_truthy
|
84
|
+
end
|
85
|
+
|
86
|
+
it "puts into pre commit line about tracking repo path" do
|
87
|
+
result = File.foreach("spec/fixtures/test_git_setup/existed_pre_commit_file").any? do |line|
|
88
|
+
line.include?("tracking_repo_path=")
|
89
|
+
end
|
90
|
+
expect(result).to be_truthy
|
91
|
+
end
|
92
|
+
|
93
|
+
it "puts into pre commit line to exectute nabokov" do
|
94
|
+
result = File.foreach("spec/fixtures/test_git_setup/existed_pre_commit_file").any? do |line|
|
95
|
+
line.include?("if [ \"$current_repo_path\" == \"$tracking_repo_path\" ] && gem list -i nabokov && [ -e \"$nabokovfile_path\" ]; then nabokov sync localizations --nabokovfile=$nabokovfile_path || exit 1; fi")
|
96
|
+
end
|
97
|
+
expect(result).to be_truthy
|
98
|
+
end
|
99
|
+
end
|
100
|
+
end
|
101
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
require "nabokov/commands/syncers/syncer"
|
2
|
+
|
3
|
+
describe Nabokov::Syncer do
|
4
|
+
before(:each) do
|
5
|
+
allow(STDOUT).to receive(:puts)
|
6
|
+
end
|
7
|
+
|
8
|
+
it "is an abstract command" do
|
9
|
+
expect(Nabokov::Syncer.abstract_command).to be_truthy
|
10
|
+
end
|
11
|
+
|
12
|
+
context "when --nabokovfile parameter is not passed" do
|
13
|
+
it "raises an error" do
|
14
|
+
expect { Nabokov::Syncer.run([]) }.to raise_error("--nabokovfile is a required parameter and could not be nil")
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
context "when nabokovfile doesn't exist at the given path" do
|
19
|
+
it "raises a runtime error" do
|
20
|
+
expect { Nabokov::Syncer.run(["--nabokovfile=spec/blabla"]) }.to raise_error(SystemExit)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,115 @@
|
|
1
|
+
require "nabokov/core/file_manager"
|
2
|
+
|
3
|
+
describe Nabokov::FileManager do
|
4
|
+
describe "copy and rename" do
|
5
|
+
before do
|
6
|
+
@test_copy_folder_path = "spec/fixtures/test_copy_folder/"
|
7
|
+
FileUtils.mkdir_p("spec/fixtures/test_copy_folder")
|
8
|
+
end
|
9
|
+
|
10
|
+
after do
|
11
|
+
FileUtils.rm_rf("spec/fixtures/test_copy_folder")
|
12
|
+
end
|
13
|
+
|
14
|
+
context "when there is no file at from_path" do
|
15
|
+
it "raises an exception" do
|
16
|
+
from_path = "spec/fixtures/fr.strings"
|
17
|
+
new_file_name = "fr.strings"
|
18
|
+
expect { Nabokov::FileManager.copy_and_rename(from_path, @test_copy_folder_path, new_file_name) }.to raise_error("Couldn't find file at 'spec/fixtures/fr.strings'")
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
context "when there is no directory to copy to" do
|
23
|
+
it "raises an exception" do
|
24
|
+
from_path = "spec/fixtures/de.strings"
|
25
|
+
new_file_name = "fr.strings"
|
26
|
+
expect { Nabokov::FileManager.copy_and_rename(from_path, "spec/fixtures/test_copy_folder_fake", new_file_name) }.to raise_error("Couldn't find directory at 'spec/fixtures/test_copy_folder_fake'")
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
context "when the new file name is empty" do
|
31
|
+
it "raises an exception" do
|
32
|
+
from_path = "spec/fixtures/de.strings"
|
33
|
+
new_file_name = ""
|
34
|
+
expect { Nabokov::FileManager.copy_and_rename(from_path, @test_copy_folder_path, new_file_name) }.to raise_error("New name of the file could not be empty")
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
context "when the new file name contains the '.'" do
|
39
|
+
it "raises an exception because it messes up with the extension delimeter" do
|
40
|
+
from_path = "spec/fixtures/de.strings"
|
41
|
+
new_file_name = "fr.de"
|
42
|
+
expect { Nabokov::FileManager.copy_and_rename(from_path, @test_copy_folder_path, new_file_name) }.to raise_error("New name of the file 'fr.de' contains invalid character '.'")
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
context "when all requirenments are fulfilled" do
|
47
|
+
it "copies the file according input parameters" do
|
48
|
+
from_path = "spec/fixtures/de.strings"
|
49
|
+
new_file_name = "fr"
|
50
|
+
new_file_path = Nabokov::FileManager.copy_and_rename(from_path, @test_copy_folder_path, new_file_name)
|
51
|
+
expect(File.file?(new_file_path)).to be_truthy
|
52
|
+
end
|
53
|
+
|
54
|
+
it "overwrites the file according input parameters" do
|
55
|
+
from_path = "spec/fixtures/de.strings"
|
56
|
+
new_file_name = "fr"
|
57
|
+
Nabokov::FileManager.copy_and_rename(from_path, @test_copy_folder_path, new_file_name)
|
58
|
+
time_before_copy = File.mtime("spec/fixtures/test_copy_folder/fr.strings")
|
59
|
+
new_file_path = Nabokov::FileManager.copy_and_rename(from_path, @test_copy_folder_path, new_file_name)
|
60
|
+
expect(File.mtime(new_file_path)).to be >= time_before_copy
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
describe "remove" do
|
66
|
+
context "when the given path is neither directory nor file" do
|
67
|
+
it "raises an error" do
|
68
|
+
expect { Nabokov::FileManager.remove("spec/fixtures/not_existed_file.rb") }.to raise_error("Can not file neither file nor directory at 'spec/fixtures/not_existed_file.rb'")
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
context "when the given path is file" do
|
73
|
+
before do
|
74
|
+
@file_path = "spec/fixtures/test_copy_folder/file.rb"
|
75
|
+
FileUtils.mkdir_p(@file_path)
|
76
|
+
end
|
77
|
+
|
78
|
+
it "removes the file at the given path" do
|
79
|
+
Nabokov::FileManager.remove(@file_path)
|
80
|
+
expect(File.exist?(@file_path)).to be_falsy
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
context "when the given path is directory" do
|
85
|
+
before do
|
86
|
+
@folder_path = "spec/fixtures/test_copy_folder/folder"
|
87
|
+
FileUtils.mkdir_p(@folder_path)
|
88
|
+
end
|
89
|
+
|
90
|
+
it "removes the directory at the given path" do
|
91
|
+
Nabokov::FileManager.remove(@folder_path)
|
92
|
+
expect(Dir.exist?(@folder_path)).to be_falsy
|
93
|
+
end
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
97
|
+
describe "copy" do
|
98
|
+
context "when file to copy doesn't exist at the given path" do
|
99
|
+
it "raises an error" do
|
100
|
+
expect { Nabokov::FileManager.copy("dsaklgadsg/fadsgf/rewr.rb", "spec/fixtures/test_copy_folder/file.rb") }.to raise_error("Couldn't find file at 'dsaklgadsg/fadsgf/rewr.rb'")
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
104
|
+
context "when file exists at the given path" do
|
105
|
+
after do
|
106
|
+
FileUtils.rm_rf(Dir.glob("spec/fixtures/test_copy_folder/*"))
|
107
|
+
end
|
108
|
+
|
109
|
+
it "copies file to the given path" do
|
110
|
+
Nabokov::FileManager.copy("spec/fixtures/de.strings", "spec/fixtures/test_copy_folder/file.rb")
|
111
|
+
expect(File.exist?("spec/fixtures/test_copy_folder/file.rb"))
|
112
|
+
end
|
113
|
+
end
|
114
|
+
end
|
115
|
+
end
|
@@ -0,0 +1,155 @@
|
|
1
|
+
require "nabokov/core/nabokovfile_content_validator"
|
2
|
+
require "nabokov/core/nabokovfile_keys"
|
3
|
+
|
4
|
+
describe Nabokov::NabokovfileContentValidator do
|
5
|
+
before do
|
6
|
+
@valid_hash = {
|
7
|
+
Nabokov::NabokovfileKeyes.localizations_repo => { Nabokov::NabokovfileKeyes.localizations_repo_url => "https://github.com/nabokov/nabokov", Nabokov::NabokovfileKeyes.localizations_repo_master_branch => "nabokov_master" },
|
8
|
+
Nabokov::NabokovfileKeyes.project_repo => { Nabokov::NabokovfileKeyes.project_localization_file_paths => { "en" => "spec/fixtures/en.strings", "de" => "spec/fixtures/de.strings" }, Nabokov::NabokovfileKeyes.project_local_path => "spec/fixtures/local_project" }
|
9
|
+
}
|
10
|
+
end
|
11
|
+
|
12
|
+
context "when the git repo URL is not in valid URL format" do
|
13
|
+
it "raises an error" do
|
14
|
+
@valid_hash[Nabokov::NabokovfileKeyes.localizations_repo][Nabokov::NabokovfileKeyes.localizations_repo_url] = "bla_bla_bla"
|
15
|
+
validator = Nabokov::NabokovfileContentValidator.new(@valid_hash)
|
16
|
+
expect { validator.validate }.to raise_error("'bla_bla_bla' is not a valid URL")
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
context "when the git repo URL valid but scheme is not https" do
|
21
|
+
it "raises an exception" do
|
22
|
+
@valid_hash[Nabokov::NabokovfileKeyes.localizations_repo][Nabokov::NabokovfileKeyes.localizations_repo_url] = "http://github.com/nabokov/nabokov"
|
23
|
+
validator = Nabokov::NabokovfileContentValidator.new(@valid_hash)
|
24
|
+
expect { validator.validate }.to raise_error("Please use 'https://...' instead of 'http://github.com/nabokov/nabokov' only supports encrypted requests")
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
context "when the localizations_repo is not a type of Hash" do
|
29
|
+
context "when string" do
|
30
|
+
it "raises an error" do
|
31
|
+
@valid_hash[Nabokov::NabokovfileKeyes.localizations_repo] = "param:pam"
|
32
|
+
validator = Nabokov::NabokovfileContentValidator.new(@valid_hash)
|
33
|
+
expect { validator.validate }.to raise_error("Localizations repo must be a type of Hash")
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
context "when array" do
|
38
|
+
it "raises an error" do
|
39
|
+
@valid_hash[Nabokov::NabokovfileKeyes.localizations_repo] = ["key", "value"]
|
40
|
+
validator = Nabokov::NabokovfileContentValidator.new(@valid_hash)
|
41
|
+
expect { validator.validate }.to raise_error("Localizations repo must be a type of Hash")
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
context "when number" do
|
46
|
+
it "raises an error" do
|
47
|
+
@valid_hash[Nabokov::NabokovfileKeyes.localizations_repo] = 10
|
48
|
+
validator = Nabokov::NabokovfileContentValidator.new(@valid_hash)
|
49
|
+
expect { validator.validate }.to raise_error("Localizations repo must be a type of Hash")
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
context "when the project_repo is not a type of Hash" do
|
55
|
+
context "when string" do
|
56
|
+
it "raises an error" do
|
57
|
+
@valid_hash[Nabokov::NabokovfileKeyes.project_repo] = "param:pam"
|
58
|
+
validator = Nabokov::NabokovfileContentValidator.new(@valid_hash)
|
59
|
+
expect { validator.validate }.to raise_error("Project repo must be a type of Hash")
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
context "when array" do
|
64
|
+
it "raises an error" do
|
65
|
+
@valid_hash[Nabokov::NabokovfileKeyes.project_repo] = ["key", "value"]
|
66
|
+
validator = Nabokov::NabokovfileContentValidator.new(@valid_hash)
|
67
|
+
expect { validator.validate }.to raise_error("Project repo must be a type of Hash")
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
context "when number" do
|
72
|
+
it "raises an error" do
|
73
|
+
@valid_hash[Nabokov::NabokovfileKeyes.project_repo] = 10
|
74
|
+
validator = Nabokov::NabokovfileContentValidator.new(@valid_hash)
|
75
|
+
expect { validator.validate }.to raise_error("Project repo must be a type of Hash")
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
context "when the localizations_repo is not a type of Hash" do
|
81
|
+
context "when string" do
|
82
|
+
it "raises an error" do
|
83
|
+
@valid_hash[Nabokov::NabokovfileKeyes.localizations_repo] = "param:pam"
|
84
|
+
validator = Nabokov::NabokovfileContentValidator.new(@valid_hash)
|
85
|
+
expect { validator.validate }.to raise_error("Localizations repo must be a type of Hash")
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
context "when array" do
|
90
|
+
it "raises an error" do
|
91
|
+
@valid_hash[Nabokov::NabokovfileKeyes.localizations_repo] = ["key", "value"]
|
92
|
+
validator = Nabokov::NabokovfileContentValidator.new(@valid_hash)
|
93
|
+
expect { validator.validate }.to raise_error("Localizations repo must be a type of Hash")
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
97
|
+
context "when number" do
|
98
|
+
it "raises an error" do
|
99
|
+
@valid_hash[Nabokov::NabokovfileKeyes.localizations_repo] = 10
|
100
|
+
validator = Nabokov::NabokovfileContentValidator.new(@valid_hash)
|
101
|
+
expect { validator.validate }.to raise_error("Localizations repo must be a type of Hash")
|
102
|
+
end
|
103
|
+
end
|
104
|
+
end
|
105
|
+
|
106
|
+
context "when there is no project repo local path" do
|
107
|
+
it "raises an error" do
|
108
|
+
@valid_hash[Nabokov::NabokovfileKeyes.project_repo][Nabokov::NabokovfileKeyes.project_local_path] = nil
|
109
|
+
validator = Nabokov::NabokovfileContentValidator.new(@valid_hash)
|
110
|
+
expect { validator.validate }.to raise_error("Project repo local path must be presented")
|
111
|
+
end
|
112
|
+
end
|
113
|
+
|
114
|
+
context "when the localizations is not a type of Hash" do
|
115
|
+
context "when string" do
|
116
|
+
it "raises an error" do
|
117
|
+
@valid_hash[Nabokov::NabokovfileKeyes.project_repo][Nabokov::NabokovfileKeyes.project_localization_file_paths] = "param:pam"
|
118
|
+
validator = Nabokov::NabokovfileContentValidator.new(@valid_hash)
|
119
|
+
expect { validator.validate }.to raise_error("Localizations must be a type of Hash")
|
120
|
+
end
|
121
|
+
end
|
122
|
+
|
123
|
+
context "when array" do
|
124
|
+
it "raises an error" do
|
125
|
+
@valid_hash[Nabokov::NabokovfileKeyes.project_repo][Nabokov::NabokovfileKeyes.project_localization_file_paths] = ["key", "value"]
|
126
|
+
validator = Nabokov::NabokovfileContentValidator.new(@valid_hash)
|
127
|
+
expect { validator.validate }.to raise_error("Localizations must be a type of Hash")
|
128
|
+
end
|
129
|
+
end
|
130
|
+
|
131
|
+
context "when number" do
|
132
|
+
it "raises an error" do
|
133
|
+
@valid_hash[Nabokov::NabokovfileKeyes.project_repo][Nabokov::NabokovfileKeyes.project_localization_file_paths] = 10
|
134
|
+
validator = Nabokov::NabokovfileContentValidator.new(@valid_hash)
|
135
|
+
expect { validator.validate }.to raise_error("Localizations must be a type of Hash")
|
136
|
+
end
|
137
|
+
end
|
138
|
+
end
|
139
|
+
|
140
|
+
context "when the localizations array contains file that does not exist" do
|
141
|
+
it "raises an error" do
|
142
|
+
@valid_hash[Nabokov::NabokovfileKeyes.project_repo][Nabokov::NabokovfileKeyes.project_localization_file_paths] = { "en" => "spec/fixtures/en.strings",
|
143
|
+
"de" => "spec/fixtures/fr.strings" }
|
144
|
+
validator = Nabokov::NabokovfileContentValidator.new(@valid_hash)
|
145
|
+
expect { validator.validate }.to raise_error("Couldn't find strings file at 'spec/fixtures/fr.strings'")
|
146
|
+
end
|
147
|
+
end
|
148
|
+
|
149
|
+
context "when the hash is valid" do
|
150
|
+
it "doesn't raise anything" do
|
151
|
+
validator = Nabokov::NabokovfileContentValidator.new(@valid_hash)
|
152
|
+
validator.validate
|
153
|
+
end
|
154
|
+
end
|
155
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
require "nabokov/core/nabokovfile_keys"
|
2
|
+
|
3
|
+
describe Nabokov::NabokovfileKeyes do
|
4
|
+
it "has a valid localizations_repo key" do
|
5
|
+
expect(Nabokov::NabokovfileKeyes.localizations_repo).to eql("localizations_repo")
|
6
|
+
end
|
7
|
+
|
8
|
+
it "has a valid localizations_repo_url key" do
|
9
|
+
expect(Nabokov::NabokovfileKeyes.localizations_repo_url).to eql("url")
|
10
|
+
end
|
11
|
+
|
12
|
+
it "has a valid localizations_repo_master_branch key" do
|
13
|
+
expect(Nabokov::NabokovfileKeyes.localizations_repo_master_branch).to eql("master_branch")
|
14
|
+
end
|
15
|
+
|
16
|
+
it "has a valid git_repo_master_branch key" do
|
17
|
+
expect(Nabokov::NabokovfileKeyes.localizations_repo_master_branch).to eql("master_branch")
|
18
|
+
end
|
19
|
+
|
20
|
+
it "has a valid project_repo key" do
|
21
|
+
expect(Nabokov::NabokovfileKeyes.project_repo).to eql("project_repo")
|
22
|
+
end
|
23
|
+
|
24
|
+
it "has a valid project_local_path key" do
|
25
|
+
expect(Nabokov::NabokovfileKeyes.project_local_path).to eql("local_path")
|
26
|
+
end
|
27
|
+
|
28
|
+
it "has a valid project_localization_file_paths key" do
|
29
|
+
expect(Nabokov::NabokovfileKeyes.project_localization_file_paths).to eql("localizations")
|
30
|
+
end
|
31
|
+
end
|