arduino_ci 0.3.0 → 1.3.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (49) hide show
  1. checksums.yaml +5 -5
  2. data/README.md +125 -69
  3. data/REFERENCE.md +711 -0
  4. data/cpp/arduino/Arduino.h +1 -7
  5. data/cpp/arduino/ArduinoDefines.h +3 -0
  6. data/cpp/arduino/AvrMath.h +117 -17
  7. data/cpp/arduino/Client.h +27 -0
  8. data/cpp/arduino/EEPROM.h +64 -0
  9. data/cpp/arduino/Godmode.cpp +7 -0
  10. data/cpp/arduino/Godmode.h +121 -15
  11. data/cpp/arduino/HardwareSerial.h +4 -4
  12. data/cpp/arduino/IPAddress.h +59 -0
  13. data/cpp/arduino/Print.h +9 -12
  14. data/cpp/arduino/Printable.h +8 -0
  15. data/cpp/arduino/SPI.h +11 -3
  16. data/cpp/arduino/Server.h +5 -0
  17. data/cpp/arduino/Udp.h +27 -0
  18. data/cpp/arduino/Wire.h +197 -77
  19. data/cpp/arduino/avr/io.h +10 -1
  20. data/cpp/arduino/avr/pgmspace.h +76 -46
  21. data/cpp/unittest/ArduinoUnitTests.h +32 -0
  22. data/cpp/unittest/Assertion.h +54 -26
  23. data/cpp/unittest/Compare.h +58 -51
  24. data/cpp/unittest/OstreamHelpers.h +4 -0
  25. data/exe/arduino_ci.rb +538 -0
  26. data/exe/arduino_ci_remote.rb +2 -393
  27. data/exe/arduino_library_location.rb +2 -2
  28. data/exe/ensure_arduino_installation.rb +7 -1
  29. data/lib/arduino_ci.rb +1 -0
  30. data/lib/arduino_ci/arduino_backend.rb +238 -0
  31. data/lib/arduino_ci/arduino_downloader.rb +43 -73
  32. data/lib/arduino_ci/arduino_downloader_linux.rb +17 -55
  33. data/lib/arduino_ci/arduino_downloader_osx.rb +21 -33
  34. data/lib/arduino_ci/arduino_downloader_windows.rb +11 -53
  35. data/lib/arduino_ci/arduino_installation.rb +18 -80
  36. data/lib/arduino_ci/ci_config.rb +8 -11
  37. data/lib/arduino_ci/cpp_library.rb +250 -59
  38. data/lib/arduino_ci/host.rb +59 -4
  39. data/lib/arduino_ci/library_properties.rb +101 -0
  40. data/lib/arduino_ci/version.rb +1 -1
  41. data/misc/default.yml +57 -6
  42. metadata +19 -87
  43. data/cpp/arduino/Arduino.h.orig +0 -143
  44. data/exe/libasan.rb +0 -29
  45. data/lib/arduino_ci/arduino_cmd.rb +0 -332
  46. data/lib/arduino_ci/arduino_cmd_linux.rb +0 -17
  47. data/lib/arduino_ci/arduino_cmd_linux_builder.rb +0 -19
  48. data/lib/arduino_ci/arduino_cmd_osx.rb +0 -17
  49. data/lib/arduino_ci/arduino_cmd_windows.rb +0 -17
@@ -6,6 +6,13 @@ module ArduinoCI
6
6
 
7
7
  # Tools for interacting with the host machine
8
8
  class Host
9
+ # TODO: this came from https://stackoverflow.com/a/22716582/2063546
10
+ # and I'm not sure if it can be replaced by self.os == :windows
11
+ WINDOWS_VARIANT_REGEX = /mswin32|cygwin|mingw|bccwin/.freeze
12
+
13
+ # e.g. 11/27/2020 01:02 AM <SYMLINKD> ExcludeSomething [C:\projects\arduino-ci\SampleProjects\ExcludeSomething]
14
+ DIR_SYMLINK_REGEX = %r{\d+/\d+/\d+\s+[^<]+<SYMLINKD?>\s+(.*) \[([^\]]+)\]}.freeze
15
+
9
16
  # Cross-platform way of finding an executable in the $PATH.
