tsks 0.0.2 → 0.0.6

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: bf122781e8faff2a45760d9bf8bb6d546d7158c47433ce4dc487ff7faa57b163
4
- data.tar.gz: cb8ab03aa9f5ad004ac243746d2b3b368ccf522fbc734ea20e9c3081c1092882
3
+ metadata.gz: db9ce658ad547edd5932aef5cf8915bfec4ecf2cffa432fdc9c6682e1626a7de
4
+ data.tar.gz: d4bd382ab9592760d95af9e0640518ba811c9a353ca045b9d0a3bffa264479c5
5
5
  SHA512:
6
- metadata.gz: 738bf65c66226c36d14a56c389e970fb789ac98cff0569f4b58aaf02d178ea6d5542beee6c4204bbb4d26eaf91949118dcc2280fc327c8ff1005d1e55395c2ba
7
- data.tar.gz: b763cdfa17b2b5e995eb8fab45fa42034167fa5b48ce9a512be8a2d8a8ff6485a1e60c46f7844e71b07dec4f3527a012e22070075c2075808e4ac09882818d9c
6
+ metadata.gz: 480d699bdc149396e4e1cf716173dda23fb3f0506ceb8a0f911c35f4ed980b4567a7aa18ee6d0153e636d799448c80dac2520fd2d41cd195635197f17f38cbd4
7
+ data.tar.gz: e97aae640703c31732a1582d16c65351ef0c1868f9f13ccfdd1cc1397559509330e4023300bc199a30cd40674e57451ee055ef808110787902dd9eac76b95a22
data/Gemfile CHANGED
@@ -5,7 +5,6 @@ gemspec
5
5
 
6
6
  gem "rake", "~> 12.0"
7
7
  gem "rspec", "~> 3.0"
8
- gem "dotenv", "~> 2.7.6"
9
8
  gem "thor", "~> 1.0.1"
10
9
  gem "sqlite3", "~> 1.4.2"
11
10
  gem "httparty", "~> 0.18.1"
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- tsks (0.0.2)
4
+ tsks (0.0.6)
5
5
  httparty
6
6
  sqlite3
7
7
  thor
@@ -11,7 +11,6 @@ GEM
11
11
  remote: https://rubygems.org/
12
12
  specs:
13
13
  diff-lcs (1.4.4)
14
- dotenv (2.7.6)
15
14
  httparty (0.18.1)
16
15
  mime-types (~> 3.0)
17
16
  multi_xml (>= 0.5.2)
@@ -45,7 +44,6 @@ PLATFORMS
45
44
  ruby
46
45
 
47
46
  DEPENDENCIES
48
- dotenv (~> 2.7.6)
49
47
  httparty (~> 0.18.1)
50
48
  rake (~> 12.0)
51
49
  rspec (~> 3.0)
@@ -55,4 +53,4 @@ DEPENDENCIES
55
53
  uuid (~> 2.3.9)
56
54
 
57
55
  BUNDLED WITH
58
- 2.1.2
56
+ 2.2.22
data/README.md CHANGED
@@ -1,14 +1,17 @@
1
- # tsks-cli
1
+ # tsks
2
2
 
