TokiCLI 0.2.1 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (129) hide show
  1. checksums.yaml +4 -4
  2. data/.coveralls.yml +1 -0
  3. data/.gitignore +9 -17
  4. data/.rspec +3 -0
  5. data/.travis.yml +3 -0
  6. data/CHANGELOG.md +4 -0
  7. data/README.md +99 -163
  8. data/Rakefile +5 -0
  9. data/TokiCLI.gemspec +5 -4
  10. data/bin/toki +2 -2
  11. data/lib/API/helpers.rb +27 -170
  12. data/lib/API/toki_api.rb +227 -0
  13. data/lib/API/toki_db.rb +67 -0
  14. data/lib/TokiCLI.rb +270 -5
  15. data/lib/TokiCLI/adnimport.rb +202 -0
  16. data/lib/TokiCLI/fileops.rb +187 -0
  17. data/lib/TokiCLI/status.rb +49 -37
  18. data/lib/TokiCLI/version.rb +1 -1
  19. data/lib/TokiCLI/view.rb +133 -86
  20. data/lib/TokiServer/.bowerrc +3 -0
  21. data/lib/TokiServer/.gitignore +2 -0
  22. data/lib/TokiServer/Gemfile +1 -0
  23. data/lib/TokiServer/bower.json +0 -0
  24. data/lib/TokiServer/bower_components/fastclick/.bower.json +4 -4
  25. data/lib/TokiServer/bower_components/fastclick/bower.json +1 -1
  26. data/lib/TokiServer/bower_components/fastclick/lib/fastclick.js +33 -2
  27. data/lib/TokiServer/bower_components/foundation/.bower.json +5 -4
  28. data/lib/TokiServer/bower_components/foundation/bower.json +2 -1
  29. data/lib/TokiServer/bower_components/foundation/css/foundation.css +2173 -922
  30. data/lib/TokiServer/bower_components/foundation/css/foundation.css.map +7 -0
  31. data/lib/TokiServer/bower_components/foundation/css/normalize.css +53 -16
  32. data/lib/TokiServer/bower_components/foundation/css/normalize.css.map +7 -0
  33. data/lib/TokiServer/bower_components/foundation/js/foundation.js +782 -542
  34. data/lib/TokiServer/bower_components/foundation/js/foundation.min.js +4 -3
  35. data/lib/TokiServer/bower_components/foundation/js/foundation/foundation.abide.js +45 -31
  36. data/lib/TokiServer/bower_components/foundation/js/foundation/foundation.accordion.js +12 -6
  37. data/lib/TokiServer/bower_components/foundation/js/foundation/foundation.alert.js +5 -5
  38. data/lib/TokiServer/bower_components/foundation/js/foundation/foundation.clearing.js +34 -10
  39. data/lib/TokiServer/bower_components/foundation/js/foundation/foundation.dropdown.js +83 -29
  40. data/lib/TokiServer/bower_components/foundation/js/foundation/foundation.equalizer.js +3 -3
  41. data/lib/TokiServer/bower_components/foundation/js/foundation/foundation.interchange.js +25 -12
  42. data/lib/TokiServer/bower_components/foundation/js/foundation/foundation.joyride.js +112 -40
  43. data/lib/TokiServer/bower_components/foundation/js/foundation/foundation.js +19 -5
  44. data/lib/TokiServer/bower_components/foundation/js/foundation/foundation.magellan.js +22 -11
  45. data/lib/TokiServer/bower_components/foundation/js/foundation/foundation.offcanvas.js +52 -8
  46. data/lib/TokiServer/bower_components/foundation/js/foundation/foundation.orbit.js +133 -271
  47. data/lib/TokiServer/bower_components/foundation/js/foundation/foundation.reveal.js +27 -20
  48. data/lib/TokiServer/bower_components/foundation/js/foundation/foundation.slider.js +73 -33
  49. data/lib/TokiServer/bower_components/foundation/js/foundation/foundation.tab.js +88 -31
  50. data/lib/TokiServer/bower_components/foundation/js/foundation/foundation.tooltip.js +7 -5
  51. data/lib/TokiServer/bower_components/foundation/js/foundation/foundation.topbar.js +44 -24
  52. data/lib/TokiServer/bower_components/foundation/js/vendor/fastclick.js +2 -2
  53. data/lib/TokiServer/bower_components/foundation/js/vendor/modernizr.js +2 -2
  54. data/lib/TokiServer/bower_components/foundation/scss/foundation.scss +38 -38
  55. data/lib/TokiServer/bower_components/foundation/scss/foundation/_functions.scss +3 -3
  56. data/lib/TokiServer/bower_components/foundation/scss/foundation/_settings.scss +417 -271
  57. data/lib/TokiServer/bower_components/foundation/scss/foundation/components/_accordion.scss +110 -6
  58. data/lib/TokiServer/bower_components/foundation/scss/foundation/components/_alert-boxes.scss +2 -2
  59. data/lib/TokiServer/bower_components/foundation/scss/foundation/components/_block-grid.scss +2 -2
  60. data/lib/TokiServer/bower_components/foundation/scss/foundation/components/_breadcrumbs.scss +8 -3
  61. data/lib/TokiServer/bower_components/foundation/scss/foundation/components/_button-groups.scss +99 -9
  62. data/lib/TokiServer/bower_components/foundation/scss/foundation/components/_buttons.scss +66 -28
  63. data/lib/TokiServer/bower_components/foundation/scss/foundation/components/_clearing.scss +5 -5
  64. data/lib/TokiServer/bower_components/foundation/scss/foundation/components/_dropdown-buttons.scss +4 -4
  65. data/lib/TokiServer/bower_components/foundation/scss/foundation/components/_dropdown.scss +48 -35
  66. data/lib/TokiServer/bower_components/foundation/scss/foundation/components/_forms.scss +104 -32
  67. data/lib/TokiServer/bower_components/foundation/scss/foundation/components/_global.scss +48 -30
  68. data/lib/TokiServer/bower_components/foundation/scss/foundation/components/_grid.scss +19 -4
  69. data/lib/TokiServer/bower_components/foundation/scss/foundation/components/_icon-bar.scss +293 -0
  70. data/lib/TokiServer/bower_components/foundation/scss/foundation/components/_joyride.scss +11 -9
  71. data/lib/TokiServer/bower_components/foundation/scss/foundation/components/_keystrokes.scss +4 -4
  72. data/lib/TokiServer/bower_components/foundation/scss/foundation/components/_labels.scss +4 -2
  73. data/lib/TokiServer/bower_components/foundation/scss/foundation/components/_magellan.scss +1 -1
  74. data/lib/TokiServer/bower_components/foundation/scss/foundation/components/_offcanvas.scss +193 -35
  75. data/lib/TokiServer/bower_components/foundation/scss/foundation/components/_orbit.scss +92 -147
  76. data/lib/TokiServer/bower_components/foundation/scss/foundation/components/_pagination.scss +22 -10
  77. data/lib/TokiServer/bower_components/foundation/scss/foundation/components/_panels.scss +10 -7
  78. data/lib/TokiServer/bower_components/foundation/scss/foundation/components/_pricing-tables.scss +11 -11
  79. data/lib/TokiServer/bower_components/foundation/scss/foundation/components/_progress-bars.scss +2 -2
  80. data/lib/TokiServer/bower_components/foundation/scss/foundation/components/_range-slider.scss +29 -9
  81. data/lib/TokiServer/bower_components/foundation/scss/foundation/components/_reveal.scss +60 -56
  82. data/lib/TokiServer/bower_components/foundation/scss/foundation/components/_side-nav.scss +3 -2
  83. data/lib/TokiServer/bower_components/foundation/scss/foundation/components/_split-buttons.scss +2 -2
  84. data/lib/TokiServer/bower_components/foundation/scss/foundation/components/_sub-nav.scss +2 -2
  85. data/lib/TokiServer/bower_components/foundation/scss/foundation/components/_switches.scss +226 -0
  86. data/lib/TokiServer/bower_components/foundation/scss/foundation/components/_tables.scss +13 -7
  87. data/lib/TokiServer/bower_components/foundation/scss/foundation/components/_tabs.scss +22 -8
  88. data/lib/TokiServer/bower_components/foundation/scss/foundation/components/_thumbs.scss +2 -4
  89. data/lib/TokiServer/bower_components/foundation/scss/foundation/components/_toolbar.scss +70 -0
  90. data/lib/TokiServer/bower_components/foundation/scss/foundation/components/_tooltips.scss +9 -7
  91. data/lib/TokiServer/bower_components/foundation/scss/foundation/components/_top-bar.scss +77 -44
  92. data/lib/TokiServer/bower_components/foundation/scss/foundation/components/_type.scss +21 -9
  93. data/lib/TokiServer/bower_components/modernizr/.bower.json +4 -4
  94. data/lib/TokiServer/bower_components/modernizr/feature-detects/workers-blobworkers.js +2 -2
  95. data/lib/TokiServer/bower_components/modernizr/grunt.js +1 -1
  96. data/lib/TokiServer/bower_components/modernizr/modernizr.js +2 -2
  97. data/lib/TokiServer/config.rb +0 -0
  98. data/lib/TokiServer/humans.txt +0 -0
  99. data/lib/TokiServer/{itunesicon.rb → itunesicons.rb} +25 -23
  100. data/lib/TokiServer/js/app.js +0 -0
  101. data/lib/TokiServer/public/stylesheets/app.css +2636 -1610
  102. data/lib/TokiServer/robots.txt +0 -0
  103. data/lib/TokiServer/scss/_settings.scss +0 -0
  104. data/lib/TokiServer/scss/app.scss +7 -1
  105. data/lib/TokiServer/tokiserver.rb +239 -244
  106. data/lib/TokiServer/views/activity.erb +42 -0
  107. data/lib/TokiServer/views/apps_total.erb +8 -2
  108. data/lib/TokiServer/views/error.erb +13 -4
  109. data/lib/TokiServer/views/index.erb +36 -27
  110. data/lib/TokiServer/views/logs_total.erb +34 -0
  111. data/spec/TokiCLI_spec.rb +354 -0
  112. data/spec/mock/mock.sqlite3 +0 -0
  113. data/spec/spec_helper.rb +26 -0
  114. metadata +78 -23
  115. data/lib/API/dbapi.rb +0 -488
  116. data/lib/TokiCLI/app.rb +0 -389
  117. data/lib/TokiCLI/authorize.rb +0 -77
  118. data/lib/TokiCLI/export.rb +0 -81
  119. data/lib/TokiCLI/get_channels.rb +0 -22
  120. data/lib/TokiCLI/get_messages.rb +0 -32
  121. data/lib/TokiCLI/import.rb +0 -122
  122. data/lib/TokiCLI/scan.rb +0 -19
  123. data/lib/TokiCLI/search_messages.rb +0 -23
  124. data/lib/TokiServer/README.md +0 -37
  125. data/lib/TokiServer/bower_components/foundation/scss/foundation/components/_reveal-new.scss +0 -0
  126. data/lib/TokiServer/bower_components/foundation/scss/foundation/components/_switch.scss +0 -294
  127. data/lib/TokiServer/views/name_log.erb +0 -50
  128. data/lib/TokiServer/views/name_split.erb +0 -37
  129. data/lib/TokiServer/views/name_total.erb +0 -34
