xcmonkey 0.1.1 → 0.2.0

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: bf6aac9a0ce5cf477ad675ca689b4120411e39a19b3b5cd7647b47dea04db9c1
4
- data.tar.gz: fb564d25a9085e5bb9fdfa277a877278ab8055c502699f3a2b9430280a035046
3
+ metadata.gz: be6683e9fefe9666fb294e9939f5ebd83c71915307002dc6425413dfd1d9ae8b
4
+ data.tar.gz: d4782c2269b36dd950b7567c88d554c7b000cc81452f79e6659d4061135c1ebe
5
5
  SHA512:
6
- metadata.gz: d25221ebda9c465da1f09740b10779fd4f4a12886d2c5b87c4096eeb9c3ef3076180e3365140ce8d5ff28afc6709445efae4b7ec8b9fdbae2317d8f4cf5a9ba1
7
- data.tar.gz: d186b5ead7789373d0a3da5edb8ea11f4f2518e4fdd766c27a79adf315b830cfd95ae3f381543c55b02ba0f3da6ab3431394adcb99949d26b97dcda719de7eee
6
+ metadata.gz: d027d46289c6ea5bfba7359ff5c0b8172ea7d12d5d9cd1019a428b7b74416e6562930db5ce14508198937caed55ac2b5f1c68f1ce34c82fbe6ecbf3a92ea7100
7
+ data.tar.gz: 6d336b581f1bb93db017414b7080e038557200909e8a87b3a23c37fce4dfdd62b9fc5186c45272e662002f073c00a800f172488495b9bf84cd91d0a9089e275c
data/.github/FUNDING.yml CHANGED
@@ -1,5 +1,2 @@
1
- # These are supported funding model platforms
2
-
3
- github: alteral
4
- ko_fi: alteral
5
1
  custom: [ 'https://revolut.me/alteral', 'https://paypal.me/aapesotskiy' ]