3
- _A stateful command line interface to help you handle your daily tsks
4
- (with contexts!)._
3
+ A stateful command line interface to help you handle your daily tsks (with
4
+ synchronisation and contexts!).
5
+
6
+ [![build](https://travis-ci.com/luanrvmood/tsks.svg?branch=master)](https://travis-ci.com/luanrvmood/tsks)
5
7
 
6
8
  ## Features
7
9
 
8
10
  * Add tsks, check what is already done and list active or archived tsks
9
- * Synchronize your tsks and access them from all your terminals!)
10
- * Increase your daily tsks management with contexts `tsks add tsk --context=today`
11
- (see `tsks help add` for more info!)
11
+ * Synchronise your tsks and access them from all your terminals!
12
+ (soon accessible from a webapp as well)
13
+ * Increase your daily tsks management with contexts using
14
+ `tsks add tsk --context=today` (see `tsks help add` for more info)
12
15
 
13
16
  ## Installation
14
17
 
@@ -20,8 +23,8 @@ gem install tsks
20
23
 
21
24
  After follow the step above you should be able to run `tsks` from your terminal.
22
25
 
23
- _It's important to notice that you will need to run `tsks init` before any other
24
- command to setup stuffs like the storage._
26
+ _It's important to notice that you will need to run `tsks init` to setup stuffs
27
+ like the storage before any other command._
25
28
 
26
29
  ### Adding new tsks
27
30
 
@@ -32,13 +35,13 @@ tsks add "My first tsk"
32
35
  **Adding with context**
33
36
 
34
37
  ```sh
35
- tsks add "Bootstraps my pet project environment --context=Personal"
38
+ tsks add "Bootstraps my pet project environment" --context=Today
36
39
  ```
37
40
 
38
- ### Checking done tsks
41
+ ### Marking tsks as done
39
42
 
40
43
  ```sh
41
- tsks done 2 # Where 2 is the id
44
+ tsks done 2 # Where 2 is the tsk id
42
45
  ```
43
46
 
44
47
  ### Listing your tsks
@@ -50,7 +53,7 @@ tsks list
50
53
  **Filtering by context**
51
54
 
52
55
  ```sh
53
- tsks list --context=Personal
56
+ tsks list --context=Today
54
57
  ```
55
58
 
56
59
  **Or tsks already done**
@@ -61,11 +64,11 @@ tsks list --done
61
64
  **Tip:** It's possible to combine the flags `--done` and `--context` when
62
65
  listing.
63
66
 
64
- ### Synchronizing your tsks
67
+ ### Synchronising your tsks
65
68
 
66
69
  As easy as running `tsks sync`. This command will fetch your tsks from the API,
67
- then filter what is not synced yet from local, and then update both remote and
68
- local tsks with most recent data.
70
+ then filter what is not synchronised yet from local, then update both
71
+ remote and local tsks with most recent data.
69
72
 
70
73
  #### To be able to sync you will need to login or register an account
71
74
 
@@ -87,7 +90,9 @@ After checking out the repo, run `bin/setup` to install dependencies. Then, run
87
90
  `rake spec` to run the tests. You can also run `bin/console` for an interactive
88
91
  prompt that will allow you to experiment.
89
92
 
90
- To install this gem onto your local machine, run `bundle exec rake install`.
93
+ To install this gem onto your local machine, run `bundle exec rake install`
94
+ (This command installs the current tsks version **v0.0.2** in your machine
95
+ path).
91
96
 
92
97
  ## Contributing
93
98
 
data/lib/tsks/actions.rb CHANGED
@@ -9,5 +9,15 @@ module Tsks
9
9
  Tsks::Storage.update tsk[:local_id], {user_id: uuid}
10
10
  end
11
11
  end
12
+
13
+ def self.update_server_for_removed_tsks token
14
+ tsks_uuids = Tsks::Storage.select_removed_uuids
15
+
16
+ if !tsks_uuids.empty?
17
+ for id in tsks_uuids
18
+ Tsks::Request.delete "/tsks/#{id}", token
19
+ end
20
+ end
21
+ end
12
22
  end
13
23
  end
data/lib/tsks/cli.rb CHANGED
@@ -6,12 +6,21 @@ require "tsks/actions"
6
6
 
7
7
  module Tsks
8
8
  class CLI < Thor
9
- @setup_folder = File.expand_path ENV["SETUP_FOLDER"] || "~/.tsks"
9
+ @setup_folder = File.expand_path "~/.tsks"
10
10
 
11
11
  def self.setup_folder
12
12
  @setup_folder
13
13
  end
14
14
 
15
+ def self.setup_folder= folder_path
16
+ @setup_folder = folder_path
17
+ end
18
+
19
+ desc "version", ""
20
+ def version
21
+ puts "tsks #{Tsks::VERSION}"
22
+ end
23
+
15
24
  desc "init", "Setup tsks folder and storage"
16
25
  def init
17
26
  if File.directory? CLI.setup_folder
@@ -82,16 +91,22 @@ module Tsks
82
91
  return puts "tsks was not initialized yet."
83
92
  end
84
93
 
85
- res = Tsks::Request.post "/register", {email: options[:email],
86
- password: options[:password]}
87
-
88
- if res && res[:status_code] == 201
89
- File.write File.join(CLI.setup_folder, "token"), res[:token]
90
- File.write File.join(CLI.setup_folder, "user_id"), res[:user_id]
91
- Tsks::Actions.update_tsks_with_uuid res[:user_id]
92
- puts "Succesfully registered."
93
- elsif res && res[:status_code] == 409
94
- puts "This e-mail is already registered."
94
+ begin
95
+ res = Tsks::Request.post "/register", {email: options[:email],
96
+ password: options[:password]}
97
+
98
+ if res && res[:ok] == true
99
+ File.write File.join(CLI.setup_folder, "token"), res[:token]
100
+ File.write File.join(CLI.setup_folder, "user_id"), res[:user_id]
101
+ Tsks::Actions.update_tsks_with_uuid res[:user_id]
102
+ puts "Succesfully registered."
103
+ elsif res && res[:ok] == false
104
+ puts "This e-mail is already registered."
105
+ end
106
+ rescue Errno::ECONNREFUSED, SocketError
107
+ puts "Failed to connect to the API."
108
+ rescue JSON::ParserError
109
+ puts "Error on reading data from the API."
95
110
  end
96
111
  end
97
112
 
@@ -103,16 +118,22 @@ module Tsks
103
118
  return puts "tsks was not initialized yet."
104
119
  end
105
120
 
106
- res = Tsks::Request.post "/login", {email: options[:email],
107
- password: options[:password]}
108
-
109
- if res && res[:status_code] == 200
110
- File.write File.join(CLI.setup_folder, "token"), res[:token]
111
- File.write File.join(CLI.setup_folder, "user_id"), res[:user_id]
112
- Tsks::Actions.update_tsks_with_uuid res[:user_id]
113
- puts "Succesfully logged in."
114
- elsif res && res[:status_code] == 403
115
- puts "Invalid e-mail or password."
121
+ begin
122
+ res = Tsks::Request.post "/login", {email: options[:email],
123
+ password: options[:password]}
124
+
125
+ if res && res[:ok] == true
126
+ File.write File.join(CLI.setup_folder, "token"), res[:token]
127
+ File.write File.join(CLI.setup_folder, "user_id"), res[:user_id]
128
+ Tsks::Actions.update_tsks_with_uuid res[:user_id]
129
+ puts "Succesfully logged in."
130
+ elsif res && res[:ok] == false
131
+ puts "Invalid e-mail or password."
132
+ end
133
+ rescue Errno::ECONNREFUSED, SocketError
134
+ puts "Failed to connect to the API."
135
+ rescue JSON::ParserError
136
+ puts "Error on reading data from the API."
116
137
  end
117
138
  end
118
139
 
@@ -127,30 +148,52 @@ module Tsks
127
148
  end
128
149
 
129
150
  user_id = File.read File.join CLI.setup_folder, "user_id"
151
+ token = File.read File.join CLI.setup_folder, "token"
130
152
  Tsks::Actions.update_tsks_with_uuid user_id
153
+ Tsks::Actions.update_server_for_removed_tsks token
154
+ Tsks::Storage.delete_removed_uuids
131
155
  local_tsks = Tsks::Storage.select_all local_id=false
132
156
 
133
- token = File.read File.join CLI.setup_folder, "token"
134
- get_res = Tsks::Request.get "/tsks", token
135
157
  remote_tsks = []
136
- for tsk in get_res[:tsks]
137
- tsk[:created_at] = Time.parse(tsk[:created_at]).strftime "%F %T"
138
- tsk[:updated_at] = Time.parse(tsk[:updated_at]).strftime "%F %T"
139
- remote_tsks.append tsk
140
- end
141
-
142
- if get_res && get_res[:status_code] == 200
143
- local_tsks_to_post = local_tsks - remote_tsks
144
- if local_tsks_to_post.count > 0
145
- Tsks::Request.post "/tsks", token, {tsks: local_tsks_to_post}
158
+ begin
159
+ get_res = Tsks::Request.get "/tsks", token
160
+ if get_res[:tsks]
161
+ for tsk in get_res[:tsks]
162
+ tsk[:created_at] = Time.parse(tsk[:created_at]).strftime "%F %T"
163
+ tsk[:updated_at] = Time.parse(tsk[:updated_at]).strftime "%F %T"
164
+ remote_tsks.append tsk
165
+ end
166
+
167
+ if get_res[:ok] == true
168
+ local_tsks_to_post = local_tsks - remote_tsks
169
+ if local_tsks_to_post.count > 0
170
+ Tsks::Request.post "/tsks", token, {tsks: local_tsks_to_post}
171
+ end
172
+
173
+ remote_tsks_to_storage = remote_tsks - local_tsks
174
+ if remote_tsks_to_storage.count > 0
175
+ Tsks::Storage.insert_many remote_tsks_to_storage
176
+ end
177
+
178
+ puts "Your tsks were succesfully synchronized."
179
+ end
146
180
  end
181
+ rescue Errno::ECONNREFUSED, SocketError
182
+ puts "Failed to connect to the API."
183
+ rescue JSON::ParserError
184
+ puts "Error on reading data from the API."
185
+ end
186
+ end
147
187
 
148
- remote_tsks_to_storage = remote_tsks - local_tsks
149
- if remote_tsks_to_storage.count > 0
150
- Tsks::Storage.insert_many remote_tsks_to_storage
151
- end
188
+ desc "remove ID", "..."
189
+ def remove id
190
+ if !File.directory? CLI.setup_folder
191
+ return puts "tsks was not initialized yet."
192
+ end
152
193
 
153
- puts "Your tsks were succesfully synchronized."
194
+ op_status = Tsks::Storage.delete id
195
+ if !op_status
196
+ puts "The specified tsk do not exist."
154
197
  end
155
198
  end
156
199
  end
data/lib/tsks/request.rb CHANGED
@@ -2,7 +2,7 @@ require "httparty"
2
2
 
3
3
  module Tsks
4
4
  class Request
5
- @base_uri = ENV["BASE_API_URI"] || "https://tsks-api.herokuapp.com/v1"
5
+ @base_uri = "https://tsks-api.herokuapp.com/v1"
6
6
 
7
7
  def self.base_uri
8
8
  @base_uri
@@ -27,6 +27,12 @@ module Tsks
27
27
  parsed_res = parse_response res.body
28
28
  end
29
29
 
30
+ def self.delete endpoint, token
31
+ uri = URI "#{Request.base_uri}#{endpoint}"
32
+ res = HTTParty.delete uri, headers: {authorization: "Bearer #{token}"}
33
+ parsed_res = parse_response res.body
34
+ end
35
+
30
36
  private
31
37
 
32
38
  def self.parse_response body
data/lib/tsks/storage.rb CHANGED
@@ -16,6 +16,12 @@ module Tsks
16
16
  updated_at VARCHAR NOT NULL
17
17
  )
