tlapse 0.6.2 → 0.9.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: 05c79cb1ebafb8041b0bec716670c93a3338f7bd9c7eefdede3bced629797aee
4
- data.tar.gz: 5ac5492c545731497b09c717db5a71cf43b902f97d920a34fa9c9fe99de38111
3
+ metadata.gz: 106f754399b01a1832979389bc94fb9d7e0cd0425ff2783839f78529f55d7666
4
+ data.tar.gz: 65b360c321a2d8baef64e1673d4468037628116736b3d9b7295535ea70d18d9d
5
5
  SHA512:
6
- metadata.gz: dbc3c2f6bfc6f6a1581e6c2a4f17e3ef6d9de3f42f017b4c42cbd6ab03236849bbe151c576b5a018c398c5d6b5600e743388ea3a05bfb54d6cdc669e8b9a2c81
7
- data.tar.gz: 50630cc133c3b139bb01054817f1f18979ad93211c3545a77d033d02d170eb1e54ebf691c86e85d69c9ccbd19f736b97c824ee841ca4f4d0d6139448d44aa4aa
6
+ metadata.gz: d96e6168415a2f4d8909251cf8df8b2922174ef5ea474c856cb58bb6fb8b166884fabee9e3097b0fea968f2e13c12133265d14747951ee0c9439217f4720fc4d
7
+ data.tar.gz: 783e162a545afc25cb52d13b82749fa786f719fc72006619fab1a1b53d5d0eb3e2b07cfba8f36f92a27f90bfe420440cf43c22b99d9c4affbf7b7b97896f18ad
@@ -0,0 +1,27 @@
1
+ name: Publish to Rubygems
2
+
3
+ on:
4
+ push:
5
+ tags:
6
+ - '*'
7
+
8
+ jobs:
9
+ publish:
10
+ runs-on: ubuntu-latest
11
+ steps:
12
+ - uses: actions/checkout@v2
13
+ - name: Set up Ruby
14
+ uses: ruby/setup-ruby@v1
15
+ with:
16
+ ruby-version: ${{ matrix.ruby-version }}
17
+ - name: Install dependencies
18
+ run: bundle install
19
+ - name: gem build
20
+ run: gem build tlapse.gemspec
21
+ - name: gem push
22
+ env:
23
+ GEM_HOST_API_KEY: ${{ secrets.RUBYGEMS_API_KEY }}
24
+ run: |
25
+ tag=$(git describe --tags)
26
+ tag=${tag:1}
27
+ gem push "tlapse-$tag.gem"
@@ -0,0 +1,25 @@
1
+ name: Ruby
2
+
3
+ on:
4
+ push:
5
+ branches: [ master ]
6
+ pull_request:
7
+ branches: [ master ]
8
+
9
+ jobs:
10
+ test:
11
+ runs-on: ubuntu-latest
12
+ strategy:
13
+ matrix:
14
+ ruby-version: [2.5, 2.6, 2.7, '3.0']
15
+ steps:
16
+ - uses: actions/checkout@v2
17
+ - name: Set up Ruby
18
+ uses: ruby/setup-ruby@v1
19
+ with:
20
+ ruby-version: ${{ matrix.ruby-version }}
21
+ - name: Install dependencies
22
+ run: bundle install
23
+ - name: Run tests
24
+ run: bundle exec rspec
25
+
data/.gitignore CHANGED
@@ -9,3 +9,4 @@
9
9
  /tmp/
10
10
  *.gem
11
11
  .byebug_history
12
+ coverage
data/.ruby-version CHANGED
@@ -1 +1 @@
1
- 2.4.2
1
+ 2.7.2
data/README.md CHANGED
@@ -4,27 +4,43 @@ Automated time lapse photography using gphoto2.
4
4
 
5
5
  ## Installation
6
6
 
7
- 1. Install gphoto2
7
+ 1. Install gphoto2 and ffmpeg
8
8
 
9
- * macOS: `brew install gphoto2`
10
- * Debian/Ubuntu: `sudo apt install gphoto2`
9
+ * macOS: `brew install gphoto2 ffmpeg`
10
+ * Debian/Ubuntu: `sudo apt install gphoto2 ffmpeg`
11
11
 
