diffend 0.2.39 → 0.2.44

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.
Files changed (143) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data.tar.gz.sig +0 -0
  4. data/.github/workflows/ci.yml +3 -1
  5. data/CHANGELOG.md +25 -1
  6. data/Gemfile.lock +4 -4
  7. data/Rakefile +40 -0
  8. data/lib/diffend/commands.rb +2 -0
  9. data/lib/diffend/configs/error_messages.rb +11 -0
  10. data/lib/diffend/configs/validator.rb +22 -0
  11. data/lib/diffend/errors.rb +2 -0
  12. data/lib/diffend/execute.rb +3 -2
  13. data/lib/diffend/handle_errors/report.rb +4 -4
  14. data/lib/diffend/integration_repository.rb +92 -0
  15. data/lib/diffend/local_context/host.rb +12 -13
  16. data/lib/diffend/local_context/packages.rb +6 -27
  17. data/lib/diffend/plugin.rb +3 -0
  18. data/lib/diffend/repository.rb +109 -0
  19. data/lib/diffend/request.rb +0 -1
  20. data/lib/diffend/request_object.rb +1 -1
  21. data/lib/diffend/request_verdict.rb +4 -4
  22. data/lib/diffend/shell.rb +44 -0
  23. data/lib/diffend/track.rb +4 -4
  24. data/lib/diffend/version.rb +1 -1
  25. data/repositories/.diffend.yml +3 -0
  26. data/repositories/bundler_2_1_4/install_with_gemfile_lock/.diffend.yml +3 -0
  27. data/repositories/bundler_2_1_4/install_with_gemfile_lock/Gemfile +6 -0
  28. data/repositories/bundler_2_1_4/install_with_gemfile_lock/Gemfile.lock +22 -0
  29. data/repositories/bundler_2_1_4/install_with_gemfile_lock_with_added_gem/.diffend.yml +3 -0
  30. data/repositories/bundler_2_1_4/install_with_gemfile_lock_with_added_gem/Gemfile +6 -0
  31. data/repositories/bundler_2_1_4/install_with_gemfile_lock_with_added_gem/Gemfile.lock +16 -0
  32. data/repositories/bundler_2_1_4/install_with_gemfile_lock_with_changed_gem_version/.diffend.yml +3 -0
  33. data/repositories/bundler_2_1_4/install_with_gemfile_lock_with_changed_gem_version/Gemfile +6 -0
  34. data/repositories/bundler_2_1_4/install_with_gemfile_lock_with_changed_gem_version/Gemfile.lock +18 -0
  35. data/repositories/bundler_2_1_4/install_with_gemfile_lock_with_changed_gem_version/README.md +1 -0
  36. data/repositories/bundler_2_1_4/install_with_gemfile_lock_with_locked_gem_version/.diffend.yml +3 -0
  37. data/repositories/bundler_2_1_4/install_with_gemfile_lock_with_locked_gem_version/Gemfile +6 -0
  38. data/repositories/bundler_2_1_4/install_with_gemfile_lock_with_locked_gem_version/Gemfile.lock +19 -0
  39. data/repositories/bundler_2_1_4/install_with_gemfile_lock_with_removed_gem/.diffend.yml +3 -0
  40. data/repositories/bundler_2_1_4/install_with_gemfile_lock_with_removed_gem/Gemfile +5 -0
  41. data/repositories/bundler_2_1_4/install_with_gemfile_lock_with_removed_gem/Gemfile.lock +43 -0
  42. data/repositories/bundler_2_1_4/install_with_gemfile_lock_with_two_platforms/.diffend.yml +3 -0
  43. data/repositories/bundler_2_1_4/install_with_gemfile_lock_with_two_platforms/.ruby-version +1 -0
  44. data/repositories/bundler_2_1_4/install_with_gemfile_lock_with_two_platforms/Gemfile +10 -0
  45. data/repositories/bundler_2_1_4/install_with_gemfile_lock_with_two_platforms/Gemfile.lock +32 -0
  46. data/repositories/bundler_2_1_4/install_with_gemfile_lock_with_two_platforms/gem-with-two-platforms.gemspec +16 -0
  47. data/repositories/bundler_2_1_4/install_with_gemfile_lock_with_two_primary_sources/.diffend.yml +3 -0
  48. data/repositories/bundler_2_1_4/install_with_gemfile_lock_with_two_primary_sources/Gemfile +6 -0
  49. data/repositories/bundler_2_1_4/install_with_gemfile_lock_with_two_primary_sources/Gemfile.lock +17 -0
  50. data/repositories/bundler_2_1_4/install_with_gemfile_lock_with_two_sources/.diffend.yml +3 -0
  51. data/repositories/bundler_2_1_4/install_with_gemfile_lock_with_two_sources/Gemfile +6 -0
  52. data/repositories/bundler_2_1_4/install_with_gemfile_lock_with_two_sources/Gemfile.lock +19 -0
  53. data/repositories/bundler_2_1_4/install_without_gemfile_lock/.diffend.yml +3 -0
  54. data/repositories/bundler_2_1_4/install_without_gemfile_lock/Gemfile +5 -0
  55. data/repositories/bundler_2_1_4/update_with_gemfile_lock/.diffend.yml +3 -0
  56. data/repositories/bundler_2_1_4/update_with_gemfile_lock/Gemfile +5 -0
  57. data/repositories/bundler_2_1_4/update_with_gemfile_lock/Gemfile.lock +16 -0
  58. data/repositories/bundler_2_1_4/update_with_gemfile_lock/README.md +1 -0
  59. data/repositories/bundler_2_1_4/update_with_gemfile_lock_with_added_gem/.diffend.yml +3 -0
  60. data/repositories/bundler_2_1_4/update_with_gemfile_lock_with_added_gem/Gemfile +6 -0
  61. data/repositories/bundler_2_1_4/update_with_gemfile_lock_with_added_gem/Gemfile.lock +16 -0
  62. data/repositories/bundler_2_1_4/update_with_gemfile_lock_with_added_gem/README.md +1 -0
  63. data/repositories/bundler_2_1_4/update_with_gemfile_lock_with_removed_gem/.diffend.yml +3 -0
  64. data/repositories/bundler_2_1_4/update_with_gemfile_lock_with_removed_gem/Gemfile +5 -0
  65. data/repositories/bundler_2_1_4/update_with_gemfile_lock_with_removed_gem/Gemfile.lock +43 -0
  66. data/repositories/bundler_2_1_4/update_with_gemfile_lock_with_removed_gem/README.md +1 -0
  67. data/repositories/bundler_2_1_4/update_with_gemfile_lock_with_two_primary_sources/.diffend.yml +3 -0
  68. data/repositories/bundler_2_1_4/update_with_gemfile_lock_with_two_primary_sources/Gemfile +6 -0
  69. data/repositories/bundler_2_1_4/update_with_gemfile_lock_with_two_primary_sources/Gemfile.lock +17 -0
  70. data/repositories/bundler_2_1_4/update_with_gemfile_lock_with_two_primary_sources/README.md +1 -0
  71. data/repositories/bundler_2_1_4/update_with_gemfile_lock_with_two_sources/.diffend.yml +3 -0
  72. data/repositories/bundler_2_1_4/update_with_gemfile_lock_with_two_sources/Gemfile +6 -0
  73. data/repositories/bundler_2_1_4/update_with_gemfile_lock_with_two_sources/Gemfile.lock +44 -0
  74. data/repositories/bundler_2_1_4/update_with_gemfile_lock_with_two_sources/README.md +1 -0
  75. data/repositories/bundler_2_1_4/update_without_gemfile_lock/.diffend.yml +3 -0
  76. data/repositories/bundler_2_1_4/update_without_gemfile_lock/Gemfile +5 -0
  77. data/repositories/bundler_2_1_4/update_without_gemfile_lock/README.md +1 -0
  78. data/repositories/bundler_2_2_7/install_with_gemfile_lock/.diffend.yml +3 -0
  79. data/repositories/bundler_2_2_7/install_with_gemfile_lock/Gemfile +6 -0
  80. data/repositories/bundler_2_2_7/install_with_gemfile_lock/Gemfile.lock +21 -0
  81. data/repositories/bundler_2_2_7/install_with_gemfile_lock/README.md +1 -0
  82. data/repositories/bundler_2_2_7/install_with_gemfile_lock_with_added_gem/.diffend.yml +3 -0
  83. data/repositories/bundler_2_2_7/install_with_gemfile_lock_with_added_gem/Gemfile +6 -0
  84. data/repositories/bundler_2_2_7/install_with_gemfile_lock_with_added_gem/Gemfile.lock +16 -0
  85. data/repositories/bundler_2_2_7/install_with_gemfile_lock_with_added_gem/README.md +1 -0
  86. data/repositories/bundler_2_2_7/install_with_gemfile_lock_with_changed_gem_version/.diffend.yml +3 -0
  87. data/repositories/bundler_2_2_7/install_with_gemfile_lock_with_changed_gem_version/Gemfile +6 -0
  88. data/repositories/bundler_2_2_7/install_with_gemfile_lock_with_changed_gem_version/Gemfile.lock +18 -0
  89. data/repositories/bundler_2_2_7/install_with_gemfile_lock_with_changed_gem_version/README.md +1 -0
  90. data/repositories/bundler_2_2_7/install_with_gemfile_lock_with_locked_gem_version/.diffend.yml +3 -0
  91. data/repositories/bundler_2_2_7/install_with_gemfile_lock_with_locked_gem_version/Gemfile +6 -0
  92. data/repositories/bundler_2_2_7/install_with_gemfile_lock_with_locked_gem_version/Gemfile.lock +18 -0
  93. data/repositories/bundler_2_2_7/install_with_gemfile_lock_with_locked_gem_version/README.md +1 -0
  94. data/repositories/bundler_2_2_7/install_with_gemfile_lock_with_removed_gem/.diffend.yml +3 -0
  95. data/repositories/bundler_2_2_7/install_with_gemfile_lock_with_removed_gem/Gemfile +5 -0
  96. data/repositories/bundler_2_2_7/install_with_gemfile_lock_with_removed_gem/Gemfile.lock +41 -0
  97. data/repositories/bundler_2_2_7/install_with_gemfile_lock_with_removed_gem/README.md +1 -0
  98. data/repositories/bundler_2_2_7/install_with_gemfile_lock_with_two_platforms/.diffend.yml +3 -0
  99. data/repositories/bundler_2_2_7/install_with_gemfile_lock_with_two_platforms/Gemfile +10 -0
  100. data/repositories/bundler_2_2_7/install_with_gemfile_lock_with_two_platforms/Gemfile.lock +30 -0
  101. data/repositories/bundler_2_2_7/install_with_gemfile_lock_with_two_platforms/README.md +1 -0
  102. data/repositories/bundler_2_2_7/install_with_gemfile_lock_with_two_platforms/gem-with-two-platforms.gemspec +16 -0
  103. data/repositories/bundler_2_2_7/install_with_gemfile_lock_with_two_primary_sources/.diffend.yml +3 -0
  104. data/repositories/bundler_2_2_7/install_with_gemfile_lock_with_two_primary_sources/Gemfile +6 -0
  105. data/repositories/bundler_2_2_7/install_with_gemfile_lock_with_two_primary_sources/Gemfile.lock +17 -0
  106. data/repositories/bundler_2_2_7/install_with_gemfile_lock_with_two_primary_sources/README.md +1 -0
  107. data/repositories/bundler_2_2_7/install_with_gemfile_lock_with_two_sources/.diffend.yml +3 -0
  108. data/repositories/bundler_2_2_7/install_with_gemfile_lock_with_two_sources/Gemfile +6 -0
  109. data/repositories/bundler_2_2_7/install_with_gemfile_lock_with_two_sources/Gemfile.lock +19 -0
  110. data/repositories/bundler_2_2_7/install_with_gemfile_lock_with_two_sources/README.md +1 -0
  111. data/repositories/bundler_2_2_7/install_without_gemfile_lock/.diffend.yml +3 -0
  112. data/repositories/bundler_2_2_7/install_without_gemfile_lock/Gemfile +5 -0
  113. data/repositories/bundler_2_2_7/install_without_gemfile_lock/README.md +1 -0
  114. data/repositories/bundler_2_2_7/update_with_gemfile_lock/.diffend.yml +3 -0
  115. data/repositories/bundler_2_2_7/update_with_gemfile_lock/Gemfile +5 -0
  116. data/repositories/bundler_2_2_7/update_with_gemfile_lock/Gemfile.lock +16 -0
  117. data/repositories/bundler_2_2_7/update_with_gemfile_lock/README.md +1 -0
  118. data/repositories/bundler_2_2_7/update_with_gemfile_lock_with_added_gem/.diffend.yml +3 -0
  119. data/repositories/bundler_2_2_7/update_with_gemfile_lock_with_added_gem/Gemfile +6 -0
  120. data/repositories/bundler_2_2_7/update_with_gemfile_lock_with_added_gem/Gemfile.lock +16 -0
  121. data/repositories/bundler_2_2_7/update_with_gemfile_lock_with_added_gem/README.md +1 -0
  122. data/repositories/bundler_2_2_7/update_with_gemfile_lock_with_changed_gem_version/Gemfile +6 -0
  123. data/repositories/bundler_2_2_7/update_with_gemfile_lock_with_changed_gem_version/Gemfile.lock +18 -0
  124. data/repositories/bundler_2_2_7/update_with_gemfile_lock_with_changed_gem_version/README.md +1 -0
  125. data/repositories/bundler_2_2_7/update_with_gemfile_lock_with_locked_gem_version/Gemfile +6 -0
  126. data/repositories/bundler_2_2_7/update_with_gemfile_lock_with_locked_gem_version/Gemfile.lock +18 -0
  127. data/repositories/bundler_2_2_7/update_with_gemfile_lock_with_locked_gem_version/README.md +1 -0
  128. data/repositories/bundler_2_2_7/update_with_gemfile_lock_with_removed_gem/.diffend.yml +3 -0
  129. data/repositories/bundler_2_2_7/update_with_gemfile_lock_with_removed_gem/Gemfile +5 -0
  130. data/repositories/bundler_2_2_7/update_with_gemfile_lock_with_removed_gem/Gemfile.lock +41 -0
  131. data/repositories/bundler_2_2_7/update_with_gemfile_lock_with_two_primary_sources/.diffend.yml +3 -0
  132. data/repositories/bundler_2_2_7/update_with_gemfile_lock_with_two_primary_sources/Gemfile +6 -0
  133. data/repositories/bundler_2_2_7/update_with_gemfile_lock_with_two_primary_sources/Gemfile.lock +17 -0
  134. data/repositories/bundler_2_2_7/update_with_gemfile_lock_with_two_primary_sources/README.md +1 -0
  135. data/repositories/bundler_2_2_7/update_with_gemfile_lock_with_two_sources/.diffend.yml +3 -0
  136. data/repositories/bundler_2_2_7/update_with_gemfile_lock_with_two_sources/Gemfile +6 -0
  137. data/repositories/bundler_2_2_7/update_with_gemfile_lock_with_two_sources/Gemfile.lock +42 -0
  138. data/repositories/bundler_2_2_7/update_with_gemfile_lock_with_two_sources/README.md +1 -0
  139. data/repositories/bundler_2_2_7/update_without_gemfile_lock/.diffend.yml +3 -0
  140. data/repositories/bundler_2_2_7/update_without_gemfile_lock/Gemfile +5 -0
  141. data/repositories/diffend.json +9 -0
  142. metadata +123 -2
  143. metadata.gz.sig +0 -0
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 329d0035ee4b67c704f2bdd5fd200d64f9ae8e1becbed313d8dd92a0e16df80b
4
- data.tar.gz: 8033441ed7c7932b687a0f9cbaae5c4da3aa2daa8398358ba5d20251eb27126d
3
+ metadata.gz: 07bae52f686cd3e88f10c37295b5cebe4227aa58f22af34c3dc81468e644324f
4
+ data.tar.gz: 6aa9385bc4d9f3db721df93ca8cab6896da38deb91c96d458fe98922323663ad
5
5
  SHA512:
