Module: FetchUtil::Regulatory::TdmPolicy

Included in:
FetchUtil::Regulatory
Defined in:
lib/fetch_util/regulatory/tdm_policy.rb

Instance Method Summary collapse

Instance Method Details

#expanded_tdm_policy_signals(policy_refs) ⇒ Object



6
7
8
9
10
11
12
13
14
15
16
17
18
# File 'lib/fetch_util/regulatory/tdm_policy.rb', line 6

def expanded_tdm_policy_signals(policy_refs)
  dedupe_policy_refs(policy_refs).flat_map do |policy_ref|
    record = tdm_policy_record(policy_ref["url"])
    Array(record["signals"]).map do |template|
      signal = deep_copy(template)
      signal["path"] ||= policy_ref["path"]
      conditions = signal["conditions"] || {}
      conditions["policy"] = policy_ref["url"]
      signal["conditions"] = conditions
      signal
    end
  end
end

#extract_tdm_policy_signals(body) ⇒ Object



31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
# File 'lib/fetch_util/regulatory/tdm_policy.rb', line 31

def extract_tdm_policy_signals(body)
  payload = JSON.parse(body.to_s)
  permissions = array_value(payload, "permission")

  permissions.filter_map do |permission|
    next unless permission.is_a?(Hash)
    next unless tdm_policy_action?(permission["action"])

    conditions = {}
    duties = array_value(permission, "duty").filter_map { |item| duty_name(item) }
    conditions["duty"] = duties if duties.any?
    purpose = permission_purpose(permission)
    conditions["purpose"] = purpose if purpose

    signal = build_signal("allow", "text-and-data-mining", conditions: conditions)
    target_path = policy_target_path(permission["target"])
    signal["path"] = target_path if target_path
    signal
  end
rescue JSON::ParserError
  []
end

#tdm_policy_record(url) ⇒ Object



20
21
22
23
24
25
26
27
28
29
# File 'lib/fetch_util/regulatory/tdm_policy.rb', line 20

def tdm_policy_record(url)
  cache_fetch("tdmpolicy:#{url}") do
    response = safe_get(url)
    signals = []
    if response&.status&.between?(200, 299) && json_like_response?(response.headers, response.body)
      signals = extract_tdm_policy_signals(response.body)
    end
    { "signals" => sort_specificity_signals(signals) }
  end
end