File: field.rb

package info (click to toggle)
ruby-jira 2.1.5-4
  • links: PTS, VCS
  • area: main
  • in suites: bookworm
  • size: 968 kB
  • sloc: ruby: 5,125; makefile: 12
file content (83 lines) | stat: -rw-r--r-- 2,695 bytes parent folder | download | duplicates (2)
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
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
module JIRA
  module Resource
    class FieldFactory < JIRA::BaseFactory # :nodoc:
      delegate_to_target_class :map_fields, :name_to_id, :field_map
    end

    class Field < JIRA::Base
      # translate a custom field description to a method-safe name
      def self.safe_name(description)
        description.gsub(/[^a-zA-Z0-9]/, '_')
      end

      # safe_name plus disambiguation if it fails it uses the original jira id (customfield_#####)
      def self.safer_name(description, jira_id)
        "#{safe_name(description)}_#{jira_id.split('_')[1]}"
      rescue StandardError
        jira_id
      end

      def self.map_fields(client)
        field_map = {}
        field_map_reverse = {}
        fields = client.Field.all

        # two pass approach, so that a custom field with the same name
        # as a system field can't take precedence
        fields.each do |f|
          next if f.custom
          name = safe_name(f.name)
          field_map_reverse[f.id] = [f.name, name] # capture both the official name, and the mapped name
          field_map[name] = f.id
        end

        fields.each do |f|
          next unless f.custom
          name = if field_map.key? f.name
                   renamed = safer_name(f.name, f.id)
                   warn "Duplicate Field name #{f.name} #{f.id} - renaming as #{renamed}"
                   renamed
                 else
                   safe_name(f.name)
          end
          field_map_reverse[f.id] = [f.name, name] # capture both the official name, and the mapped name
          field_map[name] = f.id
        end

        client.cache.field_map_reverse = field_map_reverse # not sure where this will be used yet, but sure to be useful
        client.cache.field_map = field_map
      end

      def self.field_map(client)
        client.cache.field_map
      end

      def self.name_to_id(client, field_name)
        field_name = field_name.to_s
        return field_name unless client.cache.field_map && client.cache.field_map[field_name]
        client.cache.field_map[field_name]
      end

      def respond_to?(method_name, _include_all = false)
        if [method_name.to_s, client.Field.name_to_id(method_name)].any? { |k| attrs.key?(k) }
          true
        else
          super(method_name)
        end
      end

      def method_missing(method_name, *args, &block)
        if attrs.key?(method_name.to_s)
          attrs[method_name.to_s]
        else
          official_name = client.Field.name_to_id(method_name)
          if attrs.key?(official_name)
            attrs[official_name]
          else
            super(method_name, *args, &block)
          end
        end
      end
    end
  end
end