6
- metadata.gz: 63912e6f594a0569bf7ac80f1c3e10ef86c7d4a5e9c2bc4f8b7df52cc2307954668cc50494b854b1cc27cce10ef12792104ca7890921a96d5a669f379321f5c7
7
- data.tar.gz: 7b45d8ffe0cd139578fa6c6e4b156b816662467d48a3ab3c4bf66a10a3eb43439aa16b2f79b88e8222f7949daaad6efa17d8f9749aa4cf01dfb58e9fe6c4389b
6
+ metadata.gz: ef8e5536b559884c981b27a228719bf3b8f6d6f81e32c4dd8ae4cf3485fa0e7da61ca6ab09e4596992e3c27e5b68b3f8fefaa7b18c606ffe99c30e4f0f896fd5
7
+ data.tar.gz: 38ba600074cc62b4c23ab4a6f0604afa45d94f5a299dc4428a24441d84b82e1c3982442a27dd659c349056992978f334d1f8e45e069c8780fee39d7dca17b740
checksums.yaml.gz.sig CHANGED
Binary file
data.tar.gz.sig CHANGED
Binary file
@@ -18,7 +18,7 @@ jobs:
18
18
  - 'jruby-9.2.14.0'
19
19
  bundler:
20
20
  - '2.1.4'
