skeleton-ui 0.1.0 → 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
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