18
18
  SQL
19
+
20
+ storage.execute <<-SQL
21
+ CREATE TABLE removed_tsks (
22
+ tsk_uuid VARCHAR UNIQUE NOT NULL
23
+ )
24
+ SQL
19
25
  end
20
26
 
21
27
  def self.insert tsk, ctx=nil
@@ -103,6 +109,34 @@ module Tsks
103
109
  tsks = structure_tsks(raw_tsks, local_id=local_id)
104
110
  end
105
111
 
112
+ def self.delete local_id
113
+ storage = get_storage_instance
114
+ removed_tsks = storage
115
+ .execute("SELECT * FROM tsks WHERE rowid=?", local_id)
116
+ if removed_tsks.empty?
117
+ return false
118
+ end
119
+ storage
120
+ .execute("INSERT INTO removed_tsks (tsk_uuid) VALUES (?)", removed_tsks[0][0])
121
+ storage.execute("DELETE FROM tsks WHERE rowid=?", local_id)
122
+ end
123
+
124
+ def self.select_removed_uuids
125
+ storage = get_storage_instance
126
+ result = storage.execute("SELECT * FROM removed_tsks")
127
+
128
+ tsk_uuids = []
129
+ for item in result
130
+ tsk_uuids.append item[0]
131
+ end
132
+ return tsk_uuids
133
+ end
134
+
135
+ def self.delete_removed_uuids
136
+ storage = get_storage_instance
137
+ storage.execute("DELETE FROM removed_tsks")
138
+ end
139
+
106
140
  private