10
17
  # via https://stackoverflow.com/a/5471032/2063546
11
18
  # which('ruby') #=> /usr/bin/ruby
@@ -38,21 +45,69 @@ module ArduinoCI
38
45
  return :windows if OS.windows?
39
46
  end
40
47
 
48
+ # Cross-platform symlinking
41
49
  # if on windows, call mklink, else self.symlink
42
50
  # @param [Pathname] old_path
43
51
  # @param [Pathname] new_path
44
52
  def self.symlink(old_path, new_path)
45
- return FileUtils.ln_s(old_path.to_s, new_path.to_s) unless RUBY_PLATFORM =~ /mswin32|cygwin|mingw|bccwin/
53
+ # we would prefer `new_path.make_symlink(old_path)` but "symlink function is unimplemented on this machine" with windows
54
+ return new_path.make_symlink(old_path) unless needs_symlink_hack?
46
55
 
47
- # https://stackoverflow.com/a/22716582/2063546
56
+ # via https://stackoverflow.com/a/22716582/2063546
48
57
  # windows mklink syntax is reverse of unix ln -s
49
58
  # windows mklink is built into cmd.exe
50
59
  # vulnerable to command injection, but okay because this is a hack to make a cli tool work.
51
- orp = old_path.realpath.to_s.tr("/", "\\") # HACK DUE TO REALPATH BUG where it
52
- np = new_path.to_s.tr("/", "\\") # still joins windows paths with '/'
60
+ orp = pathname_to_windows(old_path.realpath)
61
+ np = pathname_to_windows(new_path)
53
62
 
54
63
  _stdout, _stderr, exitstatus = Open3.capture3('cmd.exe', "/C mklink /D #{np} #{orp}")
55
64
  exitstatus.success?
56
65
  end
66
+
67
+ # Hack for "realpath" which on windows joins paths with slashes instead of backslashes
68
+ # @param path [Pathname] the path to render
69
+ # @return [String] A path that will work on windows
70
+ def self.pathname_to_windows(path)
71
+ path.to_s.tr("/", "\\")
72
+ end
73
+
74
+ # Hack for "realpath" which on windows joins paths with slashes instead of backslashes
75
+ # @param str [String] the windows path
76
+ # @return [Pathname] A path that will be recognized by pathname
77
+ def self.windows_to_pathname(str)
78
+ Pathname.new(str.tr("\\", "/"))
79
+ end
80
+
81
+ # Whether this OS requires a hack for symlinks
82
+ # @return [bool]
83
+ def self.needs_symlink_hack?
84
+ RUBY_PLATFORM =~ WINDOWS_VARIANT_REGEX
85
+ end
86
+
87
+ # Cross-platform is-this-a-symlink function
88
+ # @param [Pathname] path
89
+ # @return [bool] Whether the file is a symlink
90
+ def self.symlink?(path)
91
+ return path.symlink? unless needs_symlink_hack?
92
+
93
+ !readlink(path).nil?
94
+ end
95
+
96
+ # Cross-platform "read link" function
97
+ # @param [Pathname] path
98
+ # @return [Pathname] the link target
99
+ def self.readlink(path)
100
+ return path.readlink unless needs_symlink_hack?
101
+
102
+ the_dir = pathname_to_windows(path.parent)
103
+ the_file = path.basename.to_s
104
+
105
+ stdout, _stderr, _exitstatus = Open3.capture3('cmd.exe', "/c dir /al #{the_dir}")
106
+ symlinks = stdout.lines.map { |l| DIR_SYMLINK_REGEX.match(l.scrub) }.compact
107
+ our_link = symlinks.find { |m| m[1] == the_file }
108
+ return nil if our_link.nil?
109
+
110
+ windows_to_pathname(our_link[2])
111
+ end
57
112
  end
58
113
  end
