arduino_ci 0.1.9 → 0.1.10

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,10 +1,14 @@
1
1
  require "arduino_ci/host"
2
2
  require "arduino_ci/arduino_cmd_osx"
3
3
  require "arduino_ci/arduino_cmd_linux"
4
+ require "arduino_ci/arduino_cmd_windows"
4
5
  require "arduino_ci/arduino_cmd_linux_builder"
6
+ require "arduino_ci/arduino_downloader_osx"
7
+ require "arduino_ci/arduino_downloader_linux"
8
+
9
+ require "arduino_ci/arduino_downloader_windows" if ArduinoCI::Host.os == :windows
5
10
 
6
11
  DESIRED_ARDUINO_IDE_VERSION = "1.8.5".freeze
7
- USE_BUILDER = false
8
12
 
9
13
  module ArduinoCI
10
14
 
@@ -12,75 +16,67 @@ module ArduinoCI
12
16
  class ArduinoInstallation
13
17
 
14
18
  class << self
15
- # @return [String] The location where a forced install will go
16
- def force_install_location
17
- File.join(ENV['HOME'], 'arduino_ci_ide')
18
- end
19
19
 
20
20
  # attempt to find a workable Arduino executable across platforms
21
- # @return [ArduinoCI::ArduinoCmd] an instance of the command
21
+ #
22
+ # Autolocation assumed to be an expensive operation
23
+ # @return [ArduinoCI::ArduinoCmd] an instance of the command or nil if it can't be found
22
24
  def autolocate
25
+ ret = nil
23
26
  case Host.os
24
- when :osx then autolocate_osx
25
- when :linux then autolocate_linux
27
+ when :osx then
28
+ ret = autolocate_osx
29
+ when :linux then
30
+ loc = ArduinoDownloaderLinux.autolocated_executable
31
+ return nil if loc.nil?
32
+ ret = ArduinoCmdLinux.new
33
+ ret.base_cmd = [loc]
34
+ when :windows then
35
+ loc = ArduinoDownloaderWindows.autolocated_executable
36
+ return nil if loc.nil?
37
+ ret = ArduinoCmdWindows.new
38
+ ret.base_cmd = [loc]
26
39
  end
40
+ ret
27
41
  end
28
42
 
29
- # @return [ArduinoCI::ArduinoCmdOSX] an instance of a command
43
+ # @return [ArduinoCI::ArduinoCmdOSX] an instance of the command or nil if it can't be found
30
44
  def autolocate_osx
31
- osx_root = "/Applications/Arduino.app/Contents"
45
+ osx_root = ArduinoDownloaderOSX.autolocated_installation
46
+ return nil if osx_root.nil?
32
47
  return nil unless File.exist? osx_root
33
48
 