107
141
 
108
142
  def self.get_storage_instance
data/lib/tsks/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Tsks
2
- VERSION = "0.0.2"
2
+ VERSION = "0.0.6"
3
3
  end
data/lib/tsks.rb CHANGED
@@ -1,4 +1,3 @@
1
- require "dotenv/load"
2
1
  require "tsks/version"
3
2
  require "tsks/cli"
4
3
 
data/tsks.gemspec CHANGED
@@ -5,7 +5,7 @@ Gem::Specification.new do |spec|
5
5
  spec.version = Tsks::VERSION
6
6
  spec.authors = ["Luan F. R. Vicente"]
7
7
  spec.email = ["luanrvmood@gmail.com"]
8
- spec.summary = "A stateful command line interface to help you handle your daily tsks (with contexts!)"
8
+ spec.summary = "A stateful command line interface to help you handle your daily tsks (with synchronisation and contexts!)"
9
9
  spec.homepage = "https://github.com/luanrvmood/tsks"
10
10
  spec.required_ruby_version = Gem::Requirement.new(">= 2.3.0")
11
11
  spec.metadata["allowed_push_host"] = "https://rubygems.org"
@@ -18,7 +18,6 @@ Gem::Specification.new do |spec|
18
18
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
19
19
  spec.require_paths = ["lib"]
