skeleton-ui 0.1.0 → 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 0ee835f042191dc5d9b1f8965207c85343d4f447e84e4031d253e8a5693cff84
4
- data.tar.gz: 43cf9b138e3504bb241c904f83b7476f7463e9bedeebf6cb3556d89b2dbaf2c3
3
+ metadata.gz: c8ef2154e88b5a4fa1a97058af39362b3336a44827407110bcb8b640fa9a08fd
4
+ data.tar.gz: 68aaa372fa4ed72015cf96524e3d376b359249fb4a0b023e55293ab2eb99897a
5
5
  SHA512:
6
- metadata.gz: f41d1362e26ef0c6ae9a01977ec6596b34c3d98015cfe8486da6634f1e22a056cb176985862d1a4f54faeb603cd93d781ba1bcf787679204cc52b17852965772
7
- data.tar.gz: a2fca13369b1ca1f0c767a6e3460fb4c04fdd4e21418e9ff0f1b21a759653953eba68a34c4703371775025a3158f02a85cf69ab5b8c9c899387f7fcd09074e60
6
+ metadata.gz: 2412554c9d911309c6ae7c626b85c5af8a00fe4b0ac0b733129b3096527b7f3f3a7459137e2d2695def1c9ae32f8105c67e8f7bf27c5f6a387f23f0bc0c648a6
7
+ data.tar.gz: 5543e179d7f1a6e85f3231ff1546ba126d0cff836d5254e0f6bb94c846fab22da4f5d6e8316df7d058bc7e8e6a8eeda8bc3aa87e37b6ff9a73a41b2779356868
data/.gitignore CHANGED
@@ -5,3 +5,6 @@
5
5
  /attach/
6
6
  /Attachments/
7
7
  /XCResults/
8
+ *.png
9
+ /.idea/
10
+ /pkg/
@@ -0,0 +1,26 @@
1
+ Style/Tab:
2
+ Enabled: false
3
+
4
+ Layout/IndentationWidth:
5
+ Enabled: false
6
+
7
+ Metrics/MethodLength:
8
+ Enabled: false
9
+
10
+ Metrics/ClassLength:
11
+ Enabled: false
12
+
13
+ Layout/IndentationConsistency:
14
+ Enabled: false
15
+
16
+ Layout/AlignHash:
17
+ Enabled: false
18
+
19
+ Metrics/AbcSize:
20
+ Enabled: false
21
+
22
+ Layout/AlignParameters:
23
+ Enabled: false
24
+
25
+ Style/Documentation:
26
+ Enabled: false
data/README.md CHANGED
@@ -5,6 +5,9 @@ CLI for fast generating multi language page objects from iOS and Android screens
5
5
  Prerequisites:
6
6
  --------
7
7
 
