summaryrefslogtreecommitdiff
path: root/lib/license/management/repository.rb
diff options
context:
space:
mode:
Diffstat (limited to 'lib/license/management/repository.rb')
-rw-r--r--lib/license/management/repository.rb49
1 files changed, 49 insertions, 0 deletions
diff --git a/lib/license/management/repository.rb b/lib/license/management/repository.rb
new file mode 100644
index 0000000..2eee1b6
--- /dev/null
+++ b/lib/license/management/repository.rb
@@ -0,0 +1,49 @@
+# frozen_string_literal: true
+
+module License
+ module Management
+ class Repository
+ include Loggable
+ include Verifiable
+
+ def initialize(
+ compatibility_path: License::Management.root.join('normalized-licenses.yml')
+ )
+ @compatibility_data = YAML.safe_load(IO.read(compatibility_path))
+ end
+
+ def item_for(license)
+ id = id_for(license)
+ item = id ? compatibility_data['licenses'][id] : nil
+ item ? { 'id' => id }.merge(item) : generate_item_for(license)
+ end
+
+ private
+
+ attr_reader :compatibility_data
+
+ def id_for(license)
+ ids = compatibility_data['ids']
+ ids[license.send(:short_name)] || ids[license.url]
+ end
+
+ # When `license_finder` is unable to determine the license it will use the full
+ # content of the file as the name of the license. This method shrinks that name
+ # down to just take the first line of the file.
+ def take_first_line_from(content)
+ return '' if blank?(content)
+
+ content.split(/[\r\n]+/)[0]
+ end
+
+ def generate_item_for(license)
+ log_info("detected unknown license named `#{license.send(:short_name)}`")
+ {
+ 'id' => 'unknown',
+ 'name' => take_first_line_from(license.name),
+ 'url' => present?(license.url) ? license.url : ''
+ }
+ end
+ end
+ end
+end