@@ -0,0 +1,42 @@
1
+ <div class="row">
2
+ <div class="header">
3
+ <div class="small-6 columns">
4
+ <h1 class="logo">TOKI</h1>
5
+ </div>
6
+ <div class="small-6 columns">
7
+ <h1 class="title"><%= title %></h1>
8
+ </div>
9
+ </div>
10
+ </div>
11
+
12
+ <div class="row">
13
+ <div class="small-12 columns">
14
+ <h3 class="total"><%= name %> <%= toki.helpers.readable_time(toki.helpers.sec_to_time(total)) unless total.nil? %></h3>
15
+ <% unless icon.nil? %>
16
+ <div class="small-1 small-centered columns">
17
+ <img src="<%= icon %>" alt="icon" class="icon">
18
+ </div>
19
+ <% end %>
20
+ <br>
21
+ </div>
22
+ </div>
23
+
24
+ <% data.each do |id, log| %>
25
+ <div class="row">
26
+ <div class="small-4 columns">
27
+ <h4 class="bundle"> <%= log['name'] || log['bundle'] %> </h4>
28
+ </div>
29
+ <div class="small-6 columns">
30
+ <h4 class="start"> <%= log['start'] %> </h4>
31
+ </div>
32
+ <div class="small-2 columns time">
33
+ <h4 class="duration"> <%= toki.helpers.readable_time_log(toki.helpers.sec_to_time(log['duration']['seconds'])) %> </h4>
34
+ </div>
35
+ </div>
36
+ <% end %>
37
+
38
+ <div class="row">
39
+ <div class="small-4 small-centered columns">
40
+ <h3 class="back"><a href="/">BACK TO INDEX</a></h3>
41
+ </div>
42
+ </div>
@@ -9,14 +9,20 @@
9
9
  </div>
