sifttter-redux 0.5.4 → 0.6
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +1 -0
- data/.travis.yml +5 -1
- data/Gemfile +1 -0
- data/Rakefile +78 -25
- data/bin/srd +74 -63
- data/features/1.ui.feature +7 -0
- data/features/2.initialization.feature +130 -0
- data/features/step_definitions/sifttter-redux_steps.rb +19 -0
- data/features/support/env.rb +20 -0
- data/lib/sifttter-redux/constants.rb +33 -0
- data/lib/{sifttter_redux/date_range_maker.rb → sifttter-redux/date-range-maker.rb} +23 -47
- data/lib/sifttter-redux/dropbox-uploader.rb +64 -0
- data/lib/{sifttter_redux → sifttter-redux}/sifttter.rb +16 -21
- data/lib/sifttter-redux.rb +164 -0
- data/res/preference_prompts.yaml +17 -0
- data/{sifttter_redux.gemspec → sifttter-redux.gemspec} +2 -1
- data/test/date_range_maker_test.rb +1 -1
- data/tmp/srd/.dropbox_uploader +0 -0
- data/tmp/srd/.sifttter_redux +13 -0
- data/tmp/srd/.sifttter_redux_log +10 -0
- metadata +34 -14
- data/lib/sifttter_redux/cli_message.rb +0 -270
- data/lib/sifttter_redux/configuration.rb +0 -89
- data/lib/sifttter_redux/dropbox_uploader.rb +0 -77
- data/lib/sifttter_redux/version.rb +0 -6
- data/lib/sifttter_redux.rb +0 -218
- data/test/cli_message_test.rb +0 -54
- data/test/configuration_test.rb +0 -78
@@ -1,77 +0,0 @@
|
|
1
|
-
module SifttterRedux
|
2
|
-
# ======================================================
|
3
|
-
# DropboxUploader Class
|
4
|
-
#
|
5
|
-
# Wrapper class for the Dropbox Uploader project
|
6
|
-
# ======================================================
|
7
|
-
class DropboxUploader
|
8
|
-
# ====================================================
|
9
|
-
# Constants
|
10
|
-
# ====================================================
|
11
|
-
CONFIG_FILEPATH = File.join(ENV['HOME'], '.dropbox_uploader')
|
12
|
-
DEFAULT_MESSAGE = 'RUNNING DROPBOX UPLOADER'
|
13
|
-
|
14
|
-
# ====================================================
|
15
|
-
# Attributes
|
16
|
-
# ====================================================
|
17
|
-
attr_accessor :local_target, :remote_target, :message, :verbose
|
18
|
-
|
19
|
-
# ====================================================
|
20
|
-
# Methods
|
21
|
-
# ====================================================
|
22
|
-
# ----------------------------------------------------
|
23
|
-
# initialize method
|
24
|
-
#
|
25
|
-
# Loads the location of dropbox_uploader.sh.
|
26
|
-
# @param dbu_path The local filepath to the script
|
27
|
-
# @logger A Logger to use
|
28
|
-
# @return Void
|
29
|
-
# ----------------------------------------------------
|
30
|
-
def initialize(dbu_path, logger = nil)
|
31
|
-
@dbu = dbu_path
|
32
|
-
@logger = logger
|
33
|
-
end
|
34
|
-
|
35
|
-
# ----------------------------------------------------
|
36
|
-
# download method
|
37
|
-
#
|
38
|
-
# Downloads files from Dropbox (assumes that both
|
39
|
-
# local_target and remote_target have been set).
|
40
|
-
# @return Void
|
41
|
-
# ----------------------------------------------------
|
42
|
-
def download
|
43
|
-
if !@local_target.nil? && !@remote_target.nil?
|
44
|
-
if @verbose
|
45
|
-
system "#{ @dbu } download #{ @remote_target } #{ @local_target }"
|
46
|
-
else
|
47
|
-
exec = `#{ @dbu } download #{ @remote_target } #{ @local_target }`
|
48
|
-
end
|
49
|
-
else
|
50
|
-
error_msg = 'Local and remote targets cannot be nil'
|
51
|
-
@logger.error(error_msg) if @logger
|
52
|
-
fail StandardError, error_msg
|
53
|
-
end
|
54
|
-
end
|
55
|
-
|
56
|
-
# ----------------------------------------------------
|
57
|
-
# upload method
|
58
|
-
#
|
59
|
-
# Uploads files tro Dropbox (assumes that both
|
60
|
-
# local_target and remote_target have been set).
|
61
|
-
# @return Void
|
62
|
-
# ----------------------------------------------------
|
63
|
-
def upload
|
64
|
-
if !@local_target.nil? && !@remote_target.nil?
|
65
|
-
if @verbose
|
66
|
-
system "#{ @dbu } upload #{ @local_target } #{ @remote_target }"
|
67
|
-
else
|
68
|
-
exec = `#{ @dbu } upload #{ @local_target } #{ @remote_target }`
|
69
|
-
end
|
70
|
-
else
|
71
|
-
error_msg = 'Local and remote targets cannot be nil'
|
72
|
-
@logger.error(error_msg) if @logger
|
73
|
-
fail StandardError, error_msg
|
74
|
-
end
|
75
|
-
end
|
76
|
-
end
|
77
|
-
end
|
@@ -1,6 +0,0 @@
|
|
1
|
-
module SifttterRedux
|
2
|
-
DESCRIPTION = 'A customized IFTTT-to-Day One service that allows for smart installation and automated running on a standalone *NIX device (such as a Raspberry Pi).'
|
3
|
-
SUMMARY = 'Automated IFTTT to Day One engine.'
|
4
|
-
VERSION = '0.5.4'
|
5
|
-
NEWEST_CONFIG_VERSION = '0.5.4'
|
6
|
-
end
|
data/lib/sifttter_redux.rb
DELETED
@@ -1,218 +0,0 @@
|
|
1
|
-
require 'sifttter_redux/cli_message'
|
2
|
-
require 'sifttter_redux/configuration'
|
3
|
-
require 'sifttter_redux/date_range_maker'
|
4
|
-
require 'sifttter_redux/dropbox_uploader'
|
5
|
-
require 'sifttter_redux/sifttter'
|
6
|
-
require 'sifttter_redux/version'
|
7
|
-
|
8
|
-
# ======================================================
|
9
|
-
# SifttterRedux Module
|
10
|
-
#
|
11
|
-
# Wrapper module for all other modules in this project
|
12
|
-
# ======================================================
|
13
|
-
|
14
|
-
module SifttterRedux
|
15
|
-
attr_accessor :verbose
|
16
|
-
|
17
|
-
# ====================================================
|
18
|
-
# Constants
|
19
|
-
# ====================================================
|
20
|
-
DBU_CONFIG_FILEPATH = File.join(ENV['HOME'], '.dropbox_uploader')
|
21
|
-
DBU_LOCAL_FILEPATH = '/usr/local/opt'
|
22
|
-
|
23
|
-
DO_LOCAL_FILEPATH = '/tmp/dayone'
|
24
|
-
DO_REMOTE_FILEPATH = "/Apps/Day\\ One/Journal.dayone/entries"
|
25
|
-
|
26
|
-
SFT_LOCAL_FILEPATH = '/tmp/sifttter'
|
27
|
-
SFT_REMOTE_FILEPATH = '/Apps/ifttt/sifttter'
|
28
|
-
|
29
|
-
SRD_CONFIG_FILEPATH = File.join(ENV['HOME'], '.sifttter_redux')
|
30
|
-
SRD_LOG_FILEPATH = File.join(ENV['HOME'], '.sifttter_redux_log')
|
31
|
-
|
32
|
-
# ====================================================
|
33
|
-
# Methods
|
34
|
-
# ====================================================
|
35
|
-
# ----------------------------------------------------
|
36
|
-
# cleanup_temp_files method
|
37
|
-
#
|
38
|
-
# Removes temporary directories and their contents
|
39
|
-
# @return Void
|
40
|
-
# ----------------------------------------------------
|
41
|
-
def self.cleanup_temp_files
|
42
|
-
dirs = [
|
43
|
-
Configuration::sifttter_redux[:dayone_local_filepath],
|
44
|
-
Configuration::sifttter_redux[:sifttter_local_filepath]
|
45
|
-
]
|
46
|
-
|
47
|
-
CLIMessage::info_block('Removing temporary local files...') do
|
48
|
-
dirs.each do |d|
|
49
|
-
FileUtils.rm_rf(d)
|
50
|
-
CLIMessage::debug("Removed directory: #{ d }")
|
51
|
-
end
|
52
|
-
end
|
53
|
-
end
|
54
|
-
|
55
|
-
# ----------------------------------------------------
|
56
|
-
# install_wizard method
|
57
|
-
#
|
58
|
-
# Runs a wizard that installs Dropbox Uploader on the
|
59
|
-
# local filesystem.
|
60
|
-
# @return Void
|
61
|
-
# ----------------------------------------------------
|
62
|
-
def self.dbu_install_wizard(init_from_scratch = false)
|
63
|
-
valid_path_chosen = false
|
64
|
-
|
65
|
-
CLIMessage::section_block('CONFIGURING DROPBOX UPLOADER...') do
|
66
|
-
until valid_path_chosen
|
67
|
-
# Prompt the user for a location to save Dropbox Uploader.
|
68
|
-
if init_from_scratch && !Configuration::db_uploader[:base_filepath].nil?
|
69
|
-
default = Configuration::db_uploader[:base_filepath]
|
70
|
-
else
|
71
|
-
default = DBU_LOCAL_FILEPATH
|
72
|
-
end
|
73
|
-
path = CLIMessage::prompt('Location for Dropbox-Uploader', default)
|
74
|
-
path = default if path.empty?
|
75
|
-
path.chop! if path.end_with?('/')
|
76
|
-
|
77
|
-
# If the entered directory exists, clone the repository.
|
78
|
-
if File.directory?(path)
|
79
|
-
valid_path_chosen = true
|
80
|
-
|
81
|
-
dbu_path = File.join(path, 'Dropbox-Uploader')
|
82
|
-
executable_path = File.join(dbu_path, 'dropbox_uploader.sh')
|
83
|
-
|
84
|
-
if File.directory?(dbu_path)
|
85
|
-
CLIMessage::warning("Using pre-existing Dropbox Uploader at #{ dbu_path }...")
|
86
|
-
else
|
87
|
-
CLIMessage::info_block("Downloading Dropbox Uploader to #{ dbu_path }...", 'Done.', true) do
|
88
|
-
system "git clone https://github.com/andreafabrizi/Dropbox-Uploader.git #{ dbu_path }"
|
89
|
-
end
|
90
|
-
end
|
91
|
-
|
92
|
-
# If the user has never configured Dropbox Uploader, have them do it here.
|
93
|
-
unless File.exists?(DBU_CONFIG_FILEPATH)
|
94
|
-
CLIMessage::info_block('Initializing Dropbox Uploader...') { system "#{ executable_path }" }
|
95
|
-
end
|
96
|
-
|
97
|
-
Configuration::add_section(:db_uploader) unless init_from_scratch
|
98
|
-
Configuration::db_uploader.merge!({
|
99
|
-
base_filepath: path,
|
100
|
-
dbu_filepath: dbu_path,
|
101
|
-
exe_filepath: executable_path
|
102
|
-
})
|
103
|
-
else
|
104
|
-
CLIMessage::error("Sorry, but #{ path } isn't a valid directory.")
|
105
|
-
end
|
106
|
-
end
|
107
|
-
end
|
108
|
-
end
|
109
|
-
|
110
|
-
# ----------------------------------------------------
|
111
|
-
# get_dates_from_options method
|
112
|
-
#
|
113
|
-
# Creates a date range from the supplied command line
|
114
|
-
# options.
|
115
|
-
# @param options A Hash of command line options
|
116
|
-
# @return Range
|
117
|
-
# ----------------------------------------------------
|
118
|
-
def self.get_dates_from_options(options)
|
119
|
-
CLIMessage::section_block('EXECUTING...') do
|
120
|
-
if options[:c] || options[:n] || options[:w] || options[:y] || options[:f] || options[:t]
|
121
|
-
# Yesterday
|
122
|
-
r = DateRangeMaker.yesterday if options[:y]
|
123
|
-
|
124
|
-
# Current Week
|
125
|
-
r = DateRangeMaker.last_n_weeks(0, options[:i]) if options[:c]
|
126
|
-
|
127
|
-
# Last N Days
|
128
|
-
r = DateRangeMaker.last_n_days(options[:n].to_i, options[:i]) if options[:n]
|
129
|
-
|
130
|
-
# Last N Weeks
|
131
|
-
r = DateRangeMaker.last_n_weeks(options[:w].to_i, options[:i]) if options[:w]
|
132
|
-
|
133
|
-
# Custom Range
|
134
|
-
if (options[:f] || options[:t])
|
135
|
-
_dates = DateRangeMaker.range(options[:f], options[:t], options[:i])
|
136
|
-
|
137
|
-
if _dates.last > Date.today
|
138
|
-
long_message = "Ignoring overextended end date and using today's date (#{ Date.today })..."
|
139
|
-
CLIMessage::warning(long_message)
|
140
|
-
r = (_dates.first..Date.today)
|
141
|
-
else
|
142
|
-
r = (_dates.first.._dates.last)
|
143
|
-
end
|
144
|
-
end
|
145
|
-
else
|
146
|
-
r = DateRangeMaker.today
|
147
|
-
end
|
148
|
-
|
149
|
-
CLIMessage::debug("Date range: #{ r }")
|
150
|
-
r
|
151
|
-
end
|
152
|
-
end
|
153
|
-
|
154
|
-
# ----------------------------------------------------
|
155
|
-
# initialize_procedures method
|
156
|
-
#
|
157
|
-
# Initializes Sifttter Redux by downloading and
|
158
|
-
# collecting all necessary items and info.
|
159
|
-
# @return Void
|
160
|
-
# ----------------------------------------------------
|
161
|
-
def self.init(init_from_scratch = false)
|
162
|
-
if init_from_scratch
|
163
|
-
Configuration::reset
|
164
|
-
Configuration::add_section(:sifttter_redux)
|
165
|
-
end
|
166
|
-
|
167
|
-
Configuration::sifttter_redux.merge!({
|
168
|
-
config_location: Configuration::config_path,
|
169
|
-
log_level: 'WARN',
|
170
|
-
version: VERSION,
|
171
|
-
})
|
172
|
-
|
173
|
-
# Run the wizard to download Dropbox Uploader.
|
174
|
-
dbu_install_wizard(init_from_scratch = init_from_scratch)
|
175
|
-
|
176
|
-
# Collect other misc. preferences.
|
177
|
-
CLIMessage::section_block('COLLECTING PREFERENCES...') do
|
178
|
-
pref_prompts = [
|
179
|
-
{
|
180
|
-
prompt: 'Temporary path to download Sifttter files to',
|
181
|
-
default: SFT_LOCAL_FILEPATH,
|
182
|
-
key: :sifttter_local_filepath,
|
183
|
-
section: :sifttter_redux
|
184
|
-
},
|
185
|
-
{
|
186
|
-
prompt: 'Path to Sifttter files in Dropbox',
|
187
|
-
default: SFT_REMOTE_FILEPATH,
|
188
|
-
key: :sifttter_remote_filepath,
|
189
|
-
section: :sifttter_redux
|
190
|
-
},
|
191
|
-
{
|
192
|
-
prompt: 'Temporary path to download Day One files to',
|
193
|
-
default: DO_LOCAL_FILEPATH,
|
194
|
-
key: :dayone_local_filepath,
|
195
|
-
section: :sifttter_redux
|
196
|
-
},
|
197
|
-
{
|
198
|
-
prompt: 'Path to Day One files in Dropbox',
|
199
|
-
default: DO_REMOTE_FILEPATH,
|
200
|
-
key: :dayone_remote_filepath,
|
201
|
-
section: :sifttter_redux
|
202
|
-
}
|
203
|
-
]
|
204
|
-
|
205
|
-
pref_prompts.each do |prompt|
|
206
|
-
d = init_from_scratch ? prompt[:default] : Configuration::send(prompt[:section])[prompt[:key]]
|
207
|
-
pref = CLIMessage::prompt(prompt[:prompt], d)
|
208
|
-
pref = File.expand_path(pref) if pref.start_with?('~')
|
209
|
-
|
210
|
-
Configuration::send(prompt[:section]).merge!(prompt[:key] => pref)
|
211
|
-
CLIMessage::debug("Value for #{ prompt[:key] }: #{ pref }")
|
212
|
-
end
|
213
|
-
end
|
214
|
-
|
215
|
-
CLIMessage::debug("Configuration values: #{ Configuration::dump }")
|
216
|
-
Configuration::save
|
217
|
-
end
|
218
|
-
end
|
data/test/cli_message_test.rb
DELETED
@@ -1,54 +0,0 @@
|
|
1
|
-
require 'readline'
|
2
|
-
require 'test_helper'
|
3
|
-
require File.join(File.dirname(__FILE__), '..', 'lib/sifttter_redux/cli_message.rb')
|
4
|
-
|
5
|
-
class CLIMessageTest < Test::Unit::TestCase
|
6
|
-
def setup
|
7
|
-
SifttterRedux::CLIMessage::deactivate_logging
|
8
|
-
end
|
9
|
-
|
10
|
-
def test_error_message
|
11
|
-
assert_output('# test'.red + "\n") { SifttterRedux::CLIMessage::error('test') }
|
12
|
-
end
|
13
|
-
|
14
|
-
def test_info_message
|
15
|
-
assert_output('# test'.blue + "\n") { SifttterRedux::CLIMessage::info('test') }
|
16
|
-
end
|
17
|
-
|
18
|
-
def test_info_block_single_line
|
19
|
-
assert_output("# start".blue + "body\n" + 'end'.blue + "\n") do
|
20
|
-
SifttterRedux::CLIMessage::info_block('start', 'end') { puts 'body' }
|
21
|
-
end
|
22
|
-
end
|
23
|
-
|
24
|
-
def test_info_block_multiline
|
25
|
-
assert_output("# start".blue + "\nbody\n" + '# end'.blue + "\n") do
|
26
|
-
SifttterRedux::CLIMessage::info_block('start', 'end', true) { puts 'body' }
|
27
|
-
end
|
28
|
-
end
|
29
|
-
|
30
|
-
def test_info_block_no_block
|
31
|
-
assert_raise ArgumentError do
|
32
|
-
SifttterRedux::CLIMessage::info_block('start', 'end', true)
|
33
|
-
end
|
34
|
-
end
|
35
|
-
|
36
|
-
def test_section_message
|
37
|
-
assert_output('---> test'.purple + "\n") { SifttterRedux::CLIMessage::section('test') }
|
38
|
-
end
|
39
|
-
|
40
|
-
def test_section_block_single_line
|
41
|
-
assert_output("---> section".purple + "\nbody\n") do
|
42
|
-
SifttterRedux::CLIMessage::section_block('section', true) { puts 'body' }
|
43
|
-
end
|
44
|
-
end
|
45
|
-
|
46
|
-
def test_success_message
|
47
|
-
assert_output('# test'.green + "\n") { SifttterRedux::CLIMessage::success('test') }
|
48
|
-
end
|
49
|
-
|
50
|
-
def test_warning_message
|
51
|
-
assert_output('# test'.yellow + "\n") { SifttterRedux::CLIMessage::warning('test') }
|
52
|
-
end
|
53
|
-
|
54
|
-
end
|
data/test/configuration_test.rb
DELETED
@@ -1,78 +0,0 @@
|
|
1
|
-
require 'test_helper'
|
2
|
-
require File.join(File.dirname(__FILE__), '..', 'lib/sifttter_redux/configuration.rb')
|
3
|
-
|
4
|
-
class ConfigurationTest < Test::Unit::TestCase
|
5
|
-
|
6
|
-
def setup
|
7
|
-
SifttterRedux::Configuration::load('/tmp/srd_config')
|
8
|
-
end
|
9
|
-
|
10
|
-
def teardown
|
11
|
-
File.delete('/tmp/srd_config') if File.exists?('/tmp/srd_config')
|
12
|
-
end
|
13
|
-
|
14
|
-
def test_add_data
|
15
|
-
SifttterRedux::Configuration::reset
|
16
|
-
SifttterRedux::Configuration::add_section(:section1)
|
17
|
-
SifttterRedux::Configuration::section1.merge!( a: 'test', b: 'test' )
|
18
|
-
assert_equal(SifttterRedux::Configuration::dump, { section1: { a: 'test', b: 'test' } })
|
19
|
-
|
20
|
-
SifttterRedux::Configuration::section1[:a] = 'bigger test'
|
21
|
-
SifttterRedux::Configuration::section1[:c] = 'little test'
|
22
|
-
assert_equal(SifttterRedux::Configuration::dump, { section1: { a: 'bigger test', b: 'test', c: 'little test' } })
|
23
|
-
end
|
24
|
-
|
25
|
-
def test_add_section
|
26
|
-
SifttterRedux::Configuration::reset
|
27
|
-
SifttterRedux::Configuration::add_section(:section1)
|
28
|
-
SifttterRedux::Configuration::add_section(:section2)
|
29
|
-
assert_equal(SifttterRedux::Configuration::dump, { section1: {}, section2: {} })
|
30
|
-
end
|
31
|
-
|
32
|
-
def test_add_section_duplicate
|
33
|
-
SifttterRedux::Configuration::reset
|
34
|
-
SifttterRedux::Configuration::add_section(:section1)
|
35
|
-
SifttterRedux::Configuration::add_section(:section2)
|
36
|
-
SifttterRedux::Configuration::add_section(:section2)
|
37
|
-
assert_equal(SifttterRedux::Configuration::dump, { section1: {}, section2: {} })
|
38
|
-
end
|
39
|
-
|
40
|
-
def test_config_path
|
41
|
-
assert_equal(SifttterRedux::Configuration::config_path, '/tmp/srd_config')
|
42
|
-
end
|
43
|
-
|
44
|
-
def test_delete_section
|
45
|
-
SifttterRedux::Configuration::reset
|
46
|
-
SifttterRedux::Configuration::add_section(:section1)
|
47
|
-
SifttterRedux::Configuration::add_section(:section2)
|
48
|
-
SifttterRedux::Configuration::delete_section(:section2)
|
49
|
-
assert_equal(SifttterRedux::Configuration::dump, { section1: {} })
|
50
|
-
end
|
51
|
-
|
52
|
-
def test_delete_section_nonexistant
|
53
|
-
SifttterRedux::Configuration::reset
|
54
|
-
SifttterRedux::Configuration::add_section(:section1)
|
55
|
-
SifttterRedux::Configuration::delete_section('section12723762323')
|
56
|
-
assert_equal(SifttterRedux::Configuration::dump, { section1: {} })
|
57
|
-
end
|
58
|
-
|
59
|
-
def test_reset
|
60
|
-
SifttterRedux::Configuration::reset
|
61
|
-
SifttterRedux::Configuration::add_section(:section1)
|
62
|
-
SifttterRedux::Configuration::add_section(:section2)
|
63
|
-
SifttterRedux::Configuration::add_section(:section3)
|
64
|
-
SifttterRedux::Configuration::reset
|
65
|
-
assert_equal(SifttterRedux::Configuration::dump, {})
|
66
|
-
end
|
67
|
-
|
68
|
-
def test_save
|
69
|
-
SifttterRedux::Configuration::reset
|
70
|
-
SifttterRedux::Configuration::add_section(:section1)
|
71
|
-
SifttterRedux::Configuration.section1.merge!({ a: 'test', b: 'test' })
|
72
|
-
SifttterRedux::Configuration::save
|
73
|
-
|
74
|
-
File.open('/tmp/srd_config', 'r') do |f|
|
75
|
-
assert_output("---\n:section1:\n :a: test\n :b: test\n") { puts f.read }
|
76
|
-
end
|
77
|
-
end
|
78
|
-
end
|