@@ -0,0 +1,101 @@
1
+ module ArduinoCI
2
+
3
+ # Information about an Arduino library package, as specified by the library.properties file
4
+ #
5
+ # See https://arduino.github.io/arduino-cli/library-specification/#libraryproperties-file-format
6
+ class LibraryProperties
7
+
8
+ # @return [Hash] The properties file parsed as a hash
9
+ attr_reader :fields
10
+
11
+ # @param path [Pathname] The path to the library.properties file
12
+ def initialize(path)
13
+ @fields = {}
14
+ File.foreach(path) do |line_with_delim|
15
+ line = line_with_delim.chomp
16
+ parts = line.split("=", 2)
17
+ next if parts[0].nil?
18
+ next if parts[0].empty?
19
+ next if parts[1].nil?
20
+
21
+ @fields[parts[0]] = parts[1] unless parts[1].empty?
22
+ end
23
+ end
24
+
25
+ # @return [Hash] the properties as a hash, all strings
26
+ def to_h
27
+ Hash[@fields.map { |k, _| [k.to_sym, send(k)] }]
28
+ end
29
+
30
+ # @return [String] the string representation
31
+ def to_s
32
+ to_h.to_s
33
+ end
34
+
35
+ # Enable a shortcut syntax for library property accessors, in the style of `attr_accessor` metaprogramming.
36
+ # This is used to create a named field pointing to a specific property in the file, optionally applying
37
+ # a specific formatting function.
38
+ #
39
+ # The formatting function MUST be a static method on this class. This is a limitation caused by the desire
40
+ # to both (1) expose the formatters outside this class, and (2) use them for metaprogramming without the
41
+ # having to name the entire function. field_reader is a static method, so if not for the fact that
42
+ # `self.class.methods.include? formatter` fails to work for class methods in this context (unlike
43
+ # `self.methods.include?`, which properly finds instance methods), I would allow either one and just
44
+ # conditionally `define_method` the proper definition
45
+ #
46
+ # @param name [String] What the accessor will be called
47
+ # @param field_num [Integer] The name of the key of the property
48
+ # @param formatter [Symbol] The symbol for the formatting function to apply to the field (optional)
49
+ # @return [void]
50
+ # @macro [attach] field_reader
51
+ # @!attribute [r] $1
52
+ # @return property $2 of the library.properties file, formatted with the function {$3}
53
+ def self.field_reader(name, formatter = nil)
54
+ key = name.to_s
55
+ if formatter.nil?
56
+ define_method(name) { @fields[key] }
57
+ else
58
+ define_method(name) { @fields.key?(key) ? self.class.send(formatter.to_sym, @fields[key]) : nil }
59
+ end
60
+ end
61
+
62
+ # Parse a value as a comma-separated array
63
+ # @param input [String]
64
+ # @return [Array<String>] The individual values
65
+ def self._csv(input)
66
+ input.split(",").map(&:strip)
67
+ end
68
+
69
+ # Parse a value as a boolean
70
+ # @param input [String]
71
+ # @return [Array<String>] The individual values
72
+ def self._bool(input)
73
+ input == "true" # no indication given in the docs that anything but lowercase "true" indicates boolean true.
74
+ end
75
+
76
+ field_reader :name
77
+ field_reader :version
78
+ field_reader :author, :_csv
79
+ field_reader :maintainer
80
+ field_reader :sentence
81
+ field_reader :paragraph
82
+ field_reader :category
83
+ field_reader :url
84
+ field_reader :architectures, :_csv
85
+ field_reader :depends, :_csv
86
+ field_reader :dot_a_linkage, :_bool
87
+ field_reader :includes, :_csv
88
+ field_reader :precompiled, :_bool
89
+ field_reader :ldflags, :_csv
90
+
91
+ # The value of sentence always will be prepended, so you should start by writing the second sentence here
92
+ #
93
+ # (according to the docs)
94
+ # @return [String] the sentence and paragraph together
95
+ def full_paragraph
96
+ [sentence, paragraph].join(" ")
97
+ end
98
+
99
+ end
100
+
101
+ end
@@ -1,3 +1,3 @@
1
1
  module ArduinoCI
2
- VERSION = "0.3.0".freeze
2
+ VERSION = "1.3.0".freeze
3
3
  end
@@ -3,7 +3,12 @@
3
3
  # https://en.wikipedia.org/wiki/List_of_Arduino_boards_and_compatible_systems
4
4
 
5
5
  packages:
6
- # arduino:xxx are builtin, we don't need to include them here
6
+ arduino:avr:
7
+ url: https://downloads.arduino.cc/packages/package_index.json
8
+ arduino:sam:
9
+ url: https://downloads.arduino.cc/packages/package_index.json
10
+ arduino:samd:
11
+ url: https://downloads.arduino.cc/packages/package_index.json
7
12
  esp8266:esp8266:
8
13
  url: http://arduino.esp8266.com/stable/package_esp8266com_index.json
9
14
  adafruit:avr:
@@ -11,7 +16,7 @@ packages:
11
16
  adafruit:samd:
12
17
  url: https://adafruit.github.io/arduino-board-index/package_adafruit_index.json
13
18
  esp32:esp32:
14
- url: https://dl.espressif.com/dl/package_esp32_index.json
19
+ url: https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_index.json
15
20
 
16
21
  platforms:
17
22
 
@@ -21,7 +26,10 @@ platforms:
21
26
  gcc:
22
27
  features:
23
28
  defines:
29
+ - __AVR__
24
30
  - __AVR_ATmega328P__
31
+ - ARDUINO_ARCH_AVR
32
+ - ARDUINO_AVR_UNO
25
33
  warnings:
26
34
  flags:
27
35
  due:
@@ -30,7 +38,10 @@ platforms:
30
38
  gcc:
31
39
  features:
32
40
  defines:
33
- - __AVR_ATmega328__
41
+ - __SAM3X8E__
42
+ - ARDUINO_ARCH_SAM
43
+ - ARDUINO_SAM_DUE
44
+ - NUM_SERIAL_PORTS=4
34
45
  warnings:
35
46
  flags:
36
47
  zero:
@@ -39,8 +50,11 @@ platforms:
39
50
  gcc:
40
51
  features:
41
52
  defines:
42
- - __SAMD21G18A__
43
- - ARDUINO_SAMD_ZERO
53
+ - __SAMD21G18A__
54
+ - ARDUINO_ARCH_SAMD
55
+ - ARDUINO_SAMD_ZERO
56
+ # This also has SerialUSB, which is not included here.
57
+ - NUM_SERIAL_PORTS=2
44
58
  warnings:
45
59
  flags:
46
60
  esp32:
@@ -49,14 +63,22 @@ platforms:
49
63
  gcc:
50
64
  features:
51
65
  defines:
66
+ - ESP32
67
+ - ARDUINO_ARCH_ESP32
68
+ - ARDUINO_FEATHER_ESP32
69
+ - NUM_SERIAL_PORTS=3
52
70
  warnings:
53
71
  flags:
54
72
  esp8266:
55
- board: esp8266:esp8266:huzzah:FlashSize=4M3M,CpuFrequency=80
73
+ board: esp8266:esp8266:huzzah:eesz=4M3M,xtal=80
56
74
  package: esp8266:esp8266
57
75
  gcc:
58
76
  features:
59
77
  defines:
78
+ - ESP8266
79
+ - ARDUINO_ARCH_ESP8266
80
+ - ARDUINO_ESP8266_ESP12
81
+ - NUM_SERIAL_PORTS=2
60
82
  warnings:
61
83
  flags:
62
84
  leonardo:
@@ -65,7 +87,10 @@ platforms:
65
87
  gcc:
66
88
  features:
67
89
  defines:
90
+ - __AVR__
68
91
  - __AVR_ATmega32U4__
92
+ - ARDUINO_ARCH_AVR
93
+ - ARDUINO_AVR_LEONARDO
69
94
  warnings:
70
95
  flags:
71
96
  trinket:
@@ -74,6 +99,10 @@ platforms:
74
99
  gcc:
75
100
  features:
76
101
  defines:
102
+ - __AVR__
103
+ - __AVR_ATtiny85__
104
+ - ARDUINO_ARCH_AVR
105
+ - ARDUINO_AVR_TRINKET5
77
106
  warnings:
78
107
  flags:
79
108
  gemma:
@@ -82,6 +111,10 @@ platforms:
82
111
  gcc:
83
112
  features:
84
113
  defines:
114
+ - __AVR__
115
+ - __AVR_ATtiny85__
116
+ - ARDUINO_ARCH_AVR
117
+ - ARDUINO_AVR_GEMMA
85
118
  warnings:
86
119
  flags:
87
120
  m4:
@@ -90,6 +123,12 @@ platforms:
90
123
  gcc:
91
124
  features:
92
125
  defines:
126
+ - __SAMD51__
127
+ - __SAMD51J19A__
128
+ - ARDUINO_ARCH_SAMD
129
+ - ARDUINO_METRO_M4
130
+ # Serial is actually USB virtual serial, not HardwareSerial
131
+ - NUM_SERIAL_PORTS=2
93
132
  warnings:
94
133
  flags:
95
134
  mega2560:
@@ -98,7 +137,10 @@ platforms:
98
137
  gcc:
99
138
  features:
100
139
  defines:
140
+ - __AVR__
101
141
  - __AVR_ATmega2560__
142
+ - ARDUINO_ARCH_AVR
143
+ - ARDUINO_AVR_MEGA2560
102
144
  warnings:
103
145
  flags:
104
146
  cplayClassic:
@@ -107,6 +149,10 @@ platforms:
107
149
  gcc:
108
150
  features:
109
151
  defines:
152
+ - __AVR__
153
+ - __AVR_ATmega32U4__
154
+ - ARDUINO_ARCH_AVR
155
+ - ARDUINO_AVR_CIRCUITPLAY
110
156
  warnings:
111
157
  flags:
112
158
  cplayExpress:
@@ -115,6 +161,11 @@ platforms:
115
161
  gcc:
116
162
  features:
117
163
  defines:
164
+ - __SAMD21G18A__
165
+ - ARDUINO_ARCH_SAMD
166
+ - ARDUINO_SAMD_CIRCUITPLAYGROUND_EXPRESS
167
+ # Serial is actually an alias of SerialUSB, not a HardwareSerial
168
+ - NUM_SERIAL_PORTS=2
118
169
  warnings:
119
170
  flags:
120
171
 
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: 0.3.0
4
+ version: 1.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ian Katz
8
- autorequire:
8
+ autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2019-09-03 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
@@ -38,103 +38,39 @@ dependencies:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
40
  version: '1.2'
41
- - !ruby/object:Gem::Dependency
42
- name: bundler
43
- requirement: !ruby/object:Gem::Requirement
44
- requirements:
45
- - - ">"
46
- - !ruby/object:Gem::Version
47
- version: '1.15'
48
- type: :development
49
- prerelease: false
50
- version_requirements: !ruby/object:Gem::Requirement
51
- requirements:
52
- - - ">"
53
- - !ruby/object:Gem::Version
54
- version: '1.15'
55
- - !ruby/object:Gem::Dependency
56
- name: keepachangelog_manager
57
- requirement: !ruby/object:Gem::Requirement
58
- requirements:
59
- - - "~>"
60
- - !ruby/object:Gem::Version
61
- version: 0.0.2
62
- type: :development
63
- prerelease: false
64
- version_requirements: !ruby/object:Gem::Requirement
65
- requirements:
66
- - - "~>"
67
- - !ruby/object:Gem::Version
68
- version: 0.0.2
69
- - !ruby/object:Gem::Dependency
70
- name: rspec
71
- requirement: !ruby/object:Gem::Requirement
72
- requirements:
73
- - - "~>"
74
- - !ruby/object:Gem::Version
75
- version: '3.0'
76
- type: :development
77
- prerelease: false
78
- version_requirements: !ruby/object:Gem::Requirement
79
- requirements:
80
- - - "~>"
81
- - !ruby/object:Gem::Version
82
- version: '3.0'
83
- - !ruby/object:Gem::Dependency
84
- name: rubocop
85
- requirement: !ruby/object:Gem::Requirement
86
- requirements:
87
- - - "~>"
88
- - !ruby/object:Gem::Version
89
- version: 0.59.0
90
- type: :development
91
- prerelease: false
92
- version_requirements: !ruby/object:Gem::Requirement
93
- requirements:
94
- - - "~>"
95
- - !ruby/object:Gem::Version
96
- version: 0.59.0
97
- - !ruby/object:Gem::Dependency
98
- name: yard
99
- requirement: !ruby/object:Gem::Requirement
100
- requirements:
101
- - - "~>"
102
- - !ruby/object:Gem::Version
103
- version: 0.9.11
104
- type: :development
105
- prerelease: false
106
- version_requirements: !ruby/object:Gem::Requirement
107
- requirements:
108
- - - "~>"
109
- - !ruby/object:Gem::Version
110
- version: 0.9.11
111
41
  description: ''