12
12
  2. `gem install tlapse`
13
13
 
14
14
  ## Example: Integrate with cron
15
15
 
16
- * From 9 AM to sunset, capture one image every 10 minutes
16
+ * From 9 AM to 1 PM, capture one image every 10 minutes
17
17
 
18
18
  ```
19
- 0 9 * * * cd $HOME && eval "$(tlapse until_sunset --interval 10)" >> capture.log
19
+ 0 9 * * * cd $HOME && tlapse alpha capture --until 1pm --interval 10
20
+ ```
21
+
22
+ * From 3 PM to sunset, capture an image every minute. Compile the result into a video.
23
+ * You should [configure](#configuration) your coordinates to accurately
24
+ determine sunset in your location
25
+
26
+ ```
27
+ 0 15 * * * cd $HOME && tlapse alpha capture --until sunset --interval 10 --compile
20
28
  ```
21
29
 
22
30
  ## CLI
23
31
 
24
32
  Find better documentation by running `tlapse help` or `tlapse help SUBCOMMAND`
25
33
 
26
- * `tlapse capture` - Capture an image using the tethered camera
34
+ * `tlapse capture_single` - Capture an image using the tethered camera
27
35
  * `tlapse until_sunset` - Generate a gphoto2 command which captures images until sunset
36
+ * You should [configure](#configuration) your coordinates to accurately
37
+ determine sunset in your location
38
+
39
+ #### Alpha CLI
40
+
41
+ These are early-stage features which are likely to change quite a bit before they're ready for prime time.
42
+
43
+ * `tlapse alpha capture` - Capture a series of timelapse images (see `tlapse alpha capture --help` for options)
28
44
 
29
45
  ## API
30
46
 
@@ -45,6 +61,22 @@ Mostly useful for cronjobs and the like.
45
61
  # => "gphoto2 --capture-image-and-download -I 1800 -F 11 --filename '%Y-%m-%d_%H-%M-%S.jpg'"
46
62
  ```
47
63
 
64
+ ## Configuration <a name="configuration"/>
65
+
66
+ So sunrise and sunset calculations are correct for your location, it is
67
+ advisable to configure your (approximate) coordintes using the CLI. Defaults are
68
+ for Raleigh, NC, which is probably not where you live.
69
+
70
+ You can get rough coordinates from https://www.iplocation.net/
71
+
72
+ ```
73
+ tlapse config set lat YOUR_LATITUDE
74
+ tlapse config set lon YOUR_LONGITUDE
75
+
76
+ # Optionally also configure your timezone to make date formatting nicer
77
+ tlapze config set tz YOUR_TIMEZONE (e.g. America/New_York)
78
+ ```
79
+
48
80
  ## License
49
81
 
50
82
  The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).
data/lib/tlapse.rb CHANGED
@@ -5,6 +5,7 @@ require_relative "tlapse/video"
5
5
  require_relative "tlapse/server"
6
6
  require_relative "tlapse/solar_event"
7
7
  require_relative "tlapse/util"
8
+ require_relative "tlapse/logger"
8
9
 
9
10
  include Tlapse::Doctor
10
11
  include Tlapse::Capture
@@ -4,11 +4,16 @@ module Tlapse
4
4
  module Capture
5
5
 
6
6
  CAPTURE_FILENAME = "%Y-%m-%d_%H-%M-%S.jpg"
7
+ CAPTURE_DIRNAME = "%Y-%m-%d"
7
8
 
8
9
  def self.capture_filename
9
10
  CAPTURE_FILENAME
10
11
  end
11
12
 
13
+ def self.capture_dirname
14
+ CAPTURE_DIRNAME
15
+ end
16
+
12
17
  def self.capture_single
13
18
  `gphoto2 --capture-image-and-download --filename '#{capture_filename}'`
14
19
  end
@@ -1,4 +1,6 @@
1
1
  require "thor"
2
+ require "rainbow"
3
+ require "fileutils"
2
4
 
3
5
  module Tlapse::CLI
4
6
  class Alpha < Thor
@@ -41,7 +43,7 @@ module Tlapse::CLI
41
43
  FileUtils.rm video.outfile
42
44
  puts "Removed file #{video.outfile}"
43
45
  else
44
- raise "#{video.outfile} exists. Use -f to overwrite or " \
46
+ Tlapse::Logger.error! "#{video.outfile} exists. Use -f to overwrite or " \
45
47
  "-o to specify a different output file."
46
48
  end
47
49
  end
@@ -49,13 +51,68 @@ module Tlapse::CLI
49
51
  video.create!
50
52
  end
51
53
 
52
- desc "normalize", "Cannonically organize pictures in the current directory"
54
+ desc "organize", "Cannonically organize pictures in the current directory"
53
55
  option :dry_run,
54
56
  desc: "Print out what would change without actually changing anything",
55
57
  type: :boolean,
56
58
  default: false
57
- def normalize
58
- Tlapse::Util.normalize! dry_run: options[:dry_run]
59
+ def organize
60
+ Tlapse::Util.organize! dry_run: options[:dry_run]
61
+ end
62
+
63
+ desc "capture", "Capture a series of timelapse photos"
64
+ option :interval,
65
+ desc: "The interval (in minutes) at which pictures will be taken",
66
+ type: :numeric,
67
+ default: 5,
68
+ aliases: %i(i)
69
+ option :until,
70
+ desc: %(Time to stop capturing. Can use special "sunset" or "sunrise"),
71
+ type: :string,
72
+ default: "sunset"
73
+ option :compile,
74
+ desc: "When done capturing, compile photos into a video",
75
+ type: :boolean,
76
+ default: false
77
+ option :compile_out,
78
+ desc: "Specify the name for the generated video file",
79
+ type: :string,
80
+ default: "out.mkv"
81
+ def capture
82
+ dirname = Time.now.strftime(Tlapse::Capture.capture_dirname)
83
+ FileUtils.mkdir_p dirname
84
+ Dir.chdir dirname
85
+
86
+ cmd = Tlapse::Capture.timelapse_command(
87
+ to: parse_time(options[:until]),
88
+ interval: options[:interval].minutes
89
+ )
90
+
91
+ if options[:compile]
92
+ video = Tlapse::Video.new(
93
+ outfile: options[:compile_out]
94
+ )
95
+
96
+ if video.outfile_exists?
97
+ Tlapse::Logger.error! "The file #{video.outfile} already exists in" \
98
+ " the directory #{dirname}. Please delete it or use the" \
99
+ " --compile-out option to specify a different filename."
100
+ end
101
+
102
+ cmd += " && #{video.create_command}"
103
+ end
104
+
105
+ exec cmd
106
+ end
107
+
108
+ no_commands do
109
+ def parse_time(time)
110
+ case time
111
+ when "sunset" then Tlapse::SolarEvent.sunset
112
+ when "sunrise" then Tlapse::SolarEvent.sunrise
113
+ else Time.parse(time)
114
+ end
115
+ end
59
116
  end
60
117
  end
61
118
  end
@@ -2,6 +2,7 @@ require "thor"
2
2
  require "active_support/core_ext/numeric/time.rb"
3
3
  require "tlapse"
4
4
  require "tlapse/cli/alpha"
5
+ require "tlapse/cli/config"
5
6
 
6
7
  module Tlapse::CLI
7
8
  class CLI < Thor
@@ -15,8 +16,8 @@ module Tlapse::CLI
15
16
  puts Tlapse::VERSION
16
17
  end
17
18
 
18
- desc "capture", "Capture a single photo, saving it to the current directory"
19
- def capture
19
+ desc "capture_single", "Capture a single photo, saving it to the current directory"
20
+ def capture_single
20
21
  Tlapse::Capture.capture_single
21
22
  end
22
23
 
@@ -31,6 +32,9 @@ module Tlapse::CLI
31
32
  puts Tlapse::Capture.timelapse_command_while_sun_is_up(interval: interval)
32
33
  end
33
34
 
35
+ desc "config", "Read and write config options"
36
+ subcommand "config", Tlapse::CLI::Config
37
+
34
38
  desc "alpha", "Get early access to in-development (and likely unstable) commands"
35
39
  subcommand "alpha", Tlapse::CLI::Alpha
36
40
  end
@@ -0,0 +1,67 @@
1
+ require "thor"
2
+ require "tlapse/config"
3
+
4
+ module Tlapse::CLI
5
+ class Config < Thor
6
+ desc "list", "List available configuration options"
7
+ def list
8
+ config = Tlapse::Config.list.dup
9
+ opts = config.keys
10
+
11
+ values = Tlapse::Config.get *opts
12
+
13
+ config = config.transform_values.with_index do |original, index|
14
+ default = original[:default]
15
+ default = default.call if default.respond_to? :call
16
+ original[:default] = default
17
+
18
+ original[:value] = values[index].to_s
19
+
20
+ original
21
+ end
22
+
23
+ # Make a simple table.
24
+ max_name = opts.max_by(&:length).length
25
+ max_desc = opts.max_by { |opt| config[opt][:desc].length }
26
+ max_desc = config[max_desc][:desc].length
27
+ max_value = opts.max_by { |opt| config[opt][:value].length }
28
+ max_value = config[max_value][:value].length
29
+
30
+ config.each_pair do |option, meta|
31
+ desc, default = meta.values_at :desc, :default
32
+ name_padded = option.ljust(max_name, " ")
33
+ desc_padded = meta[:desc].ljust(max_desc, " ")
34
+ #value_padded = meta[:value].ljust(max_value, " ")
35
+ value_padded = meta[:value]
36
+
37
+ puts "#{name_padded} -> #{desc_padded} -> #{value_padded} (default: #{default})"
38
+ end
39
+ end
40
+
41
+ desc "get OPTION", "Get the value for the given config option"
42
+ def get(*options)
43
+ puts Tlapse::Config.get *options
44
+ rescue Tlapse::NoSuchConfigOption
45
+ Tlapse::Logger.error! "The config option \"#{option}\" does not exist. " \
46
+ "Run tlapse config list for a full list of available options"
47
+ end
48
+
49
+ desc "set OPTION VALUE", "Set the given config option to the given value"
50
+ def set(option, value)
51
+ Tlapse::Config.set option, value
52
+ rescue Tlapse::NoSuchConfigOption
53
+ Tlapse::Logger.error! "The config option \"#{option}\" does not exist. " \
54
+ "Run tlapse config list for a full list of available options"
55
+ rescue Tlapse::ConfigOptionInvalid => invalid
56
+ Tlapse::Logger.error! invalid.message
57
+ end
58
+
59
+ desc "unset OPTION", "Restore the given option to its default state"
60
+ def unset(option)
61
+ Tlapse::Config.unset option
62
+ rescue Tlapse::NoSuchConfigOption
63
+ Tlapse::Logger.error! "The config option \"#{option}\" does not exist. " \
64
+ "Run tlapse config list for a full list of available options"
65
+ end
66
+ end
67
+ end
@@ -0,0 +1,136 @@
1
+ require "yaml"
2
+ require "fileutils"
3
+ require "tlapse/errors"
4
+ require "active_support/time_with_zone"
5
+
6
+ module Tlapse
7
+ class Config
8
+ Validation = Struct.new :method, :error
9
+
10
+ CONFIG_OPTIONS = {
11
+ "lat" => {
12
+ default: 35.779590,
13
+ desc: "Your current latitude",
14
+ type: :float
15
+ },
16
+ "lon" => {
17
+ default: -78.638179,
18
+ desc: "Your current longitude",
19
+ type: :float
20
+ },
21
+ "tz" => {
22
+ default: -> { Tlapse::Config.current_tz },
23
+ desc: "Your current timezone",
24
+ type: :string,
25
+ validations: [
26
+ Validation.new(
27
+ ->(tz) { TZInfo::Timezone.get(tz) },
28
+ ->(tz) do
29
+ zones = ActiveSupport::TimeZone.all.map do |tz|
30
+ tz.tzinfo.name
31
+ end.uniq.sort.join("\n")
32
+
33
+ "#{tz} is not a valid timezone. Valid zones are:\n\n#{zones}"
34
+ end
35
+ )
36
+ ]
37
+ }
38
+ }.freeze
39
+
40
+ CONFIG_KEYS = CONFIG_OPTIONS.keys.freeze
41
+
42
+ CONFIG_PATH = File.expand_path ".config/tlapse/tlapse.yaml", Dir.home
43
+
44
+ CONFIG_UNDEFINED = :undefined
45
+
46
+ def self.list
47
+ CONFIG_OPTIONS
48
+ end
49
+
50
+ def self.get(*options)
51
+ values = Array(options).map do |option|
52
+ verify_option_exists! option
53
+
54
+ value = value_for option
55
+ value == CONFIG_UNDEFINED ? default_for(option) : value
56
+ end
57
+
58
+ values.length == 1 ? values.first : values
59
+ end
60
+
61
+ def self.set(option, value)
62
+ verify_option_exists! option
63
+ validate! option, value
64
+
65
+ values = user_values
66
+
67
+ if value == default_for(option)
68
+ values.delete option
69
+ else
70
+ values[option] = value
71
+ end
72
+
73
+ save values
74
+ end
75
+
76
+ def self.unset(option)
77
+ set option, default_for(option)
78
+ end
79
+
80
+ private
81
+
82
+ def self.current_tz
83
+ utc_offset = Time.now.utc_offset
84
+ tz = ActiveSupport::TimeZone.all.find { |tz| tz.utc_offset == utc_offset }
85
+ tz&.tzinfo&.name || "America/New_York"
86
+ end
87
+
88
+ def self.cast(option, value)
89
+ case type_for(option)
90
+ when :integer then value.to_i
91
+ when :float then value.to_f
92
+ when :string then value.to_s
93
+ else value
94
+ end
95
+ end
96
+
97
+ def self.verify_option_exists!(option)
98
+ raise Tlapse::NoSuchConfigOption unless CONFIG_KEYS.include? option
99
+ end
100
+
101
+ def self.value_for(option)
102
+ value = user_values[option]
103
+ value ? cast(option, value) : CONFIG_UNDEFINED
104
+ end
105
+
106
+ def self.default_for(option)
107
+ default = CONFIG_OPTIONS.dig option, :default
108
+ default = default.call if default.respond_to? :call
109
+ cast option, default
110
+ end
111
+
112
+ def self.type_for(option)
113
+ CONFIG_OPTIONS.dig option, :type
114
+ end
115
+
116
+ def self.user_values
117
+ File.exists?(CONFIG_PATH) ? YAML.load_file(CONFIG_PATH) : {}
118
+ end
119
+
120
+ def self.save(user_values)
121
+ FileUtils.mkdir_p File.dirname CONFIG_PATH
122
+ File.write CONFIG_PATH, user_values.to_yaml
123
+ end
124
+
125
+ def self.validate!(option, value)
126
+ Array(CONFIG_OPTIONS.dig(option, :validations)).each do |validation|
127
+ begin
128
+ validation.method.call value
129
+ rescue
130
+ message = validation.error.call value
131
+ raise ConfigOptionInvalid, message
132
+ end
133
+ end
134
+ end
135
+ end
136
+ end
@@ -0,0 +1,4 @@
1
+ module Tlapse
2
+ class NoSuchConfigOption < StandardError; end
3
+ class ConfigOptionInvalid < StandardError; end
4
+ end
@@ -0,0 +1,18 @@
1
+ require "rainbow"
2
+
3
+ module Tlapse
4
+ class Logger
5
+ ERROR_COLOR = :red
6
+
7
+ def self.error(message)
8
+ puts Rainbow(message).fg ERROR_COLOR
9
+ end
10
+
11
+ ##
12
+ # Print the error message and then exit
13
+ def self.error!(message, exit_code: 1)
14
+ error message
15
+ exit exit_code
16
+ end
17
+ end
18
+ end
@@ -1,26 +1,26 @@
1
1
  require "solareventcalculator"
2
+ require "tlapse/config"
2
3
 
3
4
  module Tlapse
4
5
  module SolarEvent
5
- LAT = 35.779590
6
- LON = -78.638179
7
- TZ = "America/New_York"
8
-
9
6
  def self.sunrise
10
- s = solar_event.compute_official_sunrise(TZ)
11
- n = Time.new
7
+ tz = Tlapse::Config.get "tz"
8
+ s = solar_event.compute_official_sunrise(tz)
9
+ n = Time.new
12
10
  Time.new(n.year, n.month, n.day, s.hour, s.minute)
13
11
  end
14
12
 
15
13
  def self.sunset
16
- s = solar_event.compute_official_sunset(TZ)
17
- n = Time.new
14
+ tz = Tlapse::Config.get "tz"
15
+ s = solar_event.compute_official_sunset(tz)
16
+ n = Time.new
18
17
  Time.new(n.year, n.month, n.day, s.hour, s.minute)
19
18
  end
20
19
 
21
20
  def self.solar_event
22
21
  date = Date.new
23
- SolarEventCalculator.new date, LAT, LON
22
+ lat, lon = Tlapse::Config.get "lat", "lon"
23
+ SolarEventCalculator.new date, lat, lon
24
24
  end
25
25
  end
26
26
  end
data/lib/tlapse/util.rb CHANGED
@@ -2,18 +2,29 @@ require "fileutils"
2
2
 
3
3
  module Tlapse
4
4
  class Util
5
- def self.normalize!(dry_run: false)
5
+ def self.organize!(dry_run: false)
6
6
  Dir["*.jpg"].each do |filename|
7
- normalized = normalize_filename(filename)
8
- if filename != normalized
9
- puts "Rename #{filename} to #{normalized}"
10
- FileUtils.mv(filename, normalized) unless dry_run
11
- end
7
+ normalize_path! filename, dry_run: dry_run
12
8
  end
13
9
  end
14
10
 
15
- def self.normalize_filename(file)
16
- File.mtime(file).strftime(Tlapse::Capture::CAPTURE_FILENAME)
11
+ def self.normalize_path!(file, dry_run: false)
12
+ dirname = normalized_dirname(file)
13
+ FileUtils.mkdir dirname unless File.exist? dirname || dry_run
14
+
15
+ filename = normalized_filename(file)
16
+ path = File.join dirname, filename
17
+
18
+ puts "Rename #{file} to #{path}"
19
+ FileUtils.mv file, path unless dry_run
20
+ end
21
+
22
+ def self.normalized_dirname(file)
23
+ File.mtime(file).strftime(Tlapse::Capture.capture_dirname)
24
+ end
25
+
26
+ def self.normalized_filename(file)
27
+ File.mtime(file).strftime(Tlapse::Capture.capture_filename)
17
28
  end
18
29
  end
19
30
  end
@@ -1,3 +1,3 @@
1
1
  module Tlapse
2
- VERSION = "0.6.2"
2
+ VERSION = "0.9.0"
3
3
  end
data/lib/tlapse/video.rb CHANGED
@@ -9,7 +9,7 @@ module Tlapse
9
9
  @outfile = opts.fetch :out, "out.mkv"
10
10
  end
11
11
 
12
- def create!
12
+ def create_command
13
13
  command = "ffmpeg"
14
14
  command += " -pattern_type glob"
15
15
  command += " -i '*.jpg'"
@@ -17,15 +17,17 @@ module Tlapse
17
17
  command += " -r #{@framerate}"
18
18
  command += " -vcodec #{@codec}"
19
19
  command += " #{@outfile}"
20
- puts command
21
- exec command
20
+ command
21
+ end
22
+
23
+ def create!
24
+ cmd = create_command
25
+ puts cmd
26
+ exec cmd
22
27
  end
23
28
 
24
- ##
25
- # @return whether the output file already exists
26
29
  def outfile_exists?
27
30
  File.exist? @outfile
28
31
  end
29
-
30
- end # Video
31
- end # Tlapse
32
+ end
33
+ end
data/tlapse.gemspec CHANGED
@@ -1,13 +1,13 @@
1
1
  # coding: utf-8
2
- lib = File.expand_path('../lib', __FILE__)
2
+ lib = File.expand_path("../lib", __FILE__)
3
3
  $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
- require 'tlapse/version'
4
+ require "tlapse/version"
5
5
 
6
6
  Gem::Specification.new do |spec|
7
7
  spec.name = "tlapse"
8
8
  spec.version = Tlapse::VERSION
9
9
  spec.authors = ["Justin Toniazzo"]
10
- spec.email = ["jutonz42@gmail.com"]
10
+ spec.email = ["jutonz@hey.com"]
11
11
 
12
12
  spec.summary = "Automated time lapse photography via gphoto2"
13
13
  spec.homepage = "https://github.com/jutonz/tlapse"
@@ -18,13 +18,17 @@ Gem::Specification.new do |spec|
18
18
  spec.executables = %w(tlapse)
19
19
  spec.require_paths = ["lib"]
20
20
 
21
- spec.add_development_dependency "bundler", "~> 1.11"
21
+ spec.required_ruby_version = ">= 2.5"
22
+
23
+ spec.add_development_dependency "bundler", "~> 2.1"
22
24
  spec.add_development_dependency "rake", "~> 10.0"
23
25
  spec.add_development_dependency "rspec", "~> 3.0"
24
26
  spec.add_development_dependency "byebug", "~> 8.2"
25
27
  spec.add_development_dependency "timecop", "~> 0.8"
28
+ spec.add_development_dependency "simplecov", "~> 0.15"
26
29
 
27
- spec.add_dependency "activesupport", ">= 5.0.0.beta3", "< 5.1"
30
+ spec.add_dependency "activesupport", "~> 5"
28
31
  spec.add_dependency "RubySunrise", "~> 0.3"
29
32
  spec.add_dependency "thor", "~> 0.20"
33
+ spec.add_dependency "rainbow", "~> 3"
30
34
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: tlapse
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.2
4
+ version: 0.9.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Justin Toniazzo
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2017-12-20 00:00:00.000000000 Z
11
+ date: 2021-05-31 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -16,14 +16,14 @@ dependencies:
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: '1.11'
19
+ version: '2.1'
20
20
  type: :development
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: '1.11'
26
+ version: '2.1'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: rake
29
29
  requirement: !ruby/object:Gem::Requirement
@@ -81,25 +81,33 @@ dependencies:
81
81
  - !ruby/object:Gem::Version
82
82
  version: '0.8'
83
83
  - !ruby/object:Gem::Dependency
84
- name: activesupport
84
+ name: simplecov
85
85
  requirement: !ruby/object:Gem::Requirement
86
86
  requirements:
87
- - - ">="
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: '0.15'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
88
95
  - !ruby/object:Gem::Version
89
- version: 5.0.0.beta3
90
- - - "<"
96
+ version: '0.15'
97
+ - !ruby/object:Gem::Dependency
98
+ name: activesupport
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - "~>"
91
102
  - !ruby/object:Gem::Version
92
- version: '5.1'
103
+ version: '5'
93
104
  type: :runtime
94
105
  prerelease: false
95
106
  version_requirements: !ruby/object:Gem::Requirement
96
107
  requirements:
97
- - - ">="
98
- - !ruby/object:Gem::Version
99
- version: 5.0.0.beta3
100
- - - "<"
108
+ - - "~>"
101
109
  - !ruby/object:Gem::Version
102
- version: '5.1'
110
+ version: '5'
103
111
  - !ruby/object:Gem::Dependency
104
112
  name: RubySunrise
105
113
  requirement: !ruby/object:Gem::Requirement
@@ -128,20 +136,34 @@ dependencies:
128
136
  - - "~>"
129
137
  - !ruby/object:Gem::Version
130
138
  version: '0.20'
139
+ - !ruby/object:Gem::Dependency
140
+ name: rainbow
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - "~>"
144
+ - !ruby/object:Gem::Version
145
+ version: '3'
146
+ type: :runtime
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - "~>"
151
+ - !ruby/object:Gem::Version
152
+ version: '3'
131
153
  description:
132
154
  email:
133
- - jutonz42@gmail.com
155
+ - jutonz@hey.com
134
156
  executables:
135
157
  - tlapse
136
158
  extensions: []
137
159
  extra_rdoc_files: []
138
160
  files:
139
161
  - ".editorconfig"
162
+ - ".github/workflows/publish.yml"
163
+ - ".github/workflows/ruby.yml"
140
164
  - ".gitignore"
141
165
  - ".rspec"
142
166
  - ".ruby-version"
143
- - ".travis.yml"
144
- - ":w"
145
167
  - Gemfile
146
168
  - LICENSE.txt
147
169
  - README.md
@@ -153,7 +175,11 @@ files:
153
175
  - lib/tlapse/capture.rb
154
176
  - lib/tlapse/cli/alpha.rb
155
177
  - lib/tlapse/cli/cli.rb
178
+ - lib/tlapse/cli/config.rb
179
+ - lib/tlapse/config.rb
156
180
  - lib/tlapse/doctor.rb
181
+ - lib/tlapse/errors.rb
182
+ - lib/tlapse/logger.rb
157
183
  - lib/tlapse/server.rb
158
184
  - lib/tlapse/solar_event.rb
159
185
  - lib/tlapse/util.rb
@@ -172,15 +198,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
172
198
  requirements:
173
199
  - - ">="
174
200
  - !ruby/object:Gem::Version
175
- version: '0'
201
+ version: '2.5'
176
202
  required_rubygems_version: !ruby/object:Gem::Requirement
177
203
  requirements:
178
204
  - - ">="
179
205
  - !ruby/object:Gem::Version
180
206
  version: '0'
181
207
  requirements: []
182
- rubyforge_project:
183
- rubygems_version: 2.7.3
208
+ rubygems_version: 3.1.4
184
209
  signing_key:
185
210
  specification_version: 4
186
211
  summary: Automated time lapse photography via gphoto2
data/.travis.yml DELETED
@@ -1,13 +0,0 @@
1
- language: ruby
2
- rvm:
3
- - 2.4.2
4
- before_install:
5
- - gem install bundler -v 1.16.0
6
- deploy:
7
- provider: rubygems
8
- api_key:
9
- secure: ADSomrV73iRb/Xp7cV5nFd4z1uj976o7RlOzHAD93GL5vc6SrF6XXo19llAvU2mUm/VnAMzddv5dGsMegCIuZy83dA0mrdVws0EDeG1UKvPxPR5PVBm+IqYNQzAAQvgoEMiZnAZwBCwFTo8IUAj6camleklOQZzaRwfn/SGXt8wQNrUCVQrR/6+eRo86Thj1DTkJ1NTVOtZ15Z6u2Pvd3zFo4LohAcGVxYAW4hnRcw/czPyXnzYJu7XPT72MLA3FCaV4SBuhd7NlsOVdRThOZ+vbfCr/JgkqUcaBglWX2SqzNOQTC7tWFOO5dAQ9ekAmjEe45/ALFq9I6YFrdvbHhoJltls32k40F2TwL9Oqu+Or6n410elTC3/ltf2Ir4W31/RDq+6kWd8RBQ052fYicQwTxuO0N3rsOqdxZwmWJc/DPg+0Fau5KLjc0nD/Q2Kr1grcJ+48bRZxrMHUAeTzVsTCSPR+nY1ZrtWmJmVhdyyKT/xApW5OyQDB8EO3+5GtBb9ab8oTkMd2guDn9rydZv7OGlBMbItEme1cqhsLSsUX+YZrWsoRFnywL3ntSSCq7s9ergCrcIayp/loV6fWM4YLjRdWoB6K6fbYGgMW00HKEOr0lus+5pP+gUMxjoLLa/pBnv6kDq4VlpkPp3raUyXAuH/RxSHZsKAQ1CZWfSo=
10
- gem: tlapse
11
- on:
12
- tags: true
13
- repo: jutonz/tlapse
data/:w DELETED
@@ -1,3 +0,0 @@
1
- module Tlapse
2
- VERSION = "0.6.0"
3
- end