10
10
  </div>
11
11
 
12
- <% resp['data']['apps'].reverse.each do |app| %>
12
+ <div class="row">
13
+ <div class="small-6 small-centered columns">
14
+ <h3 class="total"><%= toki.helpers.readable_time(toki.helpers.sec_to_time(total)) unless total.nil? %></h3>
15
+ </div>
16
+ </div>
17
+
18
+ <% data.reverse.each do |app| %>
13
19
  <div class="row">
14
20
  <div class="small-6 columns">
15
21
  <h3 class="name"> <%= app['name'] || app['bundle'] %> </h3>
16
22
  <h4 class="bundle"> <%= app['bundle'] %> </h4>
17
23
  </div>
18
24
  <div class="small-6 columns time">
19
- <h4 class="seconds"> <%= tk.helpers.humanized_date(app['total']['seconds']) %> </h4>
25
+ <h4 class="seconds"> <%= toki.helpers.readable_time(app['total']['time']) %> </h4>
20
26
  </div>
21
27
  </div>
22
28
  <% end %>
@@ -11,13 +11,22 @@
11
11
 
12
12
  <div class="row">
13
13
  <div class="small-12 columns">
14
- <div class="hero">
15
- <h1><%= message %></h1>
16
- <p><%= resp %></p>
17
- </div>
14
+ <h3 class="total"><%= error %></h3>
15
+ <br>
18
16
  </div>
19
17
  </div>
20
18
 
19
+ <% data.each do |k, v| %>
20
+ <div class="row">
21
+ <div class="small-4 columns">
22
+ <h4 class="start"> <%= k %> </h4>
23
+ </div>
24
+ <div class="small-8 columns time">
25
+ <h4 class="duration"> <%= v %> </h4>
26
+ </div>
27
+ </div>
28
+ <% end %>
29
+
21
30
  <div class="row">
22
31
  <div class="small-4 small-centered columns">
23
32
  <h3 class="back"><a href="/">BACK TO INDEX</a></h3>
@@ -4,7 +4,7 @@
4
4
  <h1 class="logo">TOKI</h1>
5
5
  </div>
6
6
  <div class="small-7 columns">
7
- <h1 class="title">ENDPOINTS</h1>
7
+ <h1 class="title">EXAMPLES</h1>
8
8
  </div>
9
9
  </div>
10
10
  </div>
@@ -72,120 +72,129 @@
72
72
  </div>
73
73
  </div>
74
74
 
75
- <div class="row">
75
+ <!-- <div class="row">
76
76
  <div class="small-5 columns">
77
77
  <h5 class="list">Complete log for app x</h5>
78
78
  </div>
79
79
  <div class="small-7 columns">
80
- <h5 class="endpoint"><a href="/find/safari/log">/find/safari/log</a></h5>
80
+ <h5 class="endpoint"><a href="/logs/app/safari">/logs/app/safari</a></h5>
81
81
  </div>
82
- </div>
82
+ </div> -->
83
83
 
84
84
  <div class="row">
85
85
  <div class="small-5 columns">
86
86
  <h5 class="list">Complete log for bundle x</h5>
87
87
  </div>
88
88
  <div class="small-7 columns">
89
- <h5 class="endpoint"><a href="/bundle/com.apple.Safari/log">/bundle/com.apple.Safari/log</a></h5>
89
+ <h5 class="endpoint"><a href="/logs/bundle/com.apple.Safari">/logs/bundle/com.apple.Safari</a></h5>
90
90
  </div>
91
91
  </div>
92
-
92
+ <!--
93
93
  <div class="row">
94
94
  <div class="small-5 columns">
95
95
  <h5 class="list">Total for app x (ex: Safari)</h5>
96
96
  </div>
97
97
  <div class="small-7 columns">
98
- <h5 class="endpoint"><a href="/find/safari/total">/find/safari/total</a></h5>
98
+ <h5 class="endpoint"><a href="/logs/app/safari/total">/logs/app/safari/total</a></h5>
99
99
  </div>
100
- </div>
100
+ </div> -->
101
101
 
102
102
  <div class="row">
103
103
  <div class="small-5 columns">
104
104
  <h5 class="list">Total for bundle x (ex: Safari)</h5>
105
105
  </div>
106
106
  <div class="small-7 columns">
107
- <h5 class="endpoint"><a href="/bundle/com.apple.Safari/total">/bundle/com.apple.Safari/total</a></h5>
107
+ <h5 class="endpoint"><a href="/logs/bundle/com.apple.Safari/total">/logs/bundle/com.apple.Safari/total</a></h5>
108
108
  </div>
109
109
  </div>
110
110
 
111
- <div class="row">
111
+ <!-- <div class="row">
112
112
  <div class="small-5 columns">
113
113
  <h5 class="list">Total for app x before day x</h5>
114
114
  </div>
115
115
  <div class="small-7 columns">
116
- <h5 class="endpoint"><a href="/find/safari/before/2014-05-27">/find/safari/before/2014-05-27</a></h5>
116
+ <h5 class="endpoint"><a href="/logs/app/safari/before/2014-05-27">/logs/app/safari/before/2014-05-27</a></h5>
117
117
  </div>
118
- </div>
118
+ </div> -->
119
119
 
120
120
  <div class="row">
121
121
  <div class="small-5 columns">
122
122
  <h5 class="list">Total for bundle x before day x</h5>
123
123
  </div>
124
124
  <div class="small-7 columns">