2
+ ko_fi: alteral
@@ -0,0 +1,38 @@
1
+ name: Test
2
+
3
+ on:
4
+ push:
5
+ branches:
6
+ - main
7
+ - develop
8
+
9
+ pull_request:
10
+ types: [opened, synchronize]
11
+
12
+ jobs:
13
+ chat:
14
+ name: Automated Code Review
15
+ runs-on: macos-12
16
+ timeout-minutes: 30
17
+ env:
18
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
19
+ SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}
20
+ steps:
21
+ - uses: actions/checkout@v3.2.0
22
+
23
+ - uses: actions/setup-python@v4.4.0
24
+ with:
25
+ python-version: 3.11
26
+ cache: 'pip'
27
+
28
+ - run: bundle install
29
+
30
+ - run: brew install sonar-scanner
31
+
32
+ - run: brew install facebook/fb/idb-companion
33
+
34
+ - run: pip install -r requirements.txt
35
+
36
+ - run: bundle exec fastlane code_review
37
+
38
+ - run: bundle exec fastlane sonar_upload
data/README.md CHANGED
@@ -1,36 +1,99 @@
1
- *xcmonkey* is a tool for doing randomised UI testing of iOS apps 🐒
1
+ <p align="center">
2
+ <img src="/assets/images/xcmonkey.png"/>
3
+ </p>
4
+
5
+ <p align="center">
6
+ <a href="https://github.com/alteral/xcmonkey/actions"><img src="https://github.com/alteral/xcmonkey/actions/workflows/test.yml/badge.svg" /></a>
7
+ <a href="https://sonarcloud.io/summary/new_code?id=alteral_xcmonkey"><img src="https://sonarcloud.io/api/project_badges/measure?project=alteral_xcmonkey&metric=coverage" /></a>
8
+ <a href="https://rubygems.org/gems/xcmonkey"><img src="https://img.shields.io/gem/v/xcmonkey.svg?style=flat" /></a>
9
+ <a href="/LICENSE"><img src="https://img.shields.io/badge/license-MIT-green.svg?style=flat" /></a>
10
+ </p>
11
+
12
+ ## Description
13
+
14
+ *xcmonkey* is a tool for doing randomised UI testing of iOS apps.
15
+
16
+ It is inspired by and has similar goals to Android [monkey](https://developer.android.com/studio/test/monkey).
17
+
18
+ *xcmonkey* uses [idb](https://fbidb.io) as a driver that's why it's quite smart and can do a lot of things, such as taps, swipes and presses. Because *xcmonkey* has access to the screen hierarchy, it can either do things blindly (like tapping on random points) or precisely (like tapping on the existing elements).
2
19
 
3
20
  ## Requirements
4
21
 
5
22
  ```bash
6
- brew tap facebook/fb
7
- brew install idb-companion
23
+ brew install facebook/fb/idb-companion
24
+ pip3.6 install fb-idb
8
25
  ```
9
26
 
10
27
  ## Installation
11
28
 
12
29
  ```bash
13
- brew install xcmonkey
30
+ gem install xcmonkey
14
31
  ```
15
32
 
16
- or
33
+ If you prefer to use [bundler](https://bundler.io/), add the following line to your `Gemfile`:
17
34
 
18
- ```bash
19
- gem install xcmonkey
35
+ ```ruby
36
+ gem 'xcmonkey'
20
37
  ```
21
38
 
22
39
  ## Usage
23
40
 
24
- ### Test
41
+ ### To run a stress test
25
42
 
26
43
  ```bash
27
- xcmonkey test --udid "30694803-2018-460F-BBA6-97D7911A1AC0" --bundle-id "com.example.app"
44
+ $ xcmonkey test --udid "413EA256-CFFB-4312-94A6-12592BEE4CBA" --bundle-id "com.apple.Maps" --duration 100
45
+ 12:44:19.343: Device info: iPhone 14 Pro | 413EA256-CFFB-4312-94A6-12592BEE4CBA | Booted | simulator | iOS 16.2 | x86_64 | /tmp/idb/413EA256-CFFB-4312-94A6-12592BEE4CBA_companion.sock
46
+
47
+ 12:44:22.550: App info: com.apple.Maps | Maps | system | arm64, x86_64 | Running | Not Debuggable | pid=74636
48
+
49
+ 12:44:23.203: Tap: {
50
+ "x": 53,
51
+ "y": 749
52
+ }
53
+
54
+ 12:44:23.511: Swipe (0.5s): {
55
+ "x": 196,
56
+ "y": 426
57
+ } => {
58
+ "x": 143,
59
+ "y": 447
60
+ }
61
+
62
+ 12:44:24.355: Press (1.2s): {
63
+ "x": 143,
64
+ "y": 323
65
+ }
28
66
  ```
29
67
 
30
- ### Describe point
68
+ ### To describe the required point
31
69
 
32
70
  ```bash
33
- xcmonkey describe -x 10 -y 10 --udid "20694801-2018-460F-BBA6-97D7911A1AC0"
71
+ $ xcmonkey describe -x 20 -y 625 --udid "413EA256-CFFB-4312-94A6-12592BEE4CBA"
72
+ 20:05:20.212: Device info: iPhone 14 Pro | 413EA256-CFFB-4312-94A6-12592BEE4CBA | Booted | simulator | iOS 16.2 | x86_64 | /tmp/idb/413EA256-CFFB-4312-94A6-12592BEE4CBA_companion.sock
73
+
74
+ 20:05:21.713: x:20 y:625 point info: {
75
+ "AXFrame": "{{19, 624.33333333333337}, {86, 130.66666666666663}}",
76
+ "AXUniqueId": "ShortcutsRowCell",
77
+ "frame": {
78
+ "y": 624.3333333333334,
79
+ "x": 19,
80
+ "width": 86,
81
+ "height": 130.66666666666663
82
+ },
83
+ "role_description": "button",
84
+ "AXLabel": "Home",
85
+ "content_required": false,
86
+ "type": "Button",
87
+ "title": null,
88
+ "help": null,
89
+ "custom_actions": [
90
+
91
+ ],
92
+ "AXValue": "Add",
93
+ "enabled": true,
94
+ "role": "AXButton",
95
+ "subrole": null
96
+ }
34
97
  ```
35
98
 
36
99
  ## Code of Conduct
Binary file
data/fastlane/Fastfile CHANGED
@@ -20,6 +20,34 @@ lane :code_review do
20
20
  sh('bundle exec rake')
21
21
  end
22
22
 
23
+ lane :sonar_upload do
24
+ update_simplecov_report
25
+ sonar_options =
26
+ if ENV['GITHUB_EVENT_NAME'] == 'pull_request'
27
+ {
28
+ sonar_login: ENV.fetch('SONAR_TOKEN', nil),
29
+ pull_request_branch: ENV.fetch('GITHUB_HEAD_REF', nil),
30
+ pull_request_base: ENV.fetch('GITHUB_BASE_REF', nil),
31
+ pull_request_key: ENV.fetch('PR_NUMBER', nil)
32
+ }
33
+ else
34
+ {
35
+ sonar_login: ENV.fetch('SONAR_TOKEN', nil),
36
+ branch_name: ENV['BRANCH_NAME'] || git_branch,
37
+ project_version: version
38
+ }
39
+ end
40
+
41
+ sonar(sonar_options)
42
+ end
43
+
44
+ private_lane :update_simplecov_report do
45
+ coverage = JSON.parse(File.read('../coverage/.resultset.json'))["RSpec"]["coverage"]
46
+ transformed_values = coverage.transform_values { |l| l["lines"] }
47
+ new_format = { "RSpec" => { "coverage" => transformed_values, "timestamp" => Time.now.to_i } }
48
+ File.write('../coverage/.sonar.json', JSON.pretty_generate(new_format))
49
+ end
50
+
23
51
  def version
24
52
  version_path = '../lib/xcmonkey/version.rb'
25
53
  File.read(version_path).scan(/\d+/).join('.')
@@ -18,20 +18,34 @@ class Driver
18
18
  when :precise_tap
19
19
  tap(coordinates: el1_coordinates)
20
20
  when :blind_tap
21
- x = (el1_coordinates[:x] - el2_coordinates[:x]).abs
22
- y = (el1_coordinates[:y] - el2_coordinates[:y]).abs
23
- tap(coordinates: { x: x, y: y })
24
- when :swipe
25
- swipe(start_coordinates: el1_coordinates, end_coordinates: el2_coordinates)
21
+ tap(coordinates: random_coordinates)
22
+ when :precise_press
23
+ press(coordinates: el1_coordinates, duration: press_duration)
24
+ when :blind_press
25
+ press(coordinates: random_coordinates, duration: press_duration)
26
+ when :precise_swipe
27
+ swipe(
28
+ start_coordinates: el1_coordinates,
29
+ end_coordinates: el2_coordinates,
30
+ duration: swipe_duration
31
+ )
32
+ when :blind_swipe
33
+ swipe(
34
+ start_coordinates: random_coordinates,
35
+ end_coordinates: random_coordinates,
36
+ duration: swipe_duration
37
+ )
38
+ else
39
+ next
26
40
  end
27
41
  app_elements = describe_ui.shuffle
28
42
  Logger.error('App lost') if app_elements.include?(@home_tracker)
29
43
  end
30
44
  end
31
45
 
32
- def open_home_screen(return_tracker: false)
46
+ def open_home_screen(with_tracker: false)
33
47
  `idb ui button --udid #{udid} HOME`
34
- detect_home_unique_element if return_tracker
48
+ detect_home_unique_element if with_tracker
35
49
  end
36
50
 
37
51
  def describe_ui
@@ -46,6 +60,7 @@ class Driver
46
60
 
47
61
  def launch_app
48
62
  `idb launch --udid #{udid} #{bundle_id}`
63
+ wait_until_app_launched
49
64
  end
50
65
 
51
66
  def terminate_app
@@ -54,7 +69,7 @@ class Driver
54
69
 
55
70
  def boot_simulator
56
71
  `idb boot #{udid}`
57
- ensure_simulator_was_booted
72
+ Logger.error("Failed to boot #{udid}") if device_info['state'] != 'Booted'
58
73
  end
59
74
 
60
75
  def shutdown_simulator
@@ -81,11 +96,6 @@ class Driver
81
96
  boot_simulator if device.include?('simulator')
82
97
  end
83
98
 
84
- def ensure_simulator_was_booted
85
- sim = list_booted_simulators.detect { |target| target.include?(udid) }
86
- Logger.error("Failed to boot #{udid}") if sim.nil?
87
- end
88
-
89
99
  def list_apps
90
100
  `idb list-apps --udid #{udid}`
91
101
  end
@@ -95,20 +105,58 @@ class Driver
95
105
  `idb ui tap --udid #{udid} #{coordinates[:x]} #{coordinates[:y]}`
96
106
  end
97
107
 
98
- def swipe(start_coordinates:, end_coordinates:)
99
- Logger.info('Swipe:', payload: "#{JSON.pretty_generate(start_coordinates)} => #{JSON.pretty_generate(end_coordinates)}")
108
+ def press(coordinates:, duration:)
109
+ Logger.info("Press (#{duration}s):", payload: JSON.pretty_generate(coordinates))
110
+ `idb ui tap --udid #{udid} --duration #{duration} #{coordinates[:x]} #{coordinates[:y]}`
111
+ end
112
+
113
+ def swipe(start_coordinates:, end_coordinates:, duration:)
114
+ Logger.info(
115
+ "Swipe (#{duration}s):",
116
+ payload: "#{JSON.pretty_generate(start_coordinates)} => #{JSON.pretty_generate(end_coordinates)}"
117
+ )
100
118
  coordinates = "#{start_coordinates[:x]} #{start_coordinates[:y]} #{end_coordinates[:x]} #{end_coordinates[:y]}"
101
- `idb ui swipe --udid #{udid} --duration 0.5 #{coordinates}`
119
+ `idb ui swipe --udid #{udid} --duration #{duration} #{coordinates}`
102
120
  end
103
121
 
104
122
  def central_coordinates(element)
105
123
  frame = element['frame']
124
+ x = (frame['x'] + (frame['width'] / 2)).abs.to_i
125
+ y = (frame['y'] + (frame['height'] / 2)).abs.to_i
126
+ {
127
+ x: x > screen_size[:width].to_i ? rand(0..screen_size[:width].to_i) : x,
128
+ y: y > screen_size[:height].to_i ? rand(0..screen_size[:height].to_i) : y
129
+ }
130
+ end
131
+
132
+ def random_coordinates
106
133
  {
107
- x: (frame['x'] + (frame['width'] / 2)).to_i,
108
- y: (frame['y'] + (frame['height'] / 2)).to_i
134
+ x: rand(0..screen_size[:width].to_i),
135
+ y: rand(0..screen_size[:height].to_i)
109
136
  }
110
137
  end
111
138
 
139
+ def device_info
140
+ @device_info ||= JSON.parse(`idb describe --udid #{udid} --json`)
141
+ @device_info
142
+ end
143
+
144
+ def screen_size
145
+ screen_dimensions = device_info['screen_dimensions']
146
+ {
147
+ width: screen_dimensions['width_points'],
148
+ height: screen_dimensions['height_points']
149
+ }
150
+ end
151
+
152
+ def swipe_duration
153
+ rand(0.1..0.7).ceil(1)
154
+ end
155
+
156
+ def press_duration
157
+ rand(0.5..1.5).ceil(1)
158
+ end
159
+
112
160
  private
113
161
 
114
162
  def ensure_driver_installed
@@ -122,4 +170,16 @@ class Driver
122
170
  end
123
171
  @home_tracker
124
172
  end
173
+
174
+ def wait_until_app_launched
175
+ app_info = nil
176
+ current_time = Time.now
177
+ while app_info.nil? && Time.now < current_time + 5
178
+ app_info = list_apps.split("\n").detect do |app|
179
+ app =~ /#{bundle_id}.*Running/
180
+ end
181
+ end
182
+ Logger.error("Can't run the app #{bundle_id}") if app_info.nil?
183
+ Logger.info('App info:', payload: app_info)
184
+ end
125
185
  end
@@ -1,4 +1,4 @@
1
1
  module Xcmonkey
2
- VERSION = '0.1.1'
2
+ VERSION = '0.2.0'
3
3
  GEM_NAME = 'xcmonkey'
4
4
  end
data/lib/xcmonkey.rb CHANGED
@@ -21,13 +21,16 @@ module Xcmonkey
21
21
  driver.ensure_device_exists
22
22
  driver.ensure_app_installed
23
23
  driver.terminate_app
24
- driver.open_home_screen(return_tracker: true)
24
+ driver.open_home_screen(with_tracker: true)
25
25
  driver.launch_app
26
26
  driver.monkey_test(gestures)
27
27
  end
28
28
 
29
29
  def gestures
30
- [:precise_tap, :blind_tap, :swipe]
30
+ taps = [:precise_tap, :blind_tap] * 10
31
+ swipes = [:precise_swipe, :blind_swipe] * 5
32
+ presses = [:precise_press, :blind_press]
33
+ taps + swipes + presses
31
34
  end
32
35
 
33
36
  def ensure_required_params(params)
data/requirements.txt ADDED
@@ -0,0 +1 @@
1
+ fb-idb
@@ -0,0 +1,11 @@
1
+ sonar.projectKey=alteral_xcmonkey
2
+ sonar.projectName=xcmonkey
3
+ sonar.host.url=https://sonarcloud.io
4
+ sonar.organization=alteral
5
+ sonar.ruby.coverage.reportPaths=coverage/.sonar.json
6
+ sonar.ruby.coverage.framework=RSpec
7
+ sonar.sources=lib/
8
+ sonar.inclusions=lib/**/*.rb
9
+ sonar.exclusions=lib/**/version.rb
10
+ sonar.tests=spec/
11
+ sonar.test.inclusions=spec/*_spec.rb
data/spec/driver_spec.rb CHANGED
@@ -6,8 +6,7 @@ describe Driver do
6
6
  it 'verifies that sumulator was booted' do
7
7
  error_message = "Failed to boot #{udid}"
8
8
  expect(Logger).not_to receive(:error).with(error_message, payload: nil)
9
- expect(driver).to receive(:ensure_simulator_was_booted)
10
- driver.boot_simulator
9
+ expect { driver.boot_simulator }.not_to raise_error
11
10
  end
12
11
 
13
12
  it 'verifies that there are booted simulators' do
@@ -24,10 +23,16 @@ describe Driver do
24
23
 
25
24
  it 'verifies that home screen can be opened' do
26
25
  driver.boot_simulator
27
- home_tracker = driver.open_home_screen(return_tracker: true)
26
+ home_tracker = driver.open_home_screen(with_tracker: true)
28
27
  expect(home_tracker).not_to be_empty
29
28
  end
30
29
 
30
+ it 'verifies that home screen can be opened without tracker' do
31
+ driver.boot_simulator
32
+ home_tracker = driver.open_home_screen(with_tracker: false)
33
+ expect(home_tracker).to be_nil
34
+ end
35
+
31
36
  it 'verifies that list of targets can be showed' do
32
37
  list_targets = driver.list_targets
33
38
  expect(list_targets).not_to be_empty
@@ -85,10 +90,75 @@ describe Driver do
85
90
  expect(actual_coordinates).to eq(expected_coordinates)
86
91
  end
87
92
 
93
+ it 'verifies that device info can be for booted simulator' do
94
+ driver.boot_simulator
95
+ expect(driver.device_info).not_to be_empty
96
+ end
97
+
98
+ it 'verifies that device info can be for not booted simulator' do
99
+ driver.shutdown_simulator
100
+ expect(driver.device_info).not_to be_empty
101
+ end
102
+
103
+ it 'verifies that screen size can be found' do
104
+ driver.boot_simulator
105
+ screen_size = driver.screen_size
106
+ expect(screen_size[:width]).to be > 0
107
+ expect(screen_size[:height]).to be > 0
108
+ end
109
+
110
+ it 'verifies that random coordinates can be found' do
111
+ driver.boot_simulator
112
+ coordinates = driver.random_coordinates
113
+ expect(coordinates[:x]).to be > 0
114
+ expect(coordinates[:y]).to be > 0
115
+ end
116
+
117
+ it 'verifies swipe duration' do
118
+ expect(driver.swipe_duration).to be_between(0.1, 0.7)
119
+ end
120
+
121
+ it 'verifies press duration' do
122
+ expect(driver.press_duration).to be_between(0.5, 1.5)
123
+ end
124
+
125
+ it 'verifies that app can be launched' do
126
+ expect(Logger).not_to receive(:error)
127
+ expect(Logger).to receive(:info)
128
+ driver.boot_simulator
129
+ driver.terminate_app
130
+ expect { driver.launch_app }.not_to raise_error
131
+ end
132
+
133
+ it 'verifies tap' do
134
+ driver.boot_simulator
135
+ coordinates = { x: 1, y: 1 }
136
+ expect(Logger).to receive(:info).with('Tap:', payload: JSON.pretty_generate(coordinates))
137
+ driver.tap(coordinates: coordinates)
138
+ end
139
+
140
+ it 'verifies press' do
141
+ driver.boot_simulator
142
+ duration = 0.5
143
+ coordinates = { x: 1, y: 1 }
144
+ expect(Logger).to receive(:info).with("Press (#{duration}s):", payload: JSON.pretty_generate(coordinates))
145
+ driver.press(coordinates: coordinates, duration: duration)
146
+ end
147
+
148
+ it 'verifies swipe' do
149
+ driver.boot_simulator
150
+ duration = 0.5
151
+ start_coordinates = { x: 1, y: 1 }
152
+ end_coordinates = { x: 2, y: 2 }
153
+ expect(Logger).to receive(:info).with("Swipe (#{duration}s):", payload: "#{JSON.pretty_generate(start_coordinates)} => #{JSON.pretty_generate(end_coordinates)}")
154
+ driver.swipe(start_coordinates: start_coordinates, end_coordinates: end_coordinates, duration: duration)
155
+ end
156
+
88
157
  it 'verifies that simulator was not booted' do
89
158
  driver.shutdown_simulator
90
159
  error_message = "Failed to boot #{udid}"
160
+ allow(driver).to receive(:device_info).and_return({ 'state' => 'Unknown' })
91
161
  expect(Logger).to receive(:log).with(error_message, color: :light_red, payload: nil)
92
- expect { driver.ensure_simulator_was_booted }.to raise_error(SystemExit) { |e| expect(e.status).to eq(1) }
162
+ expect { driver.boot_simulator }.to raise_error(SystemExit) { |e| expect(e.status).to eq(1) }
93
163
  end
94
164
  end
data/spec/logger_spec.rb CHANGED
@@ -33,4 +33,24 @@ describe Logger do
33
33
  expect { described_class.error(message, payload: payload) }
34
34
  .to raise_error(SystemExit) { |e| expect(e.status).to eq(1) }
35
35
  end
36
+
37
+ it 'verifies custom log without payload' do
38
+ color = :blue
39
+ time = Time.now
40
+ allow(Time).to receive(:now).and_return(time)
41
+ expected_output = "#{time.strftime('%k:%M:%S.%L')}: #{message}".colorize(color)
42
+ expect do
43
+ described_class.log(message, color: color, payload: nil)
44
+ end.to output("#{expected_output}\n\n").to_stdout
45
+ end
46
+
47
+ it 'verifies custom log with payload' do
48
+ color = :blue
49
+ time = Time.now
50
+ allow(Time).to receive(:now).and_return(time)
51
+ expected_output = "#{time.strftime('%k:%M:%S.%L')}: #{message}".colorize(color)
52
+ expect do
53
+ described_class.log(message, color: color, payload: payload)
54
+ end.to output("#{expected_output} #{payload.colorize(:light_green)}\n\n").to_stdout
55
+ end
36
56
  end
@@ -5,7 +5,10 @@ describe Xcmonkey do
5
5
 
6
6
  it 'verifies gestures' do
7
7
  gestures = described_class.new(params).gestures
8
- expect(gestures) =~ [:swipe, :precise_tap, :blind_tap]
8
+ taps = [:precise_tap, :blind_tap] * 10
9
+ swipes = [:precise_swipe, :blind_swipe] * 5
10
+ presses = [:precise_press, :blind_press]
11
+ expect(gestures) =~ presses + taps + swipes
9
12
  end
10
13
 
11
14
  it 'verifies required params' do
@@ -42,5 +45,14 @@ describe Xcmonkey do
42
45
  expect(Logger).to receive(:error).with(duration_error_msg)
43
46
  described_class.new(params)
44
47
  end
48
+
49
+ it 'verifies version' do
50
+ current_version = Gem::Version.new(Xcmonkey::VERSION)
51
+ expect(current_version).to be > Gem::Version.new('0.1.0')
52
+ end
53
+
54
+ it 'verifies gem name' do
55
+ expect(Xcmonkey::GEM_NAME).to eq('xcmonkey')
56
+ end
45
57
  end
46
58
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: xcmonkey
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - alteral
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-12-27 00:00:00.000000000 Z
11
+ date: 2022-12-29 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -218,7 +218,7 @@ files:
218
218
  - ".github/FUNDING.yml"
219
219
  - ".github/dependabot.yml"
220
220
  - ".github/pull_request_template.md"
221
- - ".github/workflows/Test.yml"
221
+ - ".github/workflows/test.yml"
222
222
  - ".gitignore"
223
223
  - ".rspec"
224
224
  - ".rubocop.yml"
@@ -227,6 +227,7 @@ files:
227
227
  - LICENSE
228
228
  - README.md
229
229
  - Rakefile
230
+ - assets/images/xcmonkey.png
230
231
  - bin/console
231
232
  - bin/setup
232
233
  - bin/xcmonkey
@@ -236,6 +237,8 @@ files:
236
237
  - lib/xcmonkey/driver.rb
237
238
  - lib/xcmonkey/logger.rb
238
239
  - lib/xcmonkey/version.rb
240
+ - requirements.txt
241
+ - sonar-project.properties
239
242
  - spec/describer_spec.rb
240
243
  - spec/driver_spec.rb
241
244
  - spec/logger_spec.rb
@@ -1,29 +0,0 @@
1
- name: Test
2
-
3
- on:
4
- pull_request:
5
- types: [opened, synchronize]
6
-
7
- jobs:
8
- chat:
9
- name: Checks
10
- timeout-minutes: 15
11
- runs-on: macos-12
12
- steps:
13
- - uses: actions/checkout@v3.1.0
14
- with:
15
- fetch-depth: '0'
16
- - uses: actions/cache@v3
17
- id: bundler-cache
18
- with:
19
- path: vendor/bundle
20
- key: ${{ runner.os }}-gems-${{ hashFiles('**/Gemfile.lock') }}
21
- restore-keys: |
22
- ${{ runner.os }}-gems-
23
- - name: Bundler
24
- run: |
25
- gem install bundler
26
- bundle config path vendor/bundle
27
- bundle check || bundle install --jobs 4 --retry 3
28
- - name: Rubocop
29
- run: bundle exec rake