Преобразуйте связку строк в массив и сравните два массива, чтобы получить общие значения в обоих - PullRequest
1 голос
/ 23 марта 2020

Это мой код -
Здесь я пытаюсь получить все константы, к которым присоединена строка feature_toggle, путем поиска во всех файлах с помощью регулярного выражения, которое было клонировано из git и сохранено. локально, например,

feature_enabled?(TEST_ONE) 
feature_enabled?(TEST_TWO)
feature_enabled?(TEST_THREE)
feature_enabled?(TEST_FOUR)
feature_enabled?(KEY_AS_PRIMARY)

Из этого я получу следующие значения в match_found

 ["TEST_ONE", "TEST_TWO", "TEST_THREE","TEST_FOUR","KEY_AS_PRIMARY"]

Это метод, в котором я пытаюсь добиться этого.

    # public: retrieve the constant feature names based on the asset passed
    #
    # filename - path of each file under a repository for running the scan for example - /Users/sagarPC/Desktop/project/tmp/icdev/somefolder/app/models/project_one/orion/add_me_task.rb
    # pattern - regex pattern which search for the names.Ex- /(?:\.|!)?feature_enabled\?\((.*?)\)/m
    #
    # Ex - feature_enabled?(TEST_ONE)
    #
    # returns each constant's value in an array
    # Ex - [testone,testtwo,testthree,testfour]

    def self.constant_discovery(file_name, pattern) 
    matches = File.open(file_name).read.scan(pattern).uniq.flatten.compact
    matches_found = matches.map {|key| key.split(',')[0].scan(/^[A-Z]+(?:_[A-Z]+)*$/)}.flatten
    search_pattern = /([A-Z]+_)*[A-Z]+ = '.+'/
    File.open(file_name) do |f|
    lines = f.find_all {|line| line =~ search_pattern }
      lines.each do |line|
        if line.include?('=')
          print line unless line.empty?
         required_output = matches_found & line
        end 
       line
      end
     end
     matches 
    end

По приведенному выше коду я получаю совпадений_нашитых значений, как показано ниже,

["TEST_ONE", "TEST_TWO", "TEST_THREE","TEST_FOUR","KEY_AS_PRIMARY"]

Где как, строка выводит примерно так:

TEST_ONE = 'testone'
TEST_TWO = 'testtwo'
TEST_THREE = 'testthree'
TEST_FOUR = 'testfour'

Эти константы могут быть объявлены где-то в клонированном репозитории и могут использоваться где-то еще. В require_output мне нужно получить значения общих констант между match_found и line , из этих общих констант вернуть только те, которые объявлены где-то и имеют значения, назначенные для Это. Значение константы может быть объявлено где угодно в клонированном репо.

Когда я пытался это сделать, я сталкивался с проблемой при сравнении match_found и line с ошибкой сообщение «не удалось с ошибкой, неявное преобразование строки в массив»

Под этим я понял, что должен преобразовать значения line в массив. И затем следует сравнить его с match_found , после этого я получу общую константу из обоих массивов в required_output . И позже я могу получить те значения, которые были назначены для этих общих констант. В конце концов, метод должен выдавать следующие возвращаемые значения:

[testone,testtwo,testthree,testfour]

Поскольку я очень плохо знаком с ruby, может кто-нибудь помочь мне с этим? Извините, что вставил весь мой метод. Пожалуйста, помогите мне решить эту проблему.

...