summaryrefslogtreecommitdiff
path: root/app/models/license_template.rb
blob: 693a6a89fd2f9d6e1a8495d213f0d96b4ee3a496 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
# frozen_string_literal: true

class LicenseTemplate
  PROJECT_TEMPLATE_REGEX =
    %r{[\<\{\[]
      (project|description|
      one\sline\s.+\swhat\sit\sdoes\.) # matching the start and end is enough here
    [\>\}\]]}xi.freeze
  YEAR_TEMPLATE_REGEX = /[<{\[](year|yyyy)[>}\]]/i.freeze
  FULLNAME_TEMPLATE_REGEX =
    %r{[\<\{\[]
      (fullname|name\sof\s(author|copyright\sowner))
    [\>\}\]]}xi.freeze

  attr_reader :id, :name, :category, :nickname, :url, :meta

  alias_method :key, :id

  def initialize(id:, name:, category:, content:, nickname: nil, url: nil, meta: {})
    @id = id
    @name = name
    @category = category
    @content = content
    @nickname = nickname
    @url = url
    @meta = meta
  end

  def popular?
    category == :Popular
  end
  alias_method :featured?, :popular?

  # Returns the text of the license
  def content
    if @content.respond_to?(:call)
      @content = @content.call
    else
      @content
    end
  end

  # Populate placeholders in the LicenseTemplate content
  def resolve!(project_name: nil, fullname: nil, year: Time.now.year.to_s)
    # Ensure the string isn't shared with any other instance of LicenseTemplate
    new_content = content.dup
    new_content.gsub!(YEAR_TEMPLATE_REGEX, year) if year.present?
    new_content.gsub!(PROJECT_TEMPLATE_REGEX, project_name) if project_name.present?
    new_content.gsub!(FULLNAME_TEMPLATE_REGEX, fullname) if fullname.present?

    @content = new_content

    self
  end
end