20
20
  spec.add_development_dependency "rspec"
21
- spec.add_development_dependency "dotenv"
22
21
  spec.add_dependency "thor"
23
22
  spec.add_dependency "sqlite3"
24
23
  spec.add_dependency "httparty"
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: tsks
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 0.0.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - Luan F. R. Vicente
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2020-10-08 00:00:00.000000000 Z
11
+ date: 2021-08-25 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rspec
@@ -24,20 +24,6 @@ dependencies:
24
24
  - - ">="
25
25
  - !ruby/object:Gem::Version
26
26
  version: '0'
27
- - !ruby/object:Gem::Dependency
28
- name: dotenv
29
- requirement: !ruby/object:Gem::Requirement
30
- requirements:
31
- - - ">="
32
- - !ruby/object:Gem::Version
33
- version: '0'
34
- type: :development
35
- prerelease: false
36
- version_requirements: !ruby/object:Gem::Requirement
37
- requirements:
38
- - - ">="
39
- - !ruby/object:Gem::Version
40
- version: '0'
41
27
  - !ruby/object:Gem::Dependency
42
28
  name: thor
43
29
  requirement: !ruby/object:Gem::Requirement
@@ -145,5 +131,5 @@ rubygems_version: 3.1.2
145
131
  signing_key:
146
132
  specification_version: 4
147
133
  summary: A stateful command line interface to help you handle your daily tsks (with
148
- contexts!)
134
+ synchronisation and contexts!)
149
135
  test_files: []