arduino_ci 1.2.0 → 1.3.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: 95cc7dc7ab0591e45ffe7c1a9cdf31f64b21a8cf794a12ea83a4190af20e7488
4
- data.tar.gz: 6e20b49ad3b015445c79511e9795fddbf205f01e20eb8c413e7ff342f4b240f9
3
+ metadata.gz: c4765de27f7f477f5a64189afba2d70a280d1ae65e64916af6b98aa7d1a0266f
4
+ data.tar.gz: dd3748bdf67dfc526183d5a1372ce06d11b293cbaf984af19b90b999fdf1623e
5
5
  SHA512:
6
- metadata.gz: f40e840a35f788a4e02e0e332b5e7669198214419d9361abf10cc03558028bc691bb16379143b95c258dd2527fb8b03924d3cfb240c3af6b2fac526966b30274
7
- data.tar.gz: bf8dc24b59f479ad858b75450a546ebd5e7bee694e33c8b443d2fa89576fe40fb09dede3c17353b7ca6c9c7dcda921aa7bb3f156c3beb98fd62cc99123c03119
6
+ metadata.gz: ae3f368ed4f543f22a0702df9945abac4df15683f85e7d54c5c958cc60b951453bd21aad19beac73a54257bee558ea172d5c8cbcea69deed3a7b15da0cff0495
7
+ data.tar.gz: b2481e5d6096e6dd6df1aa86efb6465e6f13dc853840fca4ba6044c8dc51b1ac1c8c0196f3c9d49c1412c4e880177a40880346e1bba1d4fb7cc4967468f192f7
data/README.md CHANGED
@@ -1,14 +1,14 @@
1
1
 
2
2
  # ArduinoCI Ruby gem (`arduino_ci`)