8
+ #### Global
9
+ - Install [imagemagick](http://brewformulas.org/Imagemagick).
10
+
8
11
  #### Android
9
12
  - Install [SDK Tools](http://developer.android.com/sdk/installing/index.html?pkg=tools).
10
13
  - SDK tools are added to your $PATH. [OSX](https://stackoverflow.com/posts/19764254/revisions)
@@ -13,7 +16,6 @@ Prerequisites:
13
16
  #### iOS
14
17
  - Install [Xcode](https://developer.apple.com/xcode/download/).
15
18
  - Install [Xcode Command Line Tools](http://railsapps.github.io/xcode-command-line-tools.html).
16
- - For real devices you need to sign skeleton in xcodeproj ([like appium](https://github.com/appium/appium-xcuitest-driver/blob/master/docs/real-device-config.md)).
17
19
 
18
20
  Installation:
19
21
  ------
@@ -76,6 +78,11 @@ Usage:
76
78
  EXAMPLES:
77
79
 
78
80
  skeleton clear
81
+
82
+ OPTIONS:
83
+
84
+ -p, --port PORT
85
+ Set web-server port
79
86
 
80
87
  Docs:
81
88
  ------
@@ -34,8 +34,10 @@ module Skeleton
34
34
  c.syntax = 'skeleton server'
35
35
  c.description = 'Run skeleton web-server'
36
36
  c.example 'description', 'skeleton server'
37
- c.action do |_args, _options|
38
- system('cd ../html/ && ruby server.rb')
37
+ c.option '-p', '--port PORT', String, 'Set web-server port'
38
+ c.action do |_args, options|
39
+ options.default(port: 4567)
40
+ system("cd ../html/ && ruby server.rb #{options.port}")
39
41
  end
40
42
  end
41
43
  end
@@ -1,5 +1,7 @@
1
1
  require 'sinatra'
2
2
 
3
+ set :port, ARGV[0]
4
+
3
5
  get '/:file' do
4
6
  send_file params[:file]
5
7
  end
@@ -20,12 +20,12 @@
20
20
  </div>
21
21
  </div>
22
22
  <div class="col-md-8">
23
- <h4 class="mb-3">PageObjects:</h4>
23
+ <h4 class="mb-3">Page Objects:</h4>
24
24
  <div class="content" id="content">
25
25
  <pre><code><%= @pageobject %></code></pre>
26
26
  </div>
27
27
  <br>
28
- <h4 class="mb-3">ElementsTree:</h4>
28
+ <h4 class="mb-3">Elements Tree:</h4>
29
29
  <div class="content" id="content">
30
30
  <pre><code><%= @elements_tree %></code></pre>
31
31
  </div>
@@ -3,6 +3,9 @@ require 'fileutils'
3
3
  require 'nokogiri'
4
4
  require 'logger'
5
5
  require 'colorize'
6
+ require 'mini_magick'
7
+ require_relative 'skeleton/languages.rb'
8
+ require_relative 'skeleton/root.rb'
6
9
  require_relative 'skeleton/version'
7
10
  require_relative 'skeleton/base'
8
11
  require_relative 'skeleton/ios'
@@ -10,8 +13,6 @@ require_relative 'skeleton/android'
10
13
 
11
14
  module Skeleton
12
15
  class Skeleton
13
- include Language
14
-
15
16
  attr_accessor :platform, :udid, :bundle_id
16
17
 
17
18
  def initialize(options)
@@ -30,39 +31,55 @@ module Skeleton
30
31
  end
31
32
 
32
33
  def udid=(udid)
33
- if udid.nil?
34
- raise 'Not set udid [-u arg]'
35
- end
34
+ raise 'Not set udid [-u arg]' if udid.nil?
36
35
  @udid = udid
37
36
  end
38
37
 
39
38
  def bundle_id=(bundle_id)
40
- if @platform == 'ios' && bundle_id.nil?
41
- raise 'Not set bundle_id [-b arg]'
42
- end
39
+ raise 'Not set bundle_id [-b arg]' if @platform == 'ios' && bundle_id.nil?
43
40
  @bundle_id = bundle_id
44
41
  end
45
42
 
46
- def run
43
+ def run
47
44
  @driver.clear
48
45
  @driver.precondition
49
46
  @driver.skeletoner
50
47
  fill_html
51
- @driver.log.info('Get it: http://localhost:4567/index.html 😍')
52
- end
48
+ open_url
49
+ end
53
50
 
54
51
  def fill_html
55
- languages = ['ruby', 'java']
56
- languages.each do |lang|
57
- type = language_type(lang: lang)
58
- @pageobject = File.read(Dir["#{Base::PAGE_OBJECTS_FOLDER}/*.#{type}"].first)
59
- @elements_tree = File.read(Dir["#{Base::PAGE_OBJECTS_FOLDER}/*.xml"].first)
60
- screenshot = Dir["#{Base::ATTACHMENTS_FOLDER}/*.png"].first
61
- FileUtils.cp_r(screenshot, "../html/screenshot.png")
52
+ language = Language.new
53
+ %w[ruby java].each do |lang|
54
+ attach_image
55
+ type = language.type(lang)
56
+ folder = Base::PAGE_OBJECTS_FOLDER
57
+ @pageobject = File.read(Dir["#{folder}/*.#{type}"].first)
58
+ @elements_tree = File.read(Dir["#{folder}/*.xml"].first)
59
+ if @driver.class == Android
60
+ @elements_tree = Nokogiri::XML(@elements_tree).to_s
61
+ @elements_tree.gsub!('<', '&lt;')
62
+ @elements_tree.gsub!('>', '&gt;')
63
+ end
62
64
  template = File.read('../html/template.html.erb')
63
65
  result = ERB.new(template).result(binding)
64
66
  File.open("../html/#{lang}.html", 'w+') { |f| f.write(result) }
65
67
  end
68
+ end
69
+
70
+ def attach_image
71
+ screenshot = Dir["#{Base::ATTACHMENTS_FOLDER}/*.png"].first
72
+ image = MiniMagick::Image.new(screenshot)
73
+ image.rotate(90) if image.width > image.height
74
+ FileUtils.cp_r(screenshot, '../html/screenshot.png')
75
+ rescue MiniMagick::Error => e
76
+ @driver.log.error(e)
77
+ end
78
+
79
+ def open_url
80
+ url = 'http://localhost:4567/index.html'
81
+ `open #{url}`
82
+ @driver.log.info("Look at your pretty page objects: #{url} 😍")
66
83
  end
67
84
 
68
85
  def ios?
@@ -1,16 +1,23 @@
1
1
  class Android < Base
2
- RESOURCE_ID = 'resource-id'
3
- CONTENT_DESC = 'content-desc'
4
- TEXT = 'text'
5
- ID = { java: :id }
6
- XPATH = { java: :xpath }
7
- CLASS = 'class'
2
+ RESOURCE_ID = 'resource-id'.freeze
3
+ CONTENT_DESC = 'content-desc'.freeze
4
+ TEXT = 'text'.freeze
5
+ CLASS = 'class'.freeze
6
+ ID = {
7
+ java: :id,
8
+ ruby: :id
9
+ }.freeze
10
+ XPATH = {
11
+ java: :xpath,
12
+ ruby: :xpath
13
+ }.freeze
8
14
 
9
15
  attr_accessor :platform, :udid
10
16
 
11
17
  def initialize(options)
12
18
  self.platform = options.platform
13
19
  self.udid = options.udid
20
+ @language = Language.new
14
21
  end
15
22
 
16
23
  def skeletoner
@@ -28,7 +35,7 @@ class Android < Base
28
35
  method_name.slice!(/.*id\//)
29
36
  code_generation(method_name: method_name,
30
37
  locator_type: ID,
31
- value: line[RESOURCE_ID])
38
+ locator_value: line[RESOURCE_ID])
32
39
  end
33
40
 
34
41
  def create_locator_by_content_desc(line)
@@ -37,7 +44,7 @@ class Android < Base
37
44
  locator = "//#{line[CLASS]}[@#{CONTENT_DESC}='#{line[CONTENT_DESC]}']"
38
45
  code_generation(method_name: method_name,
39
46
  locator_type: XPATH,
40
- value: locator)
47
+ locator_value: locator)
41
48
  end
42
49
 
43
50
  def create_locator_by_text(line)
@@ -46,7 +53,7 @@ class Android < Base
46
53
  locator = "//#{line[CLASS]}[@#{TEXT}='#{line[TEXT]}'"
47
54
  code_generation(method_name: method_name,
48
55
  locator_type: XPATH,
49
- value: locator)
56
+ locator_value: locator)
50
57
  end
51
58
 
52
59
  def create_locator(line)
@@ -65,9 +72,15 @@ class Android < Base
65
72
  page_source_html.css('node').each { |line| create_locator(line) }
66
73
  end
67
74
 
68
- def code_generation(method_name:, locator_type:, value:)
69
- java = java(method_name, locator_type, value)
75
+ def code_generation(method_name:, locator_type:, locator_value:)
76
+ java = @language.java(camel_method_name: camel_style(method_name),
77
+ locator_type: locator_type,
78
+ locator_value: locator_value)
79
+ ruby = @language.ruby(snake_method_name: snake_style(method_name),
80
+ locator_type: locator_type,
81
+ locator_value: locator_value)
70
82
  save(code: java, format: Language::JAVA)
83
+ save(code: ruby, format: Language::RUBY)
71
84
  end
72
85
 
73
86
  def page_source
@@ -1,32 +1,26 @@
1
- require_relative 'languages.rb'
2
- require_relative 'root.rb'
3
-
4
1
  class Base
5
- include Language
6
-
7
- PAGE_OBJECTS_FOLDER = "#{ROOT_DIR}/PageObjects"
8
- ATTACHMENTS_FOLDER = "#{ROOT_DIR}/Attachments"
2
+ PAGE_OBJECTS_FOLDER = "#{ROOT_DIR}/PageObjects".freeze
3
+ ATTACHMENTS_FOLDER = "#{ROOT_DIR}/Attachments".freeze
9
4
  TIMESTAMP = (Time.now.to_f * 1000).to_i
10
5
 
11
6
  def precondition
12
7
  create_logger
8
+ clear
9
+ FileUtils.rm_rf("#{ROOT_DIR}/html/screenshot.png")
13
10
  FileUtils.mkdir_p(PAGE_OBJECTS_FOLDER)
14
11
  FileUtils.mkdir_p(ATTACHMENTS_FOLDER)
15
12
  end
16
13
 
17
14
  def log
18
- if @log.nil?
19
- create_logger
20
- end
15
+ create_logger if @log.nil?
21
16
  @log
22
17
  end
23
18
 
24
- def skeletoner
25
- end
19
+ def skeletoner; end
26
20
 
27
21
  def clear
28
- FileUtils.rm_rf(Base::PAGE_OBJECTS_FOLDER)
29
- FileUtils.rm_rf(Base::ATTACHMENTS_FOLDER)
22
+ FileUtils.rm_rf(PAGE_OBJECTS_FOLDER)
23
+ FileUtils.rm_rf(ATTACHMENTS_FOLDER)
30
24
  end
31
25
 
32
26
  protected
@@ -39,19 +33,20 @@ class Base
39
33
  def create_logger
40
34
  @log = Logger.new(STDOUT)
41
35
  @log.level = Logger::INFO
42
- @log.formatter = proc do |severity, datetime, progname, msg|
36
+ @log.formatter = proc do |severity, datetime, _progname, msg|
43
37
  "[#{severity}] #{datetime}: " + "#{msg}\n".colorize(:light_cyan)
44
38
  end
45
39
  end
46
40
 
47
41
  def snake_style(method_name)
48
- method_name.tr("@()[]'\"*!?{}:;#$^.,\/\\", '').
49
- tr('-', '_').
50
- gsub(/([A-Z]+)([A-Z][a-z])/, '\1_\2').
51
- gsub(/([a-z\d])([A-Z])/, '\1_\2').
52
- gsub(/\s/, '_').
53
- gsub(/__+/, '_').
54
- downcase
42
+ method_name
43
+ .tr("@()[]'\"*!?{}:;#$^.,\/\\", '')
44
+ .tr('-', '_')
45
+ .gsub(/([A-Z]+)([A-Z][a-z])/, '\1_\2')
46
+ .gsub(/([a-z\d])([A-Z])/, '\1_\2')
47
+ .gsub(/\s/, '_')
48
+ .gsub(/__+/, '_')
49
+ .downcase
55
50
  end
56
51
 
57
52
  def camel_style(method_name)
@@ -71,12 +66,9 @@ class Base
71
66
  @locator_index = @locator_index.nil? ? 1 : @locator_index + 1
72
67
  end
73
68
 
74
- def screenshot
75
- end
69
+ def screenshot; end
76
70
 
77
- def page_source
78
- end
71
+ def page_source; end
79
72
 
80
- def code_generation
81
- end
73
+ def code_generation; end
82
74
  end
@@ -1,16 +1,16 @@
1
1
  class IOS < Base
2
2
  ACC_ID = {
3
- java: :AccessibilityId,
4
- ruby: :accessibility_id
5
- }
3
+ java: :AccessibilityId,
4
+ ruby: :accessibility_id
5
+ }.freeze
6
6
  NSPREDICATE = {
7
- java: :iOSNsPredicateString,
8
- ruby: :predicate
9
- }
10
- IDENTIFIER = 'identifier'
11
- LABEL = 'label'
12
- XCRESULTS_FOLDER = "#{ROOT_DIR}/XCResults"
13
- XCODEPROJ_FOLDER = "#{ROOT_DIR}/xcodeproj"
7
+ java: :iOSNsPredicateString,
8
+ ruby: :predicate
9
+ }.freeze
10
+ IDENTIFIER = 'identifier'.freeze
11
+ LABEL = 'label'.freeze
12
+ XCRESULTS_FOLDER = "#{ROOT_DIR}/XCResults".freeze
13
+ XCODEPROJ_FOLDER = "#{ROOT_DIR}/xcodeproj".freeze
14
14
 
15
15
  attr_accessor :platform, :udid, :bundle_id
16
16
 
@@ -18,6 +18,7 @@ class IOS < Base
18
18
  self.platform = options.platform
19
19
  self.udid = options.udid
20
20
  self.bundle_id = options.bundle
21
+ @language = Language.new
21
22
  end
22
23
 
23
24
  def skeletoner
@@ -47,7 +48,7 @@ class IOS < Base
47
48
  method_name = locator.strip
48
49
  code_generation(method_name: method_name,
49
50
  locator_type: ACC_ID,
50
- value: locator)
51
+ locator_value: locator)
51
52
  end
52
53
 
53
54
  def create_locator_by_label(text, type)
@@ -55,7 +56,7 @@ class IOS < Base
55
56
  locator = "#{LABEL} like '#{text}'"
56
57
  code_generation(method_name: method_name,
57
58
  locator_type: NSPREDICATE,
58
- value: locator)
59
+ locator_value: locator)
59
60
  end
60
61
 
61
62
  def create_page_objects
@@ -82,11 +83,14 @@ class IOS < Base
82
83
  locator.nil? ? '' : locator[1]
83
84
  end
84
85
 
85
- def code_generation(method_name:, locator_type:, value:)
86
- java = java(method_name, locator_type, value)
86
+ def code_generation(method_name:, locator_type:, locator_value:)
87
+ java = @language.java(camel_method_name: camel_style(method_name),
88
+ locator_type: locator_type,
89
+ locator_value: locator_value)
90
+ ruby = @language.ruby(snake_method_name: snake_style(method_name),
91
+ locator_type: locator_type,
92
+ locator_value: locator_value)
87
93
  save(code: java, format: Language::JAVA)
88
-
89
- ruby = ruby(method_name, locator_type, value)
90
94
  save(code: ruby, format: Language::RUBY)
91
95
  end
92
96
 
@@ -94,24 +98,23 @@ class IOS < Base
94
98
  if @page_source.nil?
95
99
  log.info('Getting screen source tree ⚒')
96
100
  FileUtils.rm_rf(XCRESULTS_FOLDER)
97
- start_grep, end_grep = 'start_grep_tag', 'end_grep_tag'
101
+ start_grep = 'start_grep_tag'
102
+ end_grep = 'end_grep_tag'
98
103
  ios_arch = @simulator ? 'iOS Simulator' : 'iOS'
99
104
  @page_source = `xcodebuild test \
100
- -project #{XCODEPROJ_FOLDER}/Skeleton.xcodeproj \
101
- -scheme Skeleton \
102
- -destination 'platform=#{ios_arch},id=#{@udid}' \
103
- -resultBundlePath #{XCRESULTS_FOLDER} \
104
- bundle_id="#{@bundle_id}" | \
105
- awk '/#{start_grep}/,/#{end_grep}/'`
105
+ -project #{XCODEPROJ_FOLDER}/Skeleton.xcodeproj \
106
+ -scheme Skeleton \
107
+ -destination 'platform=#{ios_arch},id=#{@udid}' \
108
+ -resultBundlePath #{XCRESULTS_FOLDER} \
109
+ bundle_id="#{@bundle_id}" | \
110
+ awk '/#{start_grep}/,/#{end_grep}/'`
106
111
  @page_source.slice!(start_grep)
107
112
  @page_source.slice!(end_grep)
108
113
  if @page_source.empty?
109
- log.fatal(
110
- "Something went wrong.\n" \
114
+ log.fatal("Something went wrong.\n" \
111
115
  "1. Try to sign Skeleton in #{XCODEPROJ_FOLDER}\n" \
112
116
  "2. Check in the iOS settings that Skeleton is trust developer.\n" \
113
- '3. Check your app bundle_id'
114
- )
117
+ '3. Check your app bundle_id')
115
118
  raise
116
119
  end
117
120
  log.info('Successfully getting Screen Source Tree 🔥')
@@ -120,15 +123,13 @@ class IOS < Base
120
123
  end
121
124
 
122
125
  def check_udid
123
- if @simulator.nil?
124
- log.info('Checking iOS UDID 👨‍💻')
125
- simulators = `xcrun simctl list`
126
- @simulator = simulators.include?(@udid)
127
- if !@simulator && !`instruments -s devices`.include?(@udid)
128
- log.fatal("No such devices with UDID: #{@udid}")
129
- raise
130
- end
131
- end
126
+ return unless @simulator.nil?
127
+ log.info('Checking iOS UDID 👨‍💻')
128
+ simulators = `xcrun simctl list`
129
+ @simulator = simulators.include?(@udid)
130
+ return if @simulator || `instruments -s devices`.include?(@udid)
131
+ log.fatal("No such devices with UDID: #{@udid}")
132
+ raise
132
133
  end
133
134
 
134
135
  def save_screenshot
@@ -1,28 +1,28 @@
1
- module Language
1
+ class Language
2
2
  JAVA = 'java'
3
3
  RUBY = 'rb'
4
4
  PYTHON = 'py'
5
5
 
6
- def java(method_name, locator_type, value)
6
+ def java(camel_method_name:, locator_type:, locator_value:)
7
7
  <<~JAVA
8
- By #{camel_style(method_name)}() {
9
- return MobileBy.#{locator_type[:java]}("#{value}");
8
+ By #{camel_method_name}() {
9
+ return MobileBy.#{locator_type[:java]}("#{locator_value}");
10
10
  }
11
11
 
12
12
  JAVA
13
13
  end
14
14
 
15
- def ruby(method_name, locator_type, value)
15
+ def ruby(snake_method_name:, locator_type:, locator_value:)
16
16
  <<~RUBY
17
- def #{snake_style(method_name)}
18
- return :#{locator_type[:ruby]}, "#{value}"
17
+ def #{snake_method_name}
18
+ return :#{locator_type[:ruby]}, "#{locator_value}"
19
19
  end
20
20
 
21
21
  RUBY
22
22
  end
23
23
 
24
- def language_type(lang:)
25
- case lang
24
+ def type(format)
25
+ case format
26
26
  when 'ruby'
27
27
  RUBY
28
28
  when 'java'
@@ -30,7 +30,7 @@ module Language
30
30
  when 'python'
31
31
  PYTHON
32
32
  else
33
- "I haven't this language"
33
+ "I haven't this language format"
34
34
  end
35
35
  end
36
36
  end
@@ -1,4 +1,4 @@
1
1
  module Skeleton
2
- VERSION = '0.1.0'
2
+ VERSION = '0.1.1'
3
3
  GEM_NAME = 'skeleton-ui'
4
4
  end
@@ -28,6 +28,7 @@ Gem::Specification.new do |spec|
28
28
  spec.add_development_dependency "rake", "~> 12.3.0"
29
29
  spec.add_development_dependency "rspec", "~> 3.7"
30
30
  spec.add_dependency "colorize", "~> 0.8.1"
31
+ spec.add_dependency "mini_magick", "~> 4.8.0"
31
32
  spec.add_dependency "nokogiri", "~> 1.8.2"
32
33
  spec.add_dependency "fileutils"
33
34
  spec.add_dependency "commander"
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: skeleton-ui
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - a.alterpesotskiy
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-07-11 00:00:00.000000000 Z
11
+ date: 2018-07-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -66,6 +66,20 @@ dependencies:
66
66
  - - "~>"
67
67
  - !ruby/object:Gem::Version
68
68
  version: 0.8.1
69
+ - !ruby/object:Gem::Dependency
70
+ name: mini_magick
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: 4.8.0
76
+ type: :runtime
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: 4.8.0
69
83
  - !ruby/object:Gem::Dependency
70
84
  name: nokogiri
71
85
  requirement: !ruby/object:Gem::Requirement
@@ -119,6 +133,7 @@ files:
119
133
  - ".githooks/commit-msg"
120
134
  - ".gitignore"
121
135
  - ".rspec"
136
+ - ".rubocop.yml"
122
137
  - CODE_OF_CONDUCT.md
123
138
  - Gemfile
124
139
  - LICENSE.txt