125
- <h5 class="endpoint"><a href="/bundle/com.apple.Safari/before/2014-05-27">/bundle/com.apple.Safari/before/2014-05-27</a></h5>
125
+ <h5 class="endpoint"><a href="/logs/bundle/com.apple.Safari/before/2014-05-27">/logs/bundle/com.apple.Safari/before/2014-05-27</a></h5>
126
126
  </div>
127
127
  </div>
128
128
 
129
- <div class="row">
129
+ <!-- <div class="row">
130
130
  <div class="small-5 columns">
131
131
  <h5 class="list">Total for app x since day x</h5>
132
132
  </div>
133
133
  <div class="small-7 columns">
134
- <h5 class="endpoint"><a href="/find/safari/since/2014-05-27">/find/safari/since/2014-05-27</a></h5>
134
+ <h5 class="endpoint"><a href="/logs/app/safari/since/2014-05-27">/logs/app/safari/since/2014-05-27</a></h5>
135
135
  </div>
136
- </div>
136
+ </div> -->
137
137
 
138
138
  <div class="row">
139
139
  <div class="small-5 columns">
140
140
  <h5 class="list">Total for bundle x since day x</h5>
141
141
  </div>
142
142
  <div class="small-7 columns">
143
- <h5 class="endpoint"><a href="/bundle/com.apple.Safari/since/2014-05-27">/bundle/com.apple.Safari/since/2014-05-27</a></h5>
143
+ <h5 class="endpoint"><a href="/logs/bundle/com.apple.Safari/since/2014-05-27">/logs/bundle/com.apple.Safari/since/2014-05-27</a></h5>
144
144
  </div>
145
145
  </div>
146
146
 
147
- <div class="row">
147
+ <!-- <div class="row">
148
148
  <div class="small-5 columns">
149
149
  <h5 class="list">Total for app x between day 1 and day 2</h5>
150
150
  </div>
151
151
  <div class="small-7 columns">
152
- <h5 class="endpoint"><a href="/find/safari/range/2014-05-27/2014-05-30">/find/safari/range/2014-05-27/2014-05-30</a></h5>
152
+ <h5 class="endpoint"><a href="/logs/app/safari/range/2014-05-27/2014-05-30">/logs/app/safari/range/2014-05-27/2014-05-30</a></h5>
153
153
  </div>
154
- </div>
154
+ </div> -->
155
155
 
156
156
  <div class="row">
157
157
  <div class="small-5 columns">
158
158
  <h5 class="list">Total for bundle x between day 1 and day 2</h5>
159
159
  </div>
160
160
  <div class="small-7 columns">
161
- <h5 class="endpoint"><a href="/bundle/com.apple.Safari/range/2014-05-27/2014-05-30">/bundle/com.apple.Safari/range/2014-05-27/2014-05-30</a></h5>
161
+ <h5 class="endpoint"><a href="/logs/bundle/com.apple.Safari/range/2014-05-27/2014-05-30">/logs/bundle/com.apple.Safari/range/2014-05-27/2014-05-30</a></h5>
162
+ </div>
163
+ </div>
164
+
165
+ <div class="row">
166
+ <div class="small-5 columns">
167
+ <h5 class="list">Activity</h5>
168
+ </div>
169
+ <div class="small-7 columns">
170
+ <h5 class="endpoint"><a href="/activity">/activity</a></h5>
162
171
  </div>
163
172
  </div>
164
173
 
165
174
  <div class="row">
166
175
  <div class="small-5 columns">
167
- <h5 class="list">Total for app x before and after day x</h5>
176
+ <h5 class="list">Activity for a specific day</h5>
168
177
  </div>
169
178
  <div class="small-7 columns">
170
- <h5 class="endpoint"><a href="/find/safari/split/2014-05-27">/find/safari/split/2014-05-27</a></h5>
179
+ <h5 class="endpoint"><a href="/activity/day/2014-09-14">/activity/day/2014-09-14</a></h5>
171
180
  </div>
172
181
  </div>
173
182
 
174
183
  <div class="row">
175
184
  <div class="small-5 columns">
176
- <h5 class="list">Total for bundle x before and after day x</h5>
185
+ <h5 class="list">Activity since a specific day</h5>
177
186
  </div>
178
187
  <div class="small-7 columns">
179
- <h5 class="endpoint"><a href="/bundle/com.apple.Safari/split/2014-05-27">/bundle/com.apple.Safari/split/2014-05-27</a></h5>
188
+ <h5 class="endpoint"><a href="/activity/since/2014-09-14">/activity/since/2014-09-14</a></h5>
180
189
  </div>
181
190
  </div>
182
191
 
183
192
  <div class="row">
184
193
  <div class="small-5 columns">
185
194
  <h5 class="list">JSON API</h5>
186
- <p>Add "/api" in front of the urls to get the JSON response. Works with all endpoints.</p>
195
+ <p>Add "/api" in front of the urls to get JSON</p>
187
196
  </div>
188
197
  <div class="small-7 columns">
189
- <h5 class="endpoint"><a href="/api/apps/total">/api/apps/total</a></h5>
198
+ <h5 class="endpoint"><a href="/api">/api</a></h5>
190
199
  </div>
191
200
  </div>