3
3
  [![Gem Version](https://badge.fury.io/rb/arduino_ci.svg)](https://rubygems.org/gems/arduino_ci)
4
- [![Documentation](http://img.shields.io/badge/docs-rdoc.info-blue.svg)](http://www.rubydoc.info/gems/arduino_ci/1.2.0)
4
+ [![Documentation](http://img.shields.io/badge/docs-rdoc.info-blue.svg)](http://www.rubydoc.info/gems/arduino_ci/1.3.0)
5
5
  [![Gitter](https://badges.gitter.im/Arduino-CI/arduino_ci.svg)](https://gitter.im/Arduino-CI/arduino_ci?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge)
6
6
  [![GitHub Marketplace](https://img.shields.io/badge/Get_it-on_Marketplace-informational.svg)](https://github.com/marketplace/actions/arduino_ci)
7
7
 
8
8
  Arduino CI was created to enable better collaboration among Arduino library maintainers and contributors, by enabling automated code checks to be performed as part of a pull request process.
9
9
 
10
10
  * enables running unit tests against the library **without hardware present**
11
- * provides a system of mocks that allow fine-grained control over the hardare inputs, including the system's clock
11
+ * provides a system of mocks that allow fine-grained control over the hardware inputs, including the system's clock
12
12
  * verifies compilation of any example sketches included in the library
13
13
  * can test a wide range of arduino boards with different hardware options available
14
14
  * compares entries in `library.properties` to the contents of the library and reports mismatches
@@ -29,69 +29,91 @@ Windows | [![Windows Build status](https://github.com/Arduino-CI/arduino_ci/wor
29
29
 
30
30
  ## Quick Start
31
31
 
32
- ### You Need Your Arduino Library
32
+ This project has the following dependencies:
33
33
 
34
- For a fairly minimal practical example of a unit-testable library repo that you can copy from, see [the `Arduino-CI/Blink` repository](https://github.com/Arduino-CI/Blink).
34
+ * `ruby` 2.5 or higher
35
+ * A compiler like `g++` (on OSX, `clang` works; on Cygwin, use the `mingw-gcc-c++` package)
36
+ * `python` (if using a board architecutre that requires it, e.g. ESP32, ESP8266; see [this issue](https://github.com/Arduino-CI/arduino_ci/issues/235#issuecomment-739629243)). Consider `pyserial` as well.
37
+
38
+ In that environment, you can install by running `gem install arduino_ci`. To update to a latest version, use `gem update arduino_ci`.
39
+
40
+ You can now test your library by simply running the command `arduino_ci.rb` from your library directory. This will perform the following:
35
41
 
36
- > Note: The `SampleProjects` directory you see within _this_ repo contains tests for validing the `arduino_ci` framework itself, and due to that coupling will not be helpful to duplicate. That said, the [SampleProjects/TestSomething](SampleProjects/TestSomething) project contains [test files](SampleProjects/TestSomething/test/) (each named after the type of feature being tested) that may be illustrative of testing strategy and capabilities _on an individual basis_.
42
+ * validation of some fields in `library.properties`, if it exists
43
+ * running unit tests from files found in `test/`, if they exist
44
+ * testing compilation of example sketches found in `examples/`, if they exist
45
+
46
+ ### Assumptions About Your Repository
37
47
 
38
48
  Arduino expects all libraries to be in a specific `Arduino/libraries` directory on your system. If your library is elsewhere, `arduino_ci` will _automatically_ create a symbolic link in the `libraries` directory that points to the directory of the project being tested. This simplifieds working with project dependencies, but **it can have unintended consequences on Windows systems**.
39
49
 
40
50
  > If you use a Windows system **it is recommended that you only run `arduino_ci` from project directories that are already inside the `libraries` directory** because [in some cases deleting a folder that contains a symbolic link to another folder can cause the _entire linked folder_ to be removed instead of just the link itself](https://superuser.com/a/306618).
41
51
 
52
+ ### Changes to Your Repository
42
53
 
43
- ### You Need Ruby and Bundler
44
-
45
- You'll need Ruby version 2.5 or higher, and to `gem install bundler` if it's not already there.
54
+ Unit testing binaries created by `arduino_ci` should not be commited to the codebase. To avoid that, add the following to your `.gitignore`:
46
55
 
56
+ ```ignore-list
57
+ # arduino_ci unit test binaries and artifacts
58
+ *.bin
59
+ *.bin.dSYM
60
+ ```
47
61
 
48
- ### You Need A Compiler (`g++`)
62
+ ### A Quick Example
49
63
 
50
- For unit testing, you will need a compiler; [g++](https://gcc.gnu.org/) is preferred.
64
+ For a fairly minimal practical example of a unit-testable library repo that you can copy from, see [the `Arduino-CI/Blink` repository](https://github.com/Arduino-CI/Blink).
51
65
 
52
- * **Linux**: `gcc`/`g++` is likely pre-installed.
53
- * **OSX**: `g++` is an alias for `clang`, which is provided by Xcode and the developer tools. You are free to `brew install gcc` as well; this is also tested and working.
54
- * **Windows**: you will need Cygwin, and the `mingw-gcc-g++` package.
55
66
 
67
+ ## Advanced Start
56
68
 
57
- ### You _May_ Need `python`
69
+ New features and bugfixes reach GitHub before they reach a released ruby gem. Alternately, it may be that (for your own reasons) you do not wish to install `arduino_ci` globally on your system. A few additional setup steps are required if you wish to do this.
58
70
 
59
- ESP32 and ESP8266 boards have [a dependency on `python` that they don't install themselves](https://github.com/Arduino-CI/arduino_ci/issues/235#issuecomment-739629243). If you intend to test on these platforms (which are included in the default list of platforms to test against), you will need to make `python` (and possibly `pyserial`) available in the test environment.
71
+ ### You Need Ruby _and_ Bundler
60
72
 
61
- Alternately, you might configure `arduino_ci` to simply not test against these. Consult the reference for those details.
73
+ In addition to version 2.5 or higher, you'll also need to `gem install bundler` to a minimum of version 2.0 if it's not already there. You may find it easiest to do this by using [`rbenv`](https://github.com/rbenv/rbenv).
62
74
 
75
+ You will need to add a file called `Gemfile` (no extension) to your Arduino project.
63
76
 
64
- ### Changes to Your Repo
77
+ #### Non-root installation
65
78
 
66
- Add a file called `Gemfile` (no extension) to your Arduino project:
79
+ If you are simply trying to avoid the need to install `arduino_ci` system-wide (which may require administrator permissions), your `Gemfile` would look like this:
67
80
 
68
81
  ```ruby
69
82
  source 'https://rubygems.org'
70
- gem 'arduino_ci' '~> 1.1'
83
+
84
+ # Replace 1.2 with the desired version of arduino_ci. See https://guides.rubygems.org/patterns/#pessimistic-version-constraint
85
+ gem 'arduino_ci', '~> 1.2'
71
86
  ```
72
87
 
73
- At the time of this writing, `1.1` is the latest version available, and the `~>` syntax will allow your system to update it to the latest `1.x.x` version. The list of all available versions can be found on [rubygems.org](https://rubygems.org/gems/arduino_ci) if you prefer to explicitly pin a higher version.
88
+ It would also make sense to add the following to your `.gitignore`:
89
+ ```ignore-list
90
+ /.bundle/
91
+ vendor
92
+ ```
93
+
94
+ > Note: this used to be the recommended installation method, but with the library's maturation it's better to avoid the use of `Gemfile` and `bundle install` by just installing as per the "Quick Start" instructions above.
95
+
74
96
 
75
- It would also make sense to add the following to your `.gitignore`, or copy [the `.gitignore` used by this project](.gitignore):
97
+ #### Using the latest-available code
98
+
99
+ If you want to use the latest code on GitHub, your `Gemfile` would look like this:
100
+
101
+ ```ruby
102
+ source 'https://rubygems.org'
76
103
 
104
+ # to use the latest github code in a given repo and branch, replace the below values for git: and ref: as needed
105
+ gem 'arduino_ci', git: 'https://github.com/ArduinoCI/arduino_ci.git', ref: '<your desired ref, branch, or tag>'
77
106
  ```
78
- /.bundle/
79
- /.yardoc
80
- Gemfile.lock
81
- /_yardoc/
82
- /coverage/
83
- /doc/
84
- /pkg/
85
- /spec/reports/
86
- vendor
87
- *.gem
88
107
 
89
- # rspec failure tracking
90
- .rspec_status
91
108
 
92
- # C++ stuff
93
- *.bin
94
- *.bin.dSYM
109
+ #### Using a version of `arduino_ci` source code on your local machine
110
+
111
+ First, Thanks! See [CONTRIBUTING.md](CONTRIBUTING.md). Your `Gemfile` would look like this:
112
+
113
+ ```ruby
114
+ source 'https://rubygems.org'
115
+
116
+ gem 'arduino_ci', path: '/path/to/development/dir/for/arduino_ci'
95
117
  ```
96
118
 
97
119
 
@@ -103,17 +125,18 @@ $ bundle install # adds packages to global library (may require admin rights)
103
125
  $ bundle install --path vendor/bundle # adds packages to local library
104
126
  ```
105
127
 
128
+ This will create a `Gemfile.lock` in your project directory, which you may optionally check into source control. A broader introduction to ruby dependencies is outside the scope of this document.
106
129
 
107
- ### Running tests
130
+
131
+
132
+ ### Running `arduino_ci.rb` To Test Your Library
108
133
 
109
134
  With that installed, just the following shell command each time you want the tests to execute:
110
135
 
111
- ```
136
+ ```console
112
137
  $ bundle exec arduino_ci.rb
113
138
  ```
114
139
 
115
- `arduino_ci.rb` is the main entry point for this library. This command will iterate over all the library's `examples/` and attempt to compile them. If you set up unit tests, it will run those as well.
116
-
117
140
 
118
141
  ### Reference
119
142
 
@@ -128,18 +151,14 @@ For more information on the usage of `arduino_ci.rb`, see [REFERENCE.md](REFEREN
128
151
 
129
152
  ## Setting up Pull Request Testing and/or External CI
130
153
 
131
- The following prerequisites must be fulfilled:
132
-
133
- * A GitHub (or other repository-hosting) project for your library
134
- * A CI system like [Travis CI](https://travis-ci.org/) or [Appveyor](https://www.appveyor.com/) that is linked to your project
135
-
154
+ > **Note:** `arduino_ci.rb` expects to be run from the root directory of your Arduino project library.
136
155
 
137
- ### Testing with remote CI
156
+ ### Arduino CI's Own GitHub action
138
157
 
139
- > **Note:** `arduino_ci.rb` expects to be run from the root directory of your Arduino project library.
158
+ [![GitHub Marketplace](https://img.shields.io/badge/Get_it-on_Marketplace-informational.svg)](https://github.com/marketplace/actions/arduino_ci)
140
159
 
141
160
 
142
- #### GitHub Actions
161
+ ### Your Own Scripted GitHub Action
143
162
 
144
163
  GitHub Actions allows you to automate your workflows directly in GitHub.
145
164
  No additional steps are needed.
@@ -156,12 +175,12 @@ jobs:
156
175
  with:
157
176
  ruby-version: 2.6
158
177
  - run: |
159
- bundle install
160
- bundle exec arduino_ci_remote.rb
178
+ gem install arduino_ci
179
+ arduino_ci.rb
161
180
  ```
162
181
 
163
182
 
164
- #### Travis CI
183
+ ### Travis CI
165
184
 
166
185
  You'll need to go to https://travis-ci.org/profile/ and enable testing for your Arduino project. Once that happens, you should be all set. The script will test all example projects of the library and all unit tests.
167
186
 
@@ -171,12 +190,12 @@ Next, you need this in `.travis.yml` in your repo
171
190
  sudo: false
172
191
  language: ruby
173
192
  script:
174
- - bundle install
175
- - bundle exec arduino_ci.rb
193
+ - gem install arduino_ci
194
+ - arduino_ci.rb
176
195
  ```
177
196
 
178
197
 
179
- #### Appveyor CI
198
+ ### Appveyor CI
180
199
 
181
200
  You'll need to go to https://ci.appveyor.com/projects and add your project.
182
201
 
@@ -185,8 +204,8 @@ Next, you'll need this in `appveyor.yml` in your repo.
185
204
  ```yaml
186
205
  build: off
187
206
  test_script:
188
- - bundle install
189
- - bundle exec arduino_ci.rb
207
+ - gem install arduino_ci
208
+ - arduino_ci.rb
190
209
  ```
191
210
 
192
211
 
@@ -46,7 +46,7 @@ This allows a file (or glob) pattern to be executed in your tests directory, cre
46
46
 
47
47
  ### `CUSTOM_INIT_SCRIPT` environment variable
48
48
 
49
- If set, testing will execute (using `/bin/sh`) the script referred to by this variable -- relative to the current working directory. This enables use cases like the GitHub action to install custom library versions (i.e. a version of a library that is different than what the library manager would automatically install by name) prior to CI test runs.
49
+ If set, testing will execute (using `/bin/sh`) the script referred to by this variable -- relative to the current working directory (i.e. the root directory of the library). The script will _run_ in the Arduino Libraries directory (changing to the Libraries directory, running the script, and returning to the individual library root afterward). This enables use cases like the GitHub action to install custom library versions (i.e. a version of a library that is different than what the library manager would automatically install by name) prior to CI test runs.
50
50
 
51
51
 
52
52
  ### `USE_SUBDIR` environment variable
@@ -64,11 +64,6 @@ If set, testing will fail if no unit test files are detected (or if the director
64
64
  If set, testing will fail if no example sketches are detected. This is to avoid communicating a passing status in cases where a commit may have accidentally moved or deleted the examples.
65
65
 
66
66
 
67
- ### `SKIP_LIBRARY_PROPERTIES` environment variable
68
-
69
- If set, testing will skip validating `library.properties` entries. This is to work around any possible bugs in `arduino_ci`'s interpretation of what is "correct".
70
-
71
-
72
67
  ## Indirectly Overriding Build Behavior (medium term use), and Advanced Options
73
68
 
74
69
  For build behavior that you'd like to persist across commits (e.g. defining the set of platforms to test against, disabling a test that you expect to re-enable at some future point), a special configuration file called `.arduino-ci.yml` can be used. There are 3 places you can put them:
@@ -9,7 +9,6 @@ VAR_CUSTOM_INIT_SCRIPT = "CUSTOM_INIT_SCRIPT".freeze
9
9
  VAR_USE_SUBDIR = "USE_SUBDIR".freeze
10
10
  VAR_EXPECT_EXAMPLES = "EXPECT_EXAMPLES".freeze
11
11
  VAR_EXPECT_UNITTESTS = "EXPECT_UNITTESTS".freeze
12
- VAR_SKIP_LIBPROPS = "SKIP_LIBRARY_PROPERTIES".freeze
13
12
 
14
13
  @failure_count = 0
15
14
  @passfail = proc { |result| result ? "✓" : "✗" }
@@ -22,7 +21,6 @@ class Parser
22
21
  output_options = {
23
22
  skip_unittests: false,
24
23
  skip_compilation: false,
25
- skip_library_properties: false,
26
24
  ci_config: {
27
25
  "unittest" => unit_config
28
26
  },
@@ -39,10 +37,6 @@ class Parser
39
37
  output_options[:skip_compilation] = p
40
38
  end
41
39
 
42
- opts.on("--skip-library-properties", "Don't validate library.properties entries") do |p|
43
- output_options[:skip_compilation] = p
44
- end
45
-
46
40
  opts.on("--testfile-select=GLOB", "Unit test file (or glob) to select") do |p|
47
41
  unit_config["testfiles"] ||= {}
48
42
  unit_config["testfiles"]["select"] ||= []
@@ -154,10 +148,32 @@ def inform_multiline(message, &block)
154
148
  perform_action(message, true, nil, nil, false, false, &block)
155
149
  end
156
150
 
151
+ def rule(char)
152
+ puts char[0] * WIDTH
153
+ end
154
+
157
155
  def warn(message)
158
156
  inform("WARNING") { message }
159
157
  end
160
158
 
159
+ def phase(name)
160
+ puts
161
+ rule("=")
162
+ inform("Beginning the next phase of testing") { name }
163
+ end
164
+
165
+ def banner
166
+ art = [
167
+ " . __ ___",
168
+ " _, ,_ _| , . * ._ _ / ` | ",
169
+ "(_| [ `(_] (_| | [ ) (_) \\__. _|_ v#{ArduinoCI::VERSION}",
170
+ ]
171
+
172
+ pad = " " * ((WIDTH - art[2].length) / 2)
173
+ art.each { |l| puts "#{pad}#{l}" }
174
+ puts
175
+ end
176
+
161
177
  # Assure that a platform exists and return its definition
162
178
  def assured_platform(purpose, name, config)
163
179
  platform_definition = config.platform_definition(name)
@@ -351,7 +367,7 @@ def choose_platform_set(config, reason, desired_platforms, library_properties)
351
367
  # completely ignore default config, opting for brute-force library matches
352
368
  # OTOH, we don't need to assure platforms because we defined them
353
369
  return inform_multiline("Default config, platforms matching architectures in library.properties") do
354
- supported_platforms.each_key do |p|
370
+ supported_platforms.keys.each do |p| # rubocop:disable Style/HashEachMethods
355
371
  puts " #{p}"
356
372
  end # this returns supported_platforms
357
373
  end
@@ -366,34 +382,9 @@ def choose_platform_set(config, reason, desired_platforms, library_properties)
366
382
  end
367
383
  end
368
384
 
369
- # tests of sane library.properties values
370
- def perform_property_tests(cpp_library)
371
- return inform("Skipping library.properties tests") { "as requested via command line" } if @cli_options[:skip_library_properties]
372
- return inform("Skipping library.properties tests") { "as requested via environment" } unless ENV[VAR_SKIP_LIBPROPS].nil?
373
- return inform("Skipping library.properties tests") { "file not found" } unless cpp_library.library_properties?
374
-
375
- props = cpp_library.library_properties
376
-
377
- props.depends&.each do |l|
378
- assure("library.properties 'depends=' entry '#{l}' is available via the library manager") { @backend.library_available?(l) }
379
- end
380
-
381
- # the IDE would add these entries to a sketch (as "#include <...>" lines), they are nothing to do with the compioler
382
- props.includes&.map(&:strip)&.map(&Pathname::method(:new))&.each do |f|
383
- if (cpp_library.path + f).exist?
384
- inform("library.properties 'includes=' entry found") { f }
385
- elsif (cpp_library.path + "src" + f).exist?
386
- inform("library.properties 'includes=' entry found") { Pathname.new("src") + f }
387
- else
388
- # this is if they want to "#include <math>" or something -- may or may not be valid! so just warn.
389
- warn("library.properties 'includes=' entry '#{f}' does not refer to a file in the library")
390
- end
391
- end
392
-
393
- end
394
-
395
385
  # Unit test procedure
396
386
  def perform_unit_tests(cpp_library, file_config)
387
+ phase("Unit testing")
397
388
  if @cli_options[:skip_unittests]
398
389
  inform("Skipping unit tests") { "as requested via command line" }
399
390
  return
@@ -424,6 +415,7 @@ def perform_unit_tests(cpp_library, file_config)
424
415
  install_arduino_library_dependencies(config.aux_libraries_for_unittest, "<unittest/libraries>")
425
416
 
426
417
  platforms.each do |p|
418
+ puts
427
419
  config.allowable_unittest_files(cpp_library.test_files).each do |unittest_path|
428
420
  unittest_name = unittest_path.basename.to_s
429
421
  compilers.each do |gcc_binary|
@@ -449,6 +441,7 @@ def perform_unit_tests(cpp_library, file_config)
449
441
  end
450
442
 
451
443
  def perform_example_compilation_tests(cpp_library, config)
444
+ phase("Compilation of example sketches")
452
445
  if @cli_options[:skip_compilation]
453
446
  inform("Skipping compilation of examples") { "as requested via command line" }
454
447
  return
@@ -463,23 +456,25 @@ def perform_example_compilation_tests(cpp_library, config)
463
456
 
464
457
  library_examples.each do |example_path|
465
458
  example_name = File.basename(example_path)
459
+ puts
460
+ inform("Discovered example sketch") { example_name }
461
+
466
462
  ovr_config = config.from_example(example_path)
467
463
  platforms = choose_platform_set(ovr_config, "library example", ovr_config.platforms_to_build, cpp_library.library_properties)
468
464
 
469
465
  if platforms.empty?
470
466
  explain_and_exercise_envvar(VAR_EXPECT_EXAMPLES, "examples compilation", "platforms and architectures") do
471
- puts " Configured platforms: #{config.platforms_to_build}"
472
- puts " Configuration is default: #{config.is_default}"
467
+ puts " Configured platforms: #{ovr_config.platforms_to_build}"
468
+ puts " Configuration is default: #{ovr_config.is_default}"
473
469
  arches = cpp_library.library_properties.nil? ? nil : cpp_library.library_properties.architectures
474
470
  puts " Architectures in library.properties: #{arches}"
475
471
  end
476
472
  end
477
473
 
478
474
  install_all_packages(platforms, ovr_config)
475
+ install_arduino_library_dependencies(ovr_config.aux_libraries_for_build, "<compile/libraries>")
479
476
 
480
477
  platforms.each do |p|
481
- install_arduino_library_dependencies(ovr_config.aux_libraries_for_build, "<compile/libraries>")
482
-
483
478
  board = ovr_config.platform_info[p][:board]
484
479
  attempt("Compiling #{example_name} for #{board}") do
485
480
  ret = @backend.compile_sketch(example_path, board)
@@ -494,10 +489,18 @@ def perform_example_compilation_tests(cpp_library, config)
494
489
  end
495
490
  end
496
491
 
492
+ banner
493
+ inform("Host OS") { ArduinoCI::Host.os }
494
+
497
495
  # initialize command and config
498
496
  config = ArduinoCI::CIConfig.default.from_project_library
499
497
  @backend = ArduinoCI::ArduinoInstallation.autolocate!
500
498
  inform("Located arduino-cli binary") { @backend.binary_path.to_s }
499
+ if @backend.lib_dir.exist?
500
+ inform("Found libraries directory") { @backend.lib_dir }
501
+ else
502
+ assure("Creating libraries directory") { @backend.lib_dir.mkpath || true }
503
+ end
501
504
 
502
505
  # run any library init scripts from the library itself.
503
506
  perform_custom_initialization(config)
@@ -524,8 +527,6 @@ else
524
527
  end
525
528
  end
526
529
 
527
- perform_property_tests(cpp_library)
528
-
529
530
  install_arduino_library_dependencies(
530
531
  cpp_library.arduino_library_dependencies,
531
532
  "<#{ArduinoCI::CppLibrary::LIBRARY_PROPERTIES_FILE}>"
@@ -1,3 +1,3 @@
1
1
  module ArduinoCI
2
- VERSION = "1.2.0".freeze
2
+ VERSION = "1.3.0".freeze
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: arduino_ci
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.0
4
+ version: 1.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ian Katz
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2021-01-07 00:00:00.000000000 Z
11
+ date: 2021-01-14 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: os