21
- - '2.2.5'
21
+ - '2.2.7'
22
22
  include:
23
23
  - ruby: '2.7'
24
24
  coverage: 'true'
@@ -48,6 +48,8 @@ jobs:
48
48
  env:
49
49
  GITHUB_COVERAGE: ${{matrix.coverage}}
50
50
  run: bundle _${{matrix.bundler}}_ exec rspec
51
+ - name: Run integration tests
52
+ run: bundle _${{matrix.bundler}}_ exec rake integration_suite
51
53
 
52
54
  diffend:
53
55
  runs-on: ubuntu-latest
data/CHANGELOG.md CHANGED
@@ -2,6 +2,25 @@
2
2
 
3
3
  ## [Unreleased][master]
4
4
 
5
+ ## [0.2.44] (2021-03-31)
6
+ - `project_id`, `shareable_id` and `shareable_key` need to be a valid UUID
7
+
8
+ ## [0.2.43] (2021-03-16)
9
+ - introduce `DIFFEND_TAGS` ([#119](https://github.com/diffend-io/diffend-ruby/pull/119))
10
+ - add support for `bundle add` command ([#118](https://github.com/diffend-io/diffend-ruby/pull/118))
11
+
12
+ ## [0.2.42] (2021-03-09)
13
+ - introduce `DIFFEND_SKIP_DENY` flag
14
+ - fix config not being passed properly to `build_error` in `Diffend::Execute` ([#116](https://github.com/diffend-io/diffend-ruby/pull/116))
15
+
16
+ ## [0.2.41] (2021-03-09)
17
+ - introduce integration specs ([#107](https://github.com/diffend-io/diffend-ruby/pull/107))
18
+ - use `Bundler::Definition.resolve` for specs ([#112](https://github.com/diffend-io/diffend-ruby/pull/112))
19
+
20
+ ## [0.2.40] (2021-02-23)
21
+ - don't expose ips, we can identify instance by a hostname ([#108](https://github.com/diffend-io/diffend-ruby/pull/108))
22
+ - don't set `verify_mode` when creating request in `Diffend::Request`, use default value set by `use_ssl` flag instead ([#109](https://github.com/diffend-io/diffend-ruby/pull/109))
23
+
5
24
  ## [0.2.39] (2021-01-18)
6
25
  - handle a case if we start to fast and some gems require things it may break the execution ([#101](https://github.com/diffend-io/diffend-ruby/pull/101))
7
26
 
@@ -122,7 +141,12 @@
122
141
 
123
142
  - initial release
124
143
 
125
- [master]: https://github.com/diffend-io/diffend-ruby/compare/v0.2.39...HEAD
144
+ [master]: https://github.com/diffend-io/diffend-ruby/compare/v0.2.44...HEAD
145
+ [0.2.44]: https://github.com/diffend-io/diffend-ruby/compare/v0.2.43...v0.2.44
146
+ [0.2.43]: https://github.com/diffend-io/diffend-ruby/compare/v0.2.42...v0.2.43
147
+ [0.2.42]: https://github.com/diffend-io/diffend-ruby/compare/v0.2.41...v0.2.42
148
+ [0.2.41]: https://github.com/diffend-io/diffend-ruby/compare/v0.2.40...v0.2.41
149
+ [0.2.40]: https://github.com/diffend-io/diffend-ruby/compare/v0.2.39...v0.2.40
126
150
  [0.2.39]: https://github.com/diffend-io/diffend-ruby/compare/v0.2.38...v0.2.39
127
151
  [0.2.38]: https://github.com/diffend-io/diffend-ruby/compare/v0.2.37...v0.2.38
128
152
  [0.2.37]: https://github.com/diffend-io/diffend-ruby/compare/v0.2.36...v0.2.37
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- diffend (0.2.39)
4
+ diffend (0.2.44)
5
5
 
6
6
  GEM
7
7
  remote: https://rubygems.org/
@@ -18,10 +18,10 @@ GEM
18
18
  rspec-expectations (3.10.1)
19
19
  diff-lcs (>= 1.2.0, < 2.0)
20
20
  rspec-support (~> 3.10.0)
21
- rspec-mocks (3.10.1)
21
+ rspec-mocks (3.10.2)
22
22
  diff-lcs (>= 1.2.0, < 2.0)
23
23
  rspec-support (~> 3.10.0)
24
- rspec-support (3.10.1)
24
+ rspec-support (3.10.2)
25
25
 
26
26
  PLATFORMS
27
27
  java
@@ -37,4 +37,4 @@ DEPENDENCIES
37
37
  rspec
38
38
 
39
39
  BUNDLED WITH
40
- 2.2.5
40
+ 2.2.7
data/Rakefile ADDED
@@ -0,0 +1,40 @@
1
+ # frozen_string_literal: true
2
+
3
+ %w[
4
+ bundler/setup
5
+ ].each(&method(:require))
6
+
7
+ require 'diffend/errors'
8
+ require 'diffend/config'
9
+ require 'diffend/shell'
10
+ require 'diffend/repository'
11
+ require 'diffend/integration_repository'
12
+
13
+ task :integration_suite do
14
+ Diffend::Repository::SUPPORTED.each do |command, repositories|
15
+ repositories.each do |repository_name|
16
+ repository = Diffend::IntegrationRepository.new(command, repository_name)
17
+ repository.repository.isolate do |path|
18
+ start = Time.now.to_f
19
+
20
+ repository.config?(path)
21
+
22
+ Bundler.with_unbundled_env do
23
+ repository.install_plugin(path)
24
+
25
+ cmd = Diffend::Shell.call_in_path(path, "bundle #{command}")
26
+
27
+ unless cmd[:exit_code].zero?
28
+ puts "#{repository.full_name} FAILED"
29
+ puts cmd[:stderr]
30
+ exit 1
31
+ end
32
+ end
33
+
34
+ took = Time.now.to_f - start
35
+
36
+ puts "#{repository.full_name} OK, took #{took.round(1)}s"
37
+ end
38
+ end
39
+ end
40
+ end
@@ -11,5 +11,7 @@ module Diffend
11
11
  EXEC = 'exec'
12
12
  # Bundler secure command introduced by diffend plugin
13
13
  SECURE = 'secure'
14
+ # Bundler add command
15
+ ADD = 'add'
14
16
  end
15
17
  end
@@ -32,6 +32,17 @@ module Diffend
32
32
  Expected #{Validator::KNOWN_KEYS[key].join(' or ')}, was #{config.public_send(key).class}.
33
33
  MSG
34
34
  end
35
+
36
+ # Invalid uuid value message
37
+ #
38
+ # @param key [String] invalid key
39
+ #
40
+ # @return [String]
41
+ def invalid_uuid(key)
42
+ <<~MSG
43
+ Diffend configuration value for #{key} is invalid.
44
+ MSG
45
+ end
35
46
  end
36
47
  end
37
48
  end
@@ -17,6 +17,14 @@ module Diffend
17
17
  development?: [TrueClass, FalseClass]
18
18
  }.freeze
19
19
 
20
+ # List of known uuid keys
21
+ UUID_KEYS = %i[project_id shareable_id shareable_key].freeze
22
+
23
+ # Imported from https://github.com/assaf/uuid/blob/master/lib/uuid.rb#L199
24
+ UUID_FORMAT = /\A[\da-f]{8}-([\da-f]{4}-){3}[\da-f]{12}\z/i
25
+
26
+ private_constant :UUID_KEYS, :UUID_FORMAT
27
+
20
28
  class << self
21
29
  # @param config [Diffend::Config]
22
30
  def call(config)
@@ -28,6 +36,12 @@ module Diffend
28
36
 
29
37
  config.errors << ErrorMessages.invalid_key(config, key) if invalid?(config, key)
30
38
  end
39
+
40
+ UUID_KEYS.each do |key|
41
+ next if valid_uuid?(config, key)
42
+
43
+ config.errors << ErrorMessages.invalid_uuid(key)
44
+ end
31
45
  end
32
46
 
33
47
  private
@@ -49,6 +63,14 @@ module Diffend
49
63
  def invalid?(config, key)
50
64
  !KNOWN_KEYS[key].include?(config.public_send(key).class)
51
65
  end
66
+
67
+ # @param config [Diffend::Config]
68
+ # @param key [String]
69
+ #
70
+ # @return [Boolean] true if key has a valid uuid, false otherwise
71
+ def valid_uuid?(config, key)
72
+ UUID_FORMAT.match?(config.public_send(key))
73
+ end
52
74
  end
53
75
  end
54
76
  end
@@ -21,5 +21,7 @@ module Diffend
21
21
  HandledException = Class.new(BaseError)
22
22
  # Raised when we are unable to resolve dependencies
23
23
  DependenciesResolveException = Class.new(BaseError)
24
+ # Failure of a shell command execution
25
+ FailedShellCommand = Class.new(BaseError)
24
26
  end
25
27
  end
@@ -43,8 +43,9 @@ module Diffend
43
43
  end
44
44
  end
45
45
 
46
+ # @param config [Diffend::Config]
46
47
  # @param response [Hash] response from diffend API
47
- def build_error(response)
48
+ def build_error(config, response)
48
49
  build_error_message(response)
49
50
  .tap(&config.logger.method(:error))
50
51
 
@@ -65,7 +66,7 @@ module Diffend
65
66
  build_deny_message(config.command, response)
66
67
  .tap(&config.logger.method(:error))
67
68
 
68
- exit 1
69
+ exit 1 unless ENV.key?('DIFFEND_SKIP_DENY')
69
70
  else
70
71
  Diffend::HandleErrors::Report.call(
71
72
  config: config,
@@ -39,10 +39,10 @@ module Diffend
39
39
  # @return [Diffend::RequestObject]
40
40
  def build_request_object(config, payload)
41
41
  Diffend::RequestObject.new(
42
- config: config,
43
- url: config.errors_url,
44
- payload: payload,
45
- request_method: :post
42
+ config,
43
+ config.errors_url,
44
+ payload,
45
+ :post
46
46
  )
47
47
  end
48
48
 
@@ -0,0 +1,92 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Diffend
4
+ # Repository for integrations
5
+ class IntegrationRepository
6
+ # Plugin code entry in Gemfile
7
+ GEMFILE_PLUGIN_ENTRY = 'plugin \'diffend\''
8
+ # Gemfile file name
9
+ GEMFILE_FILE_NAME = 'Gemfile'
10
+ # Gemfile backup file name
11
+ GEMFILE_BACKUP_FILE_NAME = 'Gemfile.backup'
12
+ # Plugin install command
13
+ PLUGIN_INSTALL_COMMAND = 'bundle plugin install diffend'
14
+
15
+ attr_reader :command, :name, :repository
16
+
17
+ # @param command [String] command executed via bundler
18
+ # @param name [String] repository name
19
+ def initialize(command, name)
20
+ @command = command
21
+ @name = name
22
+ @repository = Diffend::Repository.new(command, name)
23
+ end
24
+
25
+ # @return [String] full name of the repository with command
26
+ def full_name
27
+ "#{command}_#{name}"
28
+ end
29
+
30
+ # @param path [String] path to the repository
31
+ def config?(path)
32
+ # check if .diffend.yml exists
33
+ return if File.exist?(File.join(path, Diffend::Config::FILENAME))
34
+
35
+ puts "Diffend configuration does not exist for #{command} #{name}"
36
+ exit 1
37
+ end
38
+
39
+ # @param path [String] path to the repository
40
+ def install_plugin(path)
41
+ cmd = Diffend::Shell.call_in_path(path, PLUGIN_INSTALL_COMMAND)
42
+
43
+ unless cmd[:exit_code].zero?
44
+ puts "#{PLUGIN_INSTALL_COMMAND} failed"
45
+ puts cmd[:stderr]
46
+ exit 1
47
+ end
48
+
49
+ switch_plugin_to_development(path, cmd[:stdout])
50
+ add_plugin_to_gemfile(path)
51
+ end
52
+
53
+ private
54
+
55
+ # @param path [String] path to the repository
56
+ # @param stdout [String] stdout from plugin install command
57
+ def switch_plugin_to_development(path, stdout)
58
+ installed_version = stdout.scan(/Installing diffend (\d*\.\d*\.\d*)/)[0][0]
59
+ diffend_working_path = File.expand_path('..', Bundler.bin_path)
60
+ bundler_plugins_path = File.join(path, '.bundle/plugin/gems')
61
+ bundler_diffend_plugin_path = File.join(bundler_plugins_path, "diffend-#{installed_version}")
62
+ FileUtils.mv(bundler_diffend_plugin_path, "#{bundler_diffend_plugin_path}-")
63
+ FileUtils.ln_s(diffend_working_path, bundler_diffend_plugin_path)
64
+ end
65
+
66
+ # @param path [String] path to the repository
67
+ def add_plugin_to_gemfile(path)
68
+ gemfile_path = File.join(path, GEMFILE_FILE_NAME)
69
+
70
+ FileUtils.mv(gemfile_path, File.join(path, GEMFILE_BACKUP_FILE_NAME))
71
+ file = File.open(gemfile_path, 'w')
72
+ source_detected = nil
73
+
74
+ File.readlines(
75
+ File.join(path, GEMFILE_BACKUP_FILE_NAME)
76
+ ).each do |line|
77
+ if line.start_with?('source') && source_detected.nil?
78
+ source_detected = true
79
+ elsif source_detected
80
+ source_detected = false
81
+ file.write("\n#{GEMFILE_PLUGIN_ENTRY}\n")
82
+ end
83
+
84
+ file.write(line)
85
+ end
86
+
87
+ file.close
88
+
89
+ FileUtils.rm(File.join(path, GEMFILE_BACKUP_FILE_NAME))
90
+ end
91
+ end
92
+ end
@@ -16,7 +16,6 @@ module Diffend
16
16
 
17
17
  {
18
18
  'command' => command,
19
- 'ips' => ips,
20
19
  'name' => uname[:nodename],
21
20
  'system' => {
22
21
  'machine' => uname[:machine],
@@ -53,22 +52,11 @@ module Diffend
53
52
  end
54
53
  end
55
54
 
56
- # Build host ips, except localhost and loopback
57
- #
58
- # @return [Array<String>]
59
- def ips
60
- Socket.ip_address_list.map do |ip|
61
- next if ip.ipv4_loopback? || ip.ipv6_loopback? || ip.ipv6_linklocal?
62
-
63
- ip.ip_address
64
- end.compact
65
- end
66
-
67
55
  # Build host tags
68
56
  #
69
57
  # @return [Array]
70
58
  def tags
71
- tags = []
59
+ tags = prepare_user_tags
72
60
 
73
61
  if ENV.key?('GITHUB_ACTIONS')
74
62
  tags << 'ci'
@@ -83,6 +71,17 @@ module Diffend
83
71
  tags
84
72
  end
85
73
 
74
+ # Prepare user tags
75
+ #
76
+ # @return [Array]
77
+ def prepare_user_tags
78
+ if ENV.key?('DIFFEND_TAGS')
79
+ ENV['DIFFEND_TAGS'].split(',')
80
+ else
81
+ []
82
+ end
83
+ end
84
+
86
85
  # @param str [String] that we want to clean and truncate
87
86
  def clean(str)
88
87
  str
@@ -39,8 +39,7 @@ module Diffend
39
39
  ::Bundler.ui.silence { instance.resolve }
40
40
 
41
41
  case command
42
- when Commands::INSTALL, Commands::EXEC, Commands::SECURE then instance.build_install
43
- when Commands::UPDATE then instance.build_update
42
+ when Commands::INSTALL, Commands::EXEC, Commands::SECURE, Commands::UPDATE, Commands::ADD then instance.build
44
43
  else
45
44
  raise ArgumentError, "invalid command: #{command}"
46
45
  end
@@ -65,35 +64,15 @@ module Diffend
65
64
  @cached ? @definition.resolve_with_cache! : @definition.resolve_remotely!
66
65
  end
67
66
 
68
- # Build install specification
67
+ # Build specification
69
68
  #
70
69
  # @return [Hash]
71
- def build_install
70
+ def build
72
71
  hash = build_main
73
72
 
74
- @definition.specs.each do |spec|
75
- next if skip?(spec.source)
76
-
77
- locked_spec = @locked_specs.find { |s| s.name == spec.name }
78
-
79
- hash['dependencies'][spec.name] = {
80
- 'platform' => build_spec_platform(spec, locked_spec),
81
- 'source' => build_spec_source(spec),
82
- 'type' => build_dependency_type(spec.name),
83
- 'versions' => build_versions(spec, locked_spec)
84
- }
85
- end
86
-
87
- hash
88
- end
89
-
90
- # Build update specification
91
- #
92
- # @return [Hash]
93
- def build_update
94
- hash = build_main
95
-
96
- @definition.specs.each do |spec|
73
+ @definition.resolve.each do |spec|
74
+ # Skip metadata
75
+ next if spec.instance_variable_get(:@specification).nil?
97
76
  next if skip?(spec.source)
98
77
 
99
78
  locked_spec = @locked_specs.find { |s| s.name == spec.name }