34
- ret = ArduinoCmdOSX.new
35
-
36
- # old_way
37
- # ret.base_cmd = [File.join("#{osx_root}/MacOS", "Arduino")]
38
- ret.base_cmd = [
39
- "java",
40
- "-cp", "#{osx_root}/Java/*",
41
- "-DAPP_DIR=#{osx_root}/Java",
42
- "-Dfile.encoding=UTF-8",
43
- "-Dapple.awt.UIElement=true",
44
- "-Xms128M",
45
- "-Xmx512M",
46
- "processing.app.Base",
49
+ launchers = [
50
+ # try a hack that skips splash screen
51
+ # from https://github.com/arduino/Arduino/issues/1970#issuecomment-321975809
52
+ [
53
+ "java",
54
+ "-cp", "#{osx_root}/Java/*",
55
+ "-DAPP_DIR=#{osx_root}/Java",
56
+ "-Dfile.encoding=UTF-8",
57
+ "-Dapple.awt.UIElement=true",
58
+ "-Xms128M",
59
+ "-Xmx512M",
60
+ "processing.app.Base",
61
+ ],
62
+ # failsafe way
63
+ [File.join(osx_root, "Contents", "MacOS", "Arduino")]
47
64
  ]
48
- ret
49
- end
50
-
51
- # @return [ArduinoCI::ArduinoCmdLinux] an instance of a command
52
- def autolocate_linux
53
- if USE_BUILDER
54
- builder_name = "arduino-builder"
55
- cli_place = Host.which(builder_name)
56
- unless cli_place.nil?
57
- ret = ArduinoCmdLinuxBuilder.new
58
- ret.base_cmd = [cli_place]
59
- return ret
60
- end
61
65
 
62
- forced_builder = File.join(force_install_location, builder_name)
63
- if File.exist?(forced_builder)
64
- ret = ArduinoCmdLinuxBuilder.new
65
- ret.base_cmd = [forced_builder]
66
+ # create return and find a command launcher that works
67
+ ret = ArduinoCmdOSX.new
68
+ launchers.each do |launcher|
69
+ # test whether this method successfully launches the IDE
70
+ # note that "successful launch" involves a command that will fail,
71
+ # because that's faster than any command which succeeds. what we
72
+ # don't want to see is a java error.
73
+ args = launcher + ["--bogus-option"]
74
+ result = Host.run_and_capture(*args)
75
+ if result[:err].include? "Error: unknown option: --bogus-option"
76
+ ret.base_cmd = launcher
66
77
  return ret
67
78
  end
68
79
  end
69
-
70
- gui_name = "arduino"
71
- gui_place = Host.which(gui_name)
72
- unless gui_place.nil?
73
- ret = ArduinoCmdLinux.new
74
- ret.base_cmd = [gui_place]
75
- return ret
76
- end
77
-
78
- forced_arduino = File.join(force_install_location, gui_name)
79
- if File.exist?(forced_arduino)
80
- ret = ArduinoCmdLinux.new
81
- ret.base_cmd = [forced_arduino]
82
- return ret
83
- end
84
80
  nil
85
81
  end
86
82
 
@@ -98,30 +94,13 @@ module ArduinoCI
98
94
  # Forcibly install Arduino from the web
99
95
  # @return [bool] Whether the command succeeded
100
96
  def force_install
101
- case Host.os
102
- when :linux
103
- pkgname = "arduino-#{DESIRED_ARDUINO_IDE_VERSION}"
104
- tarfile = "#{pkgname}-linux64.tar.xz"
105
- if File.exist? tarfile
106
- puts "Arduino tarfile seems to have been downloaded already"
107
- else
108
- puts "Downloading Arduino binary with wget"
109
- system("wget", "--quiet", "--progress=dot:giga", "https://downloads.arduino.cc/#{tarfile}")
110
- end
111
-
112
- if File.exist? pkgname
113
- puts "Tarfile seems to have been extracted already"
114
- else
115
- puts "Extracting archive with tar"
116
- system("tar", "xf", tarfile)
117
- end
118
-
119
- if File.exist? force_install_location
120
- puts "Arduino binary seems to have already been force-installed"
121
- else
122
- system("mv", pkgname, force_install_location)
123
- end
124
- end
97
+ worker_class = case Host.os
98
+ when :osx then ArduinoDownloaderOSX
99
+ when :windows then ArduinoDownloaderWindows
100
+ when :linux then ArduinoDownloaderLinux
101
+ end
102
+ worker = worker_class.new(DESIRED_ARDUINO_IDE_VERSION)
103
+ worker.execute
125
104
  end
126
105
 
127
106
  end
@@ -0,0 +1,116 @@
1
+ require "arduino_ci/host"
2
+ require "arduino_ci/arduino_cmd_osx"
3
+ require "arduino_ci/arduino_cmd_linux"
4
+ require "arduino_ci/arduino_cmd_linux_builder"
5
+ require "arduino_ci/arduino_downloader_linux"
6
+ require "arduino_ci/arduino_downloader_osx"
7
+
8
+ DESIRED_ARDUINO_IDE_VERSION = "1.8.5".freeze
9
+
10
+ module ArduinoCI
11
+
12
+ # Manage the OS-specific install location of Arduino
13
+ class ArduinoInstallation
14
+
15
+ class << self
16
+
17
+ # attempt to find a workable Arduino executable across platforms
18
+ #
19
+ # Autolocation assumed to be an expensive operation
20
+ # @return [ArduinoCI::ArduinoCmd] an instance of the command or nil if it can't be found
21
+ def autolocate
22
+ ret = nil
23
+ case Host.os
24
+ when :osx then
25
+ ret = autolocate_osx
26
+ when :linux then
27
+ <<<<<<< HEAD
28
+ loc = ArduinoDownloaderLinux.autolocation
29
+ return nil if loc.nil?
30
+ ret = ArduinoCmdLinux.new
31
+ ret.base_cmd = [loc]
32
+ =======
33
+ loc = ArduinoDownloaderLinux.autolocated_executable
34
+ return nil if loc.nil?
35
+ ret = ArduinoCmdLinux.new
36
+ ret.base_cmd = [loc]
37
+ # when :windows then
38
+ # ArduinoDownloaderWindows.autolocation
39
+ # return nil if loc.nil?
40
+ # ret = ArduinoCmdWindows.new
41
+ # ret.base_cmd = [loc]
42
+ >>>>>>> Refactor force_install code in preparation for windows CI
43
+ end
44
+ ret
45
+ end
46
+
47
+ # @return [ArduinoCI::ArduinoCmdOSX] an instance of the command or nil if it can't be found
48
+ def autolocate_osx
49
+ <<<<<<< HEAD
50
+ osx_root = ArduinoDownloaderOSX.autolocation
51
+ =======
52
+ osx_root = ArduinoDownloaderOSX.autolocated_installation
53
+ return nil if osx_root.nil?
54
+ >>>>>>> Refactor force_install code in preparation for windows CI
55
+ return nil unless File.exist? osx_root
56
+
57
+ launchers = [
58
+ # try a hack that skips splash screen
59
+ # from https://github.com/arduino/Arduino/issues/1970#issuecomment-321975809
60
+ [
61
+ "java",
62
+ "-cp", "#{osx_root}/Java/*",
63
+ "-DAPP_DIR=#{osx_root}/Java",
64
+ "-Dfile.encoding=UTF-8",
65
+ "-Dapple.awt.UIElement=true",
66
+ "-Xms128M",
67
+ "-Xmx512M",
68
+ "processing.app.Base",
69
+ ],
70
+ # failsafe way
71
+ [File.join(osx_root, "MacOS", "Arduino")]
72
+ ]
73
+
74
+ # create return and find a command launcher that works
75
+ ret = ArduinoCmdOSX.new
76
+ launchers.each do |launcher|
77
+ # test whether this method successfully launches the IDE
78
+ # note that "successful launch" involves a command that will fail,
79
+ # because that's faster than any command which succeeds. what we
80
+ # don't want to see is a java error.
81
+ args = launcher + ["--bogus-option"]
82
+ result = Host.run_and_capture(*args)
83
+ if result[:err].include? "Error: unknown option: --bogus-option"
84
+ ret.base_cmd = launcher
85
+ return ret
86
+ end
87
+ end
88
+ nil
89
+ end
90
+
91
+ # Attempt to find a workable Arduino executable across platforms, and install it if we don't
92
+ # @return [ArduinoCI::ArduinoCmd] an instance of a command
93
+ def autolocate!
94
+ candidate = autolocate
95
+ return candidate unless candidate.nil?
96
+
97
+ # force the install
98
+ force_install
99
+ autolocate
100
+ end
101
+
102
+ # Forcibly install Arduino from the web
103
+ # @return [bool] Whether the command succeeded
104
+ def force_install
105
+ worker_class = case Host.os
106
+ when :osx then ArduinoDownloaderOSX
107
+ # when :windows then force_install_windows
108
+ when :linux then ArduinoDownloaderLinux
109
+ end
110
+ worker = worker_class.new(DESIRED_ARDUINO_IDE_VERSION)
111
+ worker.execute
112
+ end
113
+
114
+ end
115
+ end
116
+ end
@@ -34,6 +34,7 @@ module ArduinoCI
34
34
  # @return [bool] whether there is already a GUI that can accept windows
35
35
  def existing_display?
36
36
  return true if RUBY_PLATFORM.include? "darwin"
37
+ return true if Host.os == :windows
37
38
  return false if ENV["DISPLAY"].nil?
38
39
  return true if ENV["DISPLAY"].include? ":"
39
40
  false
@@ -37,5 +37,16 @@ module ArduinoCI
37
37
  return :windows if OS.windows?
38
38
  end
39
39
 
40
+ # if on windows, call mklink, else self.symlink
41
+ # https://stackoverflow.com/a/22716582/2063546
42
+ def self.symlink(old_path, new_path)
43
+ return FileUtils.ln_s(old_path, new_path) unless RUBY_PLATFORM =~ /mswin32|cygwin|mingw|bccwin/
44
+
45
+ # windows mklink syntax is reverse of unix ln -s
46
+ # windows mklink is built into cmd.exe
47
+ # vulnerable to command injection, but okay because this is a hack to make a cli tool work.
48
+ _stdin, _stdout, _stderr, wait_thr = Open3.popen3('cmd.exe', "/c mklink #{new_path} #{old_path}")
49
+ wait_thr.value.exitstatus
50
+ end
40
51
  end
41
52
  end
@@ -1,3 +1,3 @@
1
1
  module ArduinoCI
2
- VERSION = "0.1.9".freeze
2
+ VERSION = "0.1.10".freeze
3
3
  end
data/lib/arduino_ci.rb CHANGED
@@ -4,7 +4,7 @@ require "arduino_ci/cpp_library"
4
4
  require "arduino_ci/ci_config"
5
5
 
6
6
  # ArduinoCI contains classes for automated testing of Arduino code on the command line
7
- # @author Ian Katz <ifreecarve@gmail.com>
7
+ # @author Ian Katz <ianfixes@gmail.com>
8
8
  module ArduinoCI
9
9
 
10
10
  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: 0.1.9
4
+ version: 0.1.10
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ian Katz
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2018-04-12 00:00:00.000000000 Z
11
+ date: 2018-05-06 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: os
@@ -24,6 +24,20 @@ dependencies:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
26
  version: '1.0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rubyzip
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: 1.2.1
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: 1.2.1
27
41
  - !ruby/object:Gem::Dependency
28
42
  name: bundler
29
43
  requirement: !ruby/object:Gem::Requirement
@@ -82,7 +96,7 @@ dependencies:
82
96
  version: 0.9.11
83
97
  description: ''
84
98
  email:
85
- - ifreecarve@gmail.com
99
+ - ianfixes@gmail.com
86
100
  executables:
87
101
  - arduino_ci_remote.rb
88
102
  extensions: []
@@ -394,14 +408,23 @@ files:
394
408
  - lib/arduino_ci/arduino_cmd_linux.rb
395
409
  - lib/arduino_ci/arduino_cmd_linux_builder.rb
396
410
  - lib/arduino_ci/arduino_cmd_osx.rb
411
+ - lib/arduino_ci/arduino_cmd_windows.rb
412
+ - lib/arduino_ci/arduino_downloader.rb
413
+ - lib/arduino_ci/arduino_downloader.rb.orig
414
+ - lib/arduino_ci/arduino_downloader_linux.rb
415
+ - lib/arduino_ci/arduino_downloader_linux.rb.orig
416
+ - lib/arduino_ci/arduino_downloader_osx.rb
417
+ - lib/arduino_ci/arduino_downloader_osx.rb.orig
418
+ - lib/arduino_ci/arduino_downloader_windows.rb
397
419
  - lib/arduino_ci/arduino_installation.rb
420
+ - lib/arduino_ci/arduino_installation.rb.orig
398
421
  - lib/arduino_ci/ci_config.rb
399
422
  - lib/arduino_ci/cpp_library.rb
400
423
  - lib/arduino_ci/display_manager.rb
401
424
  - lib/arduino_ci/host.rb
402
425
  - lib/arduino_ci/version.rb
403
426
  - misc/default.yml
404
- homepage: http://github.com/ifreecarve/arduino_ci
427
+ homepage: http://github.com/ianfixes/arduino_ci
405
428
  licenses:
406
429
  - Apache-2.0
407
430
  metadata: {}