@@ -0,0 +1,34 @@
1
+ <div class="row">
2
+ <div class="header">
3
+ <div class="small-6 columns">
4
+ <h1 class="logo">TOKI</h1>
5
+ </div>
6
+ <div class="small-6 columns">
7
+ <h1 class="title"><%= title %></h1>
8
+ </div>
9
+ </div>
10
+ </div>
11
+
12
+ <div class="row">
13
+ <div class="small-6 small-centered columns">
14
+ <h3 class="total"><%= toki.helpers.readable_time(toki.helpers.sec_to_time(total)) unless total.nil? %></h3>
15
+ </div>
16
+ </div>
17
+
18
+ <% data.reverse.each do |app| %>
19
+ <div class="row">
20
+ <div class="small-6 columns">
21
+ <h3 class="name"> <%= app['name'] || app['bundle'] %> </h3>
22
+ <h4 class="bundle"> <%= app['bundle'] %> </h4>
23
+ </div>
24
+ <div class="small-6 columns time">
25
+ <h4 class="seconds"> <%= toki.helpers.readable_time(app['total']['time']) %> </h4>
26
+ </div>
27
+ </div>
28
+ <% end %>
29
+
30
+ <div class="row">
31
+ <div class="small-4 small-centered columns">
32
+ <h3 class="back"><a href="/">BACK TO INDEX</a></h3>
33
+ </div>
34
+ </div>
@@ -0,0 +1,354 @@
1
+ require 'spec_helper'
2
+
3
+ describe TokiCLI do
4
+
5
+ before do
6
+ TokiCLI::FileOps.any_instance.stub(:db_file).and_return('spec/mock/mock.sqlite3')
7
+ TokiCLI::FileOps.any_instance.stub(:bundles).and_return(nil)
8
+ end
9
+
10
+ describe "#version" do
11
+ it 'has a version number' do
12
+ expect(TokiCLI::VERSION).not_to be nil
13
+ end
14
+ it "shows version number" do
15
+ printed = capture_stdout do
16
+ TokiCLI::App.start(['version'])
17
+ end
18
+ expect(printed).to include 'TokiCLI'
19
+ expect(printed).to include 'Version'
20
+ expect(printed).to include 'github'
21
+ end
22
+ end
23
+
24
+ describe "#total" do
25
+ it "shows the total for all apps" do
26
+ printed = capture_stdout do
27
+ TokiCLI::App.start(['total'])
28
+ end
29
+ expect(printed).to include *%w{com.apple.ReportPanic com.apple.SystemProfiler com.apple.systemuiserver com.apple.InstallAssistant.OSX10Seed1 com.apple.frameworks.diskimages.diuiagent com.apple.WebKit.WebContent com.apple.coreservices.uiagent com.apple.PhotoBooth com.apple.TextEdit com.apple.ProblemReporter com.apple.FontBook com.apple.DigitalColorMeter com.apple.KeyboardSetupAssistant com.apple.ScriptEditor2 com.apple.installer com.apple.DiskUtility com.apple.ActivityMonitor com.apple.iCal com.apple.iphonesimulator com.apple.NetAuthAgent com.apple.AddressBook com.apple.Console com.apple.mail com.apple.Notes com.apple.ScreenSaver.Engine com.apple.Automator com.apple.AirPlayUIAgent com.apple.FaceTime com.apple.iPhoto com.apple.dt.Xcode com.apple.QuickTimePlayerX com.apple.iChat com.apple.systempreferences com.apple.Preview com.apple.WebKit.PluginProcess com.apple.ScreenSharing com.apple.appstore com.apple.ASApplication com.apple.Terminal com.apple.iBooksX com.apple.iTunes com.apple.finder com.apple.Safari}
30
+ end
31
+ end
32
+
33
+ describe "#top" do
34
+ it "shows the top 10 apps" do
35
+ printed = capture_stdout do
36
+ TokiCLI::App.start(['top', '-n10'])
37
+ end
38
+ expect(printed).to include *%w{com.apple.Preview com.apple.WebKit.PluginProcess com.apple.ScreenSharing com.apple.appstore com.apple.ASApplication com.apple.Terminal com.apple.iBooksX com.apple.iTunes com.apple.finder com.apple.Safari}
39
+ expect(printed).to_not include 'com.apple.systempreferences'
40
+ end
41
+
42
+ it "shows the top apps" do
43
+ printed = capture_stdout do
44
+ TokiCLI::App.start(['top'])
45
+ end
46
+ expect(printed).to include *%w{com.apple.Terminal com.apple.iBooksX com.apple.iTunes com.apple.finder com.apple.Safari}
47
+ expect(printed).to_not include 'com.apple.ASApplication'
48
+ end
49
+ end
50
+
51
+ describe "day" do
52
+ it "shows apps for day 2014-09-15" do
53
+ printed = capture_stdout do
54
+ TokiCLI::App.start(['day', '2014-09-15'])
55
+ end
56
+ expect(printed).to include *%w{com.apple.finder com.apple.Safari}
57
+ expect(printed).to_not include 'com.apple.iTunes'
58
+ end
59
+ end
60
+
61
+ describe "range" do
62
+ it "shows apps between 2014-09-12 and 2014-09-15" do
63
+ printed = capture_stdout do
64
+ TokiCLI::App.start(['range', '2014-09-12', '2014-09-15'])
65
+ end
66
+ expect(printed).to include *%w{com.apple.NetAuthAgent com.apple.ActivityMonitor com.apple.installer com.apple.appstore com.apple.iTunes com.apple.Terminal com.apple.ScreenSaver.Engine com.apple.ScreenSharing com.apple.WebKit.PluginProcess com.apple.finder com.apple.Safari}
67
+ expect(printed).to_not include 'com.apple.TextEdit'
68
+ end
69
+ end
70
+
71
+ describe "before" do
72
+ it "shows apps before 2014-05-15" do
73
+ printed = capture_stdout do
74
+ TokiCLI::App.start(['before', '2014-05-15'])
75
+ end
76
+ expect(printed).to include *%w{com.apple.coreservices.uiagent com.apple.ReportPanic com.apple.frameworks.diskimages.diuiagent com.apple.installer com.apple.ProblemReporter com.apple.WebKit.WebContent com.apple.dt.Xcode com.apple.TextEdit com.apple.NetAuthAgent com.apple.DigitalColorMeter com.apple.KeyboardSetupAssistant com.apple.ActivityMonitor com.apple.Automator com.apple.mail com.apple.iphonesimulator com.apple.Terminal com.apple.Console com.apple.Notes com.apple.iChat com.apple.WebKit.PluginProcess com.apple.Preview com.apple.iPhoto com.apple.ASApplication com.apple.systempreferences com.apple.ScreenSharing com.apple.appstore com.apple.QuickTimePlayerX com.apple.iTunes com.apple.finder com.apple.Safari}
77
+ end
78
+ end
79
+
80
+ describe "since" do
81
+ it "shows apps since 2014-09-12" do
82
+ printed = capture_stdout do
83
+ TokiCLI::App.start(['since', '2014-09-12'])
84
+ end
85
+ expect(printed).to include *%w{com.apple.NetAuthAgent com.apple.ActivityMonitor com.apple.installer com.apple.appstore com.apple.iTunes com.apple.Terminal com.apple.ScreenSaver.Engine com.apple.ScreenSharing com.apple.WebKit.PluginProcess com.apple.finder com.apple.Safari}
86
+ expect(printed).to_not include 'com.apple.TextEdit'
87
+ end
88
+ end
89
+
90
+ describe "activity" do
91
+ it "shows activity for 2014-09-14" do
92
+ printed = capture_stdout do
93
+ TokiCLI::App.start(['activity', '--day', '2014-09-14'])
94
+ end
95
+ expect(printed).to include *['com.apple.finder | 02:00:00 | 00m 04s | 3009986780794979448', 'com.apple.Safari | 17:00:00 | 02m 02s | 279578532860092796', 'com.apple.finder | 23:30:00 | 01m 37s | 5321635596015812810']
96
+ end
97
+ end
98
+
99
+ describe "activity" do
100
+ it "shows activity since 2014-09-14" do
101
+ printed = capture_stdout do
102
+ TokiCLI::App.start(['activity', '--since', '2014-09-14'])
103
+ end
104
+ expect(printed).to include *['com.apple.finder | 02:00:00 | 00m 04s | 3009986780794979448', 'com.apple.Safari | 17:00:00 | 02m 02s | 279578532860092796', 'com.apple.finder | 23:30:00 | 01m 37s | 5321635596015812810', 'com.apple.finder | 08:15:00 | 00m 29s | 2450616761580369798', 'com.apple.Safari | 15:00:00 | 00m 06s | 7557789946794681026']
105
+ end
106
+ end
107
+
108
+ describe "bundle" do
109
+ it "shows log for an app" do
110
+ printed = capture_stdout do
111
+ TokiCLI::App.start(['bundle', 'com.apple.iTunes'])
112
+ end
113
+ expect(printed).to include *['2014-04-13', '16:45:00 | 01m 02s | 93837223385103975', '2014-04-14', '09:15:00 | 00m 18s | 9048025340952260608', '12:30:00 | 00m 27s | 8045504996000693405', 'Total: 3h 52m 32s']
114
+ end
115
+ end
116
+
117
+ end
118
+
119
+ describe TokiCLI::TokiAPI do
120
+
121
+ let(:toki) { TokiCLI::TokiAPI.new('spec/mock/mock.sqlite3', {}) }
122
+
123
+ describe "#apps_total" do
124
+ it "returns the total for all apps" do
125
+ toki.apps_total
126
+ resp = JSON.parse(toki.response)
127
+ expect(resp['meta']['code']).to eq 200
128
+ expect(resp['meta']['request']['command']).to eq 'apps_total'
129
+ expect(resp['data'].first['bundle']).to eq 'com.apple.ReportPanic'
130
+ expect(resp['data'].first['total']['seconds']).to eq 4
131
+ expect(resp['data'].first['total']['time']['hours']).to eq 0
132
+ expect(resp['data'].first['total']['time']['minutes']).to eq 0
133
+ expect(resp['data'].first['total']['time']['seconds']).to eq 4
134
+
135
+ expect(resp['data'].last['bundle']).to eq 'com.apple.Safari'
136
+ expect(resp['data'].last['total']['seconds']).to eq 958537
137
+ expect(resp['data'].last['total']['time']['hours']).to eq 266
138
+ expect(resp['data'].last['total']['time']['minutes']).to eq 15
139
+ expect(resp['data'].last['total']['time']['seconds']).to eq 37
140
+ end
141
+ end
142
+
143
+ describe "#apps_top" do
144
+ it "returns top apps" do
145
+ toki.apps_top
146
+ resp = JSON.parse(toki.response)
147
+ expect(resp['meta']['code']).to eq 200
148
+ expect(resp['meta']['request']['command']).to eq 'apps_top'
149
+ expect(resp['data'].first['bundle']).to eq 'com.apple.Terminal'
150
+ expect(resp['data'].first['total']['seconds']).to eq 7510
151
+ expect(resp['data'].first['total']['time']['hours']).to eq 2
152
+ expect(resp['data'].first['total']['time']['minutes']).to eq 5
153
+ expect(resp['data'].first['total']['time']['seconds']).to eq 10
154
+
155
+ expect(resp['data'].last['bundle']).to eq 'com.apple.Safari'
156
+ expect(resp['data'].last['total']['seconds']).to eq 958537
157
+ expect(resp['data'].last['total']['time']['hours']).to eq 266
158
+ expect(resp['data'].last['total']['time']['minutes']).to eq 15
159
+ expect(resp['data'].last['total']['time']['seconds']).to eq 37
160
+ end
161
+
162
+ it "returns top 10 apps" do
163
+ toki.apps_top(10)
164
+ resp = JSON.parse(toki.response)
165
+ expect(resp['meta']['code']).to eq 200
166
+ expect(resp['meta']['request']['command']).to eq 'apps_top'
167
+ expect(resp['data'].first['bundle']).to eq 'com.apple.Preview'
168
+ expect(resp['data'].first['total']['seconds']).to eq 3123
169
+ expect(resp['data'].first['total']['time']['hours']).to eq 0
170
+ expect(resp['data'].first['total']['time']['minutes']).to eq 52
171
+ expect(resp['data'].first['total']['time']['seconds']).to eq 3
172
+
173
+ expect(resp['data'].last['bundle']).to eq 'com.apple.Safari'
174
+ expect(resp['data'].last['total']['seconds']).to eq 958537
175
+ expect(resp['data'].last['total']['time']['hours']).to eq 266
176
+ expect(resp['data'].last['total']['time']['minutes']).to eq 15
177
+ expect(resp['data'].last['total']['time']['seconds']).to eq 37
178
+ end
179
+ end
180
+
181
+ describe "#apps_day" do
182
+ it "returns apps for day 2014-09-15" do
183
+ toki.apps_day('2014-09-15')
184
+ resp = JSON.parse(toki.response)
185
+ expect(resp['meta']['code']).to eq 200
186
+ expect(resp['meta']['request']['command']).to eq 'apps_day'
187
+ expect(resp['data'].first['bundle']).to eq 'com.apple.finder'
188
+ expect(resp['data'].first['total']['seconds']).to eq 979
189
+ expect(resp['data'].first['total']['time']['hours']).to eq 0
190
+ expect(resp['data'].first['total']['time']['minutes']).to eq 16
191
+ expect(resp['data'].first['total']['time']['seconds']).to eq 19
192
+
193
+ expect(resp['data'].last['bundle']).to eq 'com.apple.Safari'
194
+ expect(resp['data'].last['total']['seconds']).to eq 5058
195
+ expect(resp['data'].last['total']['time']['hours']).to eq 1
196
+ expect(resp['data'].last['total']['time']['minutes']).to eq 24
197
+ expect(resp['data'].last['total']['time']['seconds']).to eq 18
198
+ end
199
+ end
200
+
201
+ describe "#apps_range" do
202
+ it "returns apps between '2014-09-12' and '2014-09-15'" do
203
+ toki.apps_range('2014-09-12', '2014-09-15')
204
+ resp = JSON.parse(toki.response)
205
+ expect(resp['meta']['code']).to eq 200
206
+ expect(resp['meta']['request']['command']).to eq 'apps_range'
207
+ expect(resp['data'].first['bundle']).to eq 'com.apple.NetAuthAgent'
208
+ expect(resp['data'].first['total']['seconds']).to eq 5
209
+ expect(resp['data'].first['total']['time']['hours']).to eq 0
210
+ expect(resp['data'].first['total']['time']['minutes']).to eq 0
211
+ expect(resp['data'].first['total']['time']['seconds']).to eq 5
212
+
213
+ expect(resp['data'].last['bundle']).to eq 'com.apple.Safari'
214
+ expect(resp['data'].last['total']['seconds']).to eq 22017
215
+ expect(resp['data'].last['total']['time']['hours']).to eq 6
216
+ expect(resp['data'].last['total']['time']['minutes']).to eq 6
217
+ expect(resp['data'].last['total']['time']['seconds']).to eq 57
218
+ end
219
+ end
220
+
221
+ describe "#apps_since" do
222
+ it "returns apps since day 2014-09-14" do
223
+ toki.apps_since('2014-09-14')
224
+ resp = JSON.parse(toki.response)
225
+ expect(resp['meta']['code']).to eq 200
226
+ expect(resp['meta']['request']['command']).to eq 'apps_since'
227
+ expect(resp['data'].first['bundle']).to eq 'com.apple.ActivityMonitor'
228
+ expect(resp['data'].first['total']['seconds']).to eq 6
229
+ expect(resp['data'].first['total']['time']['hours']).to eq 0
230
+ expect(resp['data'].first['total']['time']['minutes']).to eq 0
231
+ expect(resp['data'].first['total']['time']['seconds']).to eq 6
232
+
233
+ expect(resp['data'].last['bundle']).to eq 'com.apple.Safari'
234
+ expect(resp['data'].last['total']['seconds']).to eq 19902
235
+ expect(resp['data'].last['total']['time']['hours']).to eq 5
236
+ expect(resp['data'].last['total']['time']['minutes']).to eq 31
237
+ expect(resp['data'].last['total']['time']['seconds']).to eq 42
238
+ end
239
+ end
240
+
241
+ describe "#apps_before" do
242
+ it "returns apps before day 2014-09-01" do
243
+ toki.apps_before('2014-09-01')
244
+ resp = JSON.parse(toki.response)
245
+ expect(resp['meta']['code']).to eq 200
246
+ expect(resp['meta']['request']['command']).to eq 'apps_before'
247
+ expect(resp['data'].first['bundle']).to eq 'com.apple.ReportPanic'
248
+ expect(resp['data'].first['total']['seconds']).to eq 4
249
+ expect(resp['data'].first['total']['time']['hours']).to eq 0
250
+ expect(resp['data'].first['total']['time']['minutes']).to eq 0
251
+ expect(resp['data'].first['total']['time']['seconds']).to eq 4
252
+
253
+ expect(resp['data'].last['bundle']).to eq 'com.apple.Safari'
254
+ expect(resp['data'].last['total']['seconds']).to eq 831821
255
+ expect(resp['data'].last['total']['time']['hours']).to eq 231
256
+ expect(resp['data'].last['total']['time']['minutes']).to eq 3
257
+ expect(resp['data'].last['total']['time']['seconds']).to eq 41
258
+ end
259
+ end
260
+
261
+ describe "#bundle_log" do
262
+ it "returns log for com.apple.finder" do
263
+ toki.bundle_log('com.apple.finder')
264
+ resp = JSON.parse(toki.response)
265
+ expect(resp['meta']['code']).to eq 200
266
+ expect(resp['meta']['request']['command']).to eq 'bundle_log'
267
+ expect(resp['data'].size).to eq 1397
268
+ expect(resp['data']['6853206097451538432'].to_a).to eq [["bundle", "com.apple.finder"], ["name", nil], ["start", "2014-04-12 15:15:00 +0200"], ["duration", {"seconds"=>10, "time"=>{"hours"=>0, "minutes"=>0, "seconds"=>10}}]]
269
+ expect(resp['data']['8223841650221385607'].to_a).to eq [["bundle", "com.apple.finder"], ["name", nil], ["start", "2014-09-15 10:45:00 +0200"], ["duration", {"seconds"=>70, "time"=>{"hours"=>0, "minutes"=>1, "seconds"=>10}}]]
270
+ end
271
+ end
272
+
273
+ describe "#bundle_log_since" do
274
+ it "returns log for com.apple.finder since 2014-09-01" do
275
+ toki.bundle_log_since('com.apple.finder', '2014-09-01')
276
+ resp = JSON.parse(toki.response)
277
+ expect(resp['meta']['code']).to eq 200
278
+ expect(resp['meta']['request']['command']).to eq 'bundle_log_since'
279
+ expect(resp['data'].size).to eq 131
280
+ expect(resp['data']['3343489613556420396'].to_a).to eq [["bundle", "com.apple.finder"], ["name", nil], ["start", "2014-09-01 08:45:00 +0200"], ["duration", {"seconds"=>15, "time"=>{"hours"=>0, "minutes"=>0, "seconds"=>15}}]]
281
+ expect(resp['data']['8223841650221385607'].to_a).to eq [["bundle", "com.apple.finder"], ["name", nil], ["start", "2014-09-15 10:45:00 +0200"], ["duration", {"seconds"=>70, "time"=>{"hours"=>0, "minutes"=>1, "seconds"=>10}}]]
282
+ end
283
+ end
284
+
285
+ describe "#bundle_log_before" do
286
+ it "returns log for com.apple.finder before 2014-09-01" do
287
+ toki.bundle_log_before('com.apple.finder', '2014-09-01')
288
+ resp = JSON.parse(toki.response)
289
+ expect(resp['meta']['code']).to eq 200
290
+ expect(resp['meta']['request']['command']).to eq 'bundle_log_before'
291
+ expect(resp['data'].size).to eq 1266
292
+ arr = resp['data'].to_a
293
+ expect(arr.first).to eq ["6853206097451538432", {"bundle"=>"com.apple.finder", "name"=>nil, "start"=>"2014-04-12 15:15:00 +0200", "duration"=>{"seconds"=>10, "time"=>{"hours"=>0, "minutes"=>0, "seconds"=>10}}}]
294
+ expect(arr.last).to eq ["3110227595022506229", {"bundle"=>"com.apple.finder", "name"=>nil, "start"=>"2014-08-31 23:00:00 +0200", "duration"=>{"seconds"=>30, "time"=>{"hours"=>0, "minutes"=>0, "seconds"=>30}}}]
295
+ end
296
+ end
297
+
298
+ describe "#bundle_log_range" do
299
+ it "returns log for com.apple.finder between 2014-09-01 and 2014-09-04" do
300
+ toki.bundle_log_range('com.apple.finder', '2014-09-01', '2014-09-04')
301
+ resp = JSON.parse(toki.response)
302
+ expect(resp['meta']['code']).to eq 200
303
+ expect(resp['meta']['request']['command']).to eq 'bundle_log_range'
304
+ expect(resp['data'].size).to eq 26
305
+ arr = resp['data'].to_a
306
+ expect(arr.first).to eq ["3343489613556420396", {"bundle"=>"com.apple.finder", "name"=>nil, "start"=>"2014-09-01 08:45:00 +0200", "duration"=>{"seconds"=>15, "time"=>{"hours"=>0, "minutes"=>0, "seconds"=>15}}}]
307
+ expect(arr.last).to eq ["249678006045203865", {"bundle"=>"com.apple.finder", "name"=>nil, "start"=>"2014-09-03 21:30:00 +0200", "duration"=>{"seconds"=>16, "time"=>{"hours"=>0, "minutes"=>0, "seconds"=>16}}}]
308
+ end
309
+ end
310
+
311
+ describe "#bundle_log_day" do
312
+ it "returns log for com.apple.finder for 2014-09-01" do
313
+ toki.bundle_log_day('com.apple.finder', '2014-09-01')
314
+ resp = JSON.parse(toki.response)
315
+ expect(resp['meta']['code']).to eq 200
316
+ expect(resp['meta']['request']['command']).to eq 'bundle_log_range'
317
+ expect(resp['meta']['request']['args']).to eq ["com.apple.finder", "2014-09-01", "2014-09-02"]
318
+ expect(resp['data'].size).to eq 13
319
+ arr = resp['data'].to_a
320
+ expect(arr.first).to eq ["3343489613556420396", {"bundle"=>"com.apple.finder", "name"=>nil, "start"=>"2014-09-01 08:45:00 +0200", "duration"=>{"seconds"=>15, "time"=>{"hours"=>0, "minutes"=>0, "seconds"=>15}}}]
321
+ expect(arr.last).to eq ["8777542996540152763", {"bundle"=>"com.apple.finder", "name"=>nil, "start"=>"2014-09-01 21:45:00 +0200", "duration"=>{"seconds"=>61, "time"=>{"hours"=>0, "minutes"=>1, "seconds"=>1}}}]
322
+ end
323
+ end
324
+
325
+ describe "#log_since" do
326
+ it "returns log for recent activity" do
327
+ toki.log_since('2014-09-13')
328
+ resp = JSON.parse(toki.response)
329
+ expect(resp['meta']['code']).to eq 200
330
+ expect(resp['meta']['request']['command']).to eq 'log_since'
331
+ expect(resp['meta']['request']['args']).to eq ["2014-09-13"]
332
+ expect(resp['data'].size).to eq 87
333
+ arr = resp['data'].to_a
334
+ expect(arr.first).to eq ["1226267152535471391", {"bundle"=>"com.apple.appstore", "name"=>nil, "start"=>"2014-09-13 10:15:00 +0200", "duration"=>{"seconds"=>3, "time"=>{"hours"=>0, "minutes"=>0, "seconds"=>3}}}]
335
+ expect(arr.last).to eq ["7557789946794681026", {"bundle"=>"com.apple.Safari", "name"=>nil, "start"=>"2014-09-15 15:00:00 +0200", "duration"=>{"seconds"=>6, "time"=>{"hours"=>0, "minutes"=>0, "seconds"=>6}}}]
336
+ end
337
+ end
338
+
339
+ describe "#log_day" do
340
+ it "returns log for '2014-09-13'" do
341
+ toki.log_day('2014-09-13')
342
+ resp = JSON.parse(toki.response)
343
+ expect(resp['meta']['code']).to eq 200
344
+ expect(resp['meta']['request']['command']).to eq 'log_range'
345
+ expect(resp['meta']['request']['args']).to eq ["2014-09-13"]
346
+ expect(resp['data'].size).to eq 17
347
+ arr = resp['data'].to_a
348
+ expect(arr.first).to eq ["6362298701774470696", {"bundle"=>"com.apple.Safari", "name"=>nil, "start"=>"2014-09-13 10:15:00 +0200", "duration"=>{"seconds"=>54, "time"=>{"hours"=>0, "minutes"=>0, "seconds"=>54}}}]
349
+ expect(arr.last).to eq ["2496889557830869773", {"bundle"=>"com.apple.finder", "name"=>nil, "start"=>"2014-09-13 19:00:00 +0200", "duration"=>{"seconds"=>297, "time"=>{"hours"=>0, "minutes"=>4, "seconds"=>57}}}]
350
+ end
351
+ end
352
+
353
+
354
+ end