112
42
  email:
113
- - ianfixes@gmail.com
43
+ - arduino.continuous.integration@gmail.com
114
44
  executables:
45
+ - arduino_ci.rb
115
46
  - arduino_ci_remote.rb
116
47
  - arduino_library_location.rb
117
48
  - ensure_arduino_installation.rb
118
- - libasan.rb
119
49
  extensions: []
120
50
  extra_rdoc_files: []
121
51
  files:
122
52
  - ".yardopts"
123
53
  - README.md
54
+ - REFERENCE.md
124
55
  - cpp/arduino/Arduino.cpp
125
56
  - cpp/arduino/Arduino.h
126
- - cpp/arduino/Arduino.h.orig
127
57
  - cpp/arduino/ArduinoDefines.h
128
58
  - cpp/arduino/AvrMath.h
59
+ - cpp/arduino/Client.h
60
+ - cpp/arduino/EEPROM.h
129
61
  - cpp/arduino/Godmode.cpp
130
62
  - cpp/arduino/Godmode.h
131
63
  - cpp/arduino/HardwareSerial.h
64
+ - cpp/arduino/IPAddress.h
132
65
  - cpp/arduino/MockEventQueue.h
133
66
  - cpp/arduino/PinHistory.h
134
67
  - cpp/arduino/Print.h
68
+ - cpp/arduino/Printable.h
135
69
  - cpp/arduino/SPI.h
70
+ - cpp/arduino/Server.h
136
71
  - cpp/arduino/SoftwareSerial.h
137
72
  - cpp/arduino/Stream.h
73
+ - cpp/arduino/Udp.h
138
74
  - cpp/arduino/WCharacter.h
139
75
  - cpp/arduino/WString.h
140
76
  - cpp/arduino/Wire.h
@@ -426,16 +362,12 @@ files:
426
362
  - cpp/unittest/Assertion.h
427
363
  - cpp/unittest/Compare.h
428
364
  - cpp/unittest/OstreamHelpers.h
365
+ - exe/arduino_ci.rb
429
366
  - exe/arduino_ci_remote.rb
430
367
  - exe/arduino_library_location.rb
431
368
  - exe/ensure_arduino_installation.rb
432
- - exe/libasan.rb
433
369
  - lib/arduino_ci.rb
434
- - lib/arduino_ci/arduino_cmd.rb
435
- - lib/arduino_ci/arduino_cmd_linux.rb
436
- - lib/arduino_ci/arduino_cmd_linux_builder.rb
437
- - lib/arduino_ci/arduino_cmd_osx.rb
438
- - lib/arduino_ci/arduino_cmd_windows.rb
370
+ - lib/arduino_ci/arduino_backend.rb
439
371
  - lib/arduino_ci/arduino_downloader.rb
440
372
  - lib/arduino_ci/arduino_downloader_linux.rb
441
373
  - lib/arduino_ci/arduino_downloader_osx.rb
@@ -444,13 +376,14 @@ files:
444
376
  - lib/arduino_ci/ci_config.rb
445
377
  - lib/arduino_ci/cpp_library.rb
446
378
  - lib/arduino_ci/host.rb
379
+ - lib/arduino_ci/library_properties.rb
447
380
  - lib/arduino_ci/version.rb
448
381
  - misc/default.yml
449
- homepage: http://github.com/ianfixes/arduino_ci
382
+ homepage: http://github.com/Arduino-CI/arduino_ci
450
383
  licenses:
451
384
  - Apache-2.0
452
385
  metadata: {}
453
- post_install_message:
386
+ post_install_message:
454
387
  rdoc_options: []
455
388
  require_paths:
456
389
  - lib
@@ -465,9 +398,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
465
398
  - !ruby/object:Gem::Version
466
399
  version: '0'
467
400
  requirements: []
468
- rubyforge_project:
469
- rubygems_version: 2.5.2.3
470
- signing_key:
401
+ rubygems_version: 3.0.3
402
+ signing_key:
471
403
  specification_version: 4
472
404
  summary: Tools for building and unit testing Arduino libraries
473
405
  test_files: []