MuranoCLI 2.2.4 → 3.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.agignore +3 -0
- data/.gitignore +18 -1
- data/.rubocop.yml +222 -0
- data/.trustme.sh +185 -0
- data/.trustme.vim +24 -0
- data/Gemfile +23 -4
- data/LICENSE.txt +1 -1
- data/MuranoCLI.gemspec +43 -8
- data/README.markdown +9 -11
- data/Rakefile +187 -143
- data/TODO.taskpaper +2 -2
- data/bin/murano +51 -52
- data/docs/basic_example.rst +436 -0
- data/docs/completions/murano_completion-bash +3484 -0
- data/docs/demo.md +32 -32
- data/docs/develop.rst +391 -0
- data/lib/MrMurano.rb +21 -7
- data/lib/MrMurano/Account.rb +159 -174
- data/lib/MrMurano/Business.rb +381 -0
- data/lib/MrMurano/Config-Migrate.rb +32 -26
- data/lib/MrMurano/Config.rb +407 -128
- data/lib/MrMurano/Content.rb +191 -0
- data/lib/MrMurano/Gateway.rb +489 -0
- data/lib/MrMurano/Keystore.rb +48 -0
- data/lib/MrMurano/Passwords.rb +103 -0
- data/lib/MrMurano/ProjectFile.rb +121 -79
- data/lib/MrMurano/ReCommander.rb +114 -10
- data/lib/MrMurano/Setting.rb +90 -0
- data/lib/MrMurano/Solution-ServiceConfig.rb +89 -45
- data/lib/MrMurano/Solution-Services.rb +461 -166
- data/lib/MrMurano/Solution-Users.rb +70 -31
- data/lib/MrMurano/Solution.rb +372 -13
- data/lib/MrMurano/SolutionId.rb +73 -0
- data/lib/MrMurano/SyncRoot.rb +137 -0
- data/lib/MrMurano/SyncUpDown.rb +594 -284
- data/lib/MrMurano/Webservice-Cors.rb +71 -0
- data/lib/MrMurano/Webservice-Endpoint.rb +234 -0
- data/lib/MrMurano/Webservice-File.rb +193 -0
- data/lib/MrMurano/Webservice.rb +51 -0
- data/lib/MrMurano/commands.rb +18 -15
- data/lib/MrMurano/commands/business.rb +300 -6
- data/lib/MrMurano/commands/completion-bash.erb +166 -0
- data/lib/MrMurano/commands/{zshcomplete.erb → completion-zsh.erb} +0 -0
- data/lib/MrMurano/commands/completion.rb +76 -39
- data/lib/MrMurano/commands/config.rb +108 -44
- data/lib/MrMurano/commands/content.rb +115 -72
- data/lib/MrMurano/commands/cors.rb +29 -14
- data/lib/MrMurano/commands/devices.rb +286 -0
- data/lib/MrMurano/commands/domain.rb +52 -12
- data/lib/MrMurano/commands/gb.rb +24 -9
- data/lib/MrMurano/commands/globals.rb +64 -0
- data/lib/MrMurano/commands/init.rb +377 -155
- data/lib/MrMurano/commands/keystore.rb +92 -82
- data/lib/MrMurano/commands/link.rb +300 -0
- data/lib/MrMurano/commands/login.rb +74 -11
- data/lib/MrMurano/commands/logs.rb +63 -32
- data/lib/MrMurano/commands/mock.rb +57 -29
- data/lib/MrMurano/commands/password.rb +57 -39
- data/lib/MrMurano/commands/postgresql.rb +127 -94
- data/lib/MrMurano/commands/settings.rb +203 -0
- data/lib/MrMurano/commands/show.rb +79 -38
- data/lib/MrMurano/commands/solution.rb +423 -5
- data/lib/MrMurano/commands/solution_picker.rb +547 -0
- data/lib/MrMurano/commands/status.rb +195 -61
- data/lib/MrMurano/commands/sync.rb +78 -39
- data/lib/MrMurano/commands/timeseries.rb +71 -55
- data/lib/MrMurano/commands/tsdb.rb +113 -87
- data/lib/MrMurano/commands/usage.rb +57 -15
- data/lib/MrMurano/hash.rb +100 -10
- data/lib/MrMurano/http.rb +187 -43
- data/lib/MrMurano/makePretty.rb +16 -14
- data/lib/MrMurano/optparse.rb +2178 -0
- data/lib/MrMurano/progress.rb +138 -0
- data/lib/MrMurano/schema/resource-v1.0.0.yaml +32 -0
- data/lib/MrMurano/template/projectFile.murano.erb +16 -13
- data/lib/MrMurano/verbosing.rb +166 -29
- data/lib/MrMurano/version.rb +30 -1
- data/spec/Account-Passwords_spec.rb +21 -4
- data/spec/Account_spec.rb +69 -146
- data/spec/Business_spec.rb +290 -0
- data/spec/ConfigFile_spec.rb +1 -0
- data/spec/ConfigMigrate_spec.rb +12 -8
- data/spec/Config_spec.rb +40 -34
- data/spec/Content_spec.rb +363 -0
- data/spec/GatewayBase_spec.rb +54 -0
- data/spec/GatewayDevice_spec.rb +321 -0
- data/spec/GatewayResource_spec.rb +266 -0
- data/spec/GatewaySettings_spec.rb +120 -0
- data/spec/Http_spec.rb +18 -8
- data/spec/Mock_spec.rb +2 -2
- data/spec/ProjectFile_spec.rb +25 -14
- data/spec/Setting_spec.rb +110 -0
- data/spec/Solution-ServiceConfig_spec.rb +44 -5
- data/spec/Solution-ServiceEventHandler_spec.rb +23 -14
- data/spec/Solution-ServiceModules_spec.rb +47 -37
- data/spec/Solution-UsersRoles_spec.rb +10 -8
- data/spec/Solution_spec.rb +17 -8
- data/spec/SyncRoot_spec.rb +46 -20
- data/spec/SyncUpDown_spec.rb +437 -201
- data/spec/Verbosing_spec.rb +12 -4
- data/spec/{Solution-Cors_spec.rb → Webservice-Cors_spec.rb} +23 -20
- data/spec/{Solution-Endpoint_spec.rb → Webservice-Endpoint_spec.rb} +43 -41
- data/spec/{Solution-File_spec.rb → Webservice-File_spec.rb} +44 -33
- data/spec/Webservice-Setting_spec.rb +89 -0
- data/spec/_workspace.rb +4 -4
- data/spec/cmd_business_spec.rb +9 -4
- data/spec/cmd_common.rb +44 -1
- data/spec/cmd_content_spec.rb +43 -17
- data/spec/cmd_cors_spec.rb +4 -4
- data/spec/cmd_device_spec.rb +61 -16
- data/spec/cmd_domain_spec.rb +29 -6
- data/spec/cmd_init_spec.rb +281 -126
- data/spec/cmd_keystore_spec.rb +3 -3
- data/spec/cmd_link_spec.rb +98 -0
- data/spec/cmd_password_spec.rb +1 -1
- data/spec/cmd_setting_application_spec.rb +260 -0
- data/spec/cmd_setting_product_spec.rb +220 -0
- data/spec/cmd_status_spec.rb +223 -114
- data/spec/cmd_syncdown_spec.rb +115 -35
- data/spec/cmd_syncup_spec.rb +68 -15
- data/spec/cmd_usage_spec.rb +35 -8
- data/spec/fixtures/dumped_config +6 -4
- data/spec/fixtures/gateway_resource_files/resources.notyaml +12 -0
- data/spec/fixtures/gateway_resource_files/resources.yaml +13 -0
- data/spec/fixtures/gateway_resource_files/resources_invalid.yaml +13 -0
- data/spec/fixtures/mrmuranorc_deleted_bob +0 -2
- data/spec/fixtures/product_spec_files/lightbulb.yaml +20 -13
- data/spec/fixtures/{syncable_content → syncable_conflict}/services/devdata.lua +1 -1
- data/spec/fixtures/{syncable_content → syncable_conflict}/services/timers.lua +0 -0
- data/spec/spec_helper.rb +5 -0
- metadata +262 -171
- data/bin/mr +0 -8
- data/lib/MrMurano/Product-1P-Device.rb +0 -145
- data/lib/MrMurano/Product-Resources.rb +0 -205
- data/lib/MrMurano/Product.rb +0 -358
- data/lib/MrMurano/Solution-Cors.rb +0 -47
- data/lib/MrMurano/Solution-Endpoint.rb +0 -191
- data/lib/MrMurano/Solution-File.rb +0 -166
- data/lib/MrMurano/commands/assign.rb +0 -57
- data/lib/MrMurano/commands/businessList.rb +0 -45
- data/lib/MrMurano/commands/product.rb +0 -14
- data/lib/MrMurano/commands/productCreate.rb +0 -39
- data/lib/MrMurano/commands/productDelete.rb +0 -33
- data/lib/MrMurano/commands/productDevice.rb +0 -87
- data/lib/MrMurano/commands/productDeviceIdCmds.rb +0 -89
- data/lib/MrMurano/commands/productList.rb +0 -45
- data/lib/MrMurano/commands/productWrite.rb +0 -27
- data/lib/MrMurano/commands/solutionCreate.rb +0 -41
- data/lib/MrMurano/commands/solutionDelete.rb +0 -34
- data/lib/MrMurano/commands/solutionList.rb +0 -45
- data/spec/ProductBase_spec.rb +0 -113
- data/spec/ProductContent_spec.rb +0 -162
- data/spec/ProductResources_spec.rb +0 -329
- data/spec/Product_1P_Device_spec.rb +0 -202
- data/spec/Product_1P_RPC_spec.rb +0 -175
- data/spec/Product_spec.rb +0 -153
- data/spec/Solution-ServiceDevice_spec.rb +0 -176
- data/spec/cmd_assign_spec.rb +0 -51
@@ -1,23 +1,25 @@
|
|
1
|
+
require 'tempfile'
|
2
|
+
require 'MrMurano/hash'
|
1
3
|
require 'MrMurano/version'
|
2
4
|
require 'MrMurano/Solution-Users'
|
3
|
-
require 'MrMurano/
|
4
|
-
require 'tempfile'
|
5
|
+
require 'MrMurano/SyncRoot'
|
5
6
|
require '_workspace'
|
6
7
|
|
7
8
|
RSpec.describe MrMurano::Role do
|
8
9
|
include_context "WORKSPACE"
|
9
10
|
before(:example) do
|
11
|
+
MrMurano::SyncRoot.instance.reset
|
10
12
|
$cfg = MrMurano::Config.new
|
11
13
|
$cfg.load
|
12
14
|
$cfg['net.host'] = 'bizapi.hosted.exosite.io'
|
13
|
-
$cfg['
|
15
|
+
$cfg['application.id'] = 'XYZ'
|
14
16
|
|
15
17
|
@srv = MrMurano::Role.new
|
16
18
|
allow(@srv).to receive(:token).and_return("TTTTTTTTTT")
|
17
19
|
end
|
18
20
|
|
19
21
|
it "initializes" do
|
20
|
-
uri = @srv.
|
22
|
+
uri = @srv.endpoint('/')
|
21
23
|
expect(uri.to_s).to eq("https://bizapi.hosted.exosite.io/api:1/solution/XYZ/role/")
|
22
24
|
end
|
23
25
|
|
@@ -110,7 +112,7 @@ RSpec.describe MrMurano::Role do
|
|
110
112
|
|
111
113
|
context "downloads" do
|
112
114
|
before(:example) do
|
113
|
-
@lry = Pathname.new(@
|
115
|
+
@lry = Pathname.new(@project_dir) + 'roles.yaml'
|
114
116
|
@grl = {:role_id=>"guest", :parameter=>[{:name=>"could"}]}
|
115
117
|
end
|
116
118
|
|
@@ -133,7 +135,7 @@ RSpec.describe MrMurano::Role do
|
|
133
135
|
|
134
136
|
context "removing local roles" do
|
135
137
|
before(:example) do
|
136
|
-
@lry = Pathname.new(@
|
138
|
+
@lry = Pathname.new(@project_dir) + 'roles.yaml'
|
137
139
|
@grl = {:role_id=>"guest", :parameter=>[{:name=>"could"}]}
|
138
140
|
end
|
139
141
|
|
@@ -166,14 +168,14 @@ RSpec.describe MrMurano::Role do
|
|
166
168
|
end
|
167
169
|
|
168
170
|
it "tolocalpath is into" do
|
169
|
-
lry = Pathname.new(@
|
171
|
+
lry = Pathname.new(@project_dir) + 'roles.yaml'
|
170
172
|
ret = @srv.tolocalpath(lry, {:role_id=>"guest", :parameter=>[{:name=>"could"}]})
|
171
173
|
expect(ret).to eq(lry)
|
172
174
|
end
|
173
175
|
|
174
176
|
context "list local items" do
|
175
177
|
before(:example) do
|
176
|
-
@lry = Pathname.new(@
|
178
|
+
@lry = Pathname.new(@project_dir) + 'roles.yaml'
|
177
179
|
end
|
178
180
|
|
179
181
|
it "when missing" do
|
data/spec/Solution_spec.rb
CHANGED
@@ -1,25 +1,33 @@
|
|
1
|
-
require 'MrMurano/version'
|
2
|
-
require 'MrMurano/Solution-Cors'
|
3
1
|
require 'tempfile'
|
4
2
|
require 'yaml'
|
3
|
+
require 'MrMurano/version'
|
4
|
+
require 'MrMurano/ProjectFile'
|
5
|
+
require 'MrMurano/Solution'
|
6
|
+
require 'MrMurano/SyncRoot'
|
5
7
|
require '_workspace'
|
6
8
|
|
7
9
|
RSpec.describe MrMurano::Solution do
|
8
10
|
include_context "WORKSPACE"
|
9
11
|
before(:example) do
|
12
|
+
MrMurano::SyncRoot.instance.reset
|
10
13
|
$cfg = MrMurano::Config.new
|
11
14
|
$cfg.load
|
12
15
|
$project = MrMurano::ProjectFile.new
|
13
16
|
$project.load
|
14
17
|
$cfg['net.host'] = 'bizapi.hosted.exosite.io'
|
15
|
-
$cfg['
|
18
|
+
$cfg['product.id'] = 'XYZ'
|
19
|
+
$cfg['application.id'] = 'XYZ'
|
20
|
+
|
21
|
+
# NOTE: This test works on either Product or Application.
|
22
|
+
# MAYBE: Add Application to this test.
|
23
|
+
@srv = MrMurano::Product.new
|
24
|
+
#@srv = MrMurano::Application.new
|
16
25
|
|
17
|
-
@srv = MrMurano::Solution.new
|
18
26
|
allow(@srv).to receive(:token).and_return("TTTTTTTTTT")
|
19
27
|
end
|
20
28
|
|
21
29
|
it "initializes" do
|
22
|
-
uri = @srv.
|
30
|
+
uri = @srv.endpoint('/')
|
23
31
|
expect(uri.to_s).to eq("https://bizapi.hosted.exosite.io/api:1/solution/XYZ/")
|
24
32
|
end
|
25
33
|
|
@@ -31,7 +39,7 @@ RSpec.describe MrMurano::Solution do
|
|
31
39
|
:biz_id=>"ABCDEFG",
|
32
40
|
:cors=> "{\"origin\":true,\"methods\":[\"HEAD\",\"GET\",\"POST\",\"PUT\",\"DELETE\",\"OPTIONS\",\"PATCH\"],\"headers\":[\"Content-Type\",\"Cookie\",\"Authorization\"],\"credentials\":true}"
|
33
41
|
}
|
34
|
-
|
42
|
+
|
35
43
|
stub_request(:get, "https://bizapi.hosted.exosite.io/api:1/solution/XYZ").
|
36
44
|
with(:headers=>{'Authorization'=>'token TTTTTTTTTT',
|
37
45
|
'Content-Type'=>'application/json'}).
|
@@ -49,13 +57,13 @@ RSpec.describe MrMurano::Solution do
|
|
49
57
|
:biz_id=>"ABCDEFG",
|
50
58
|
:cors=> "{\"origin\":true,\"methods\":[\"HEAD\",\"GET\",\"POST\",\"PUT\",\"DELETE\",\"OPTIONS\",\"PATCH\"],\"headers\":[\"Content-Type\",\"Cookie\",\"Authorization\"],\"credentials\":true}"
|
51
59
|
}
|
52
|
-
|
60
|
+
|
53
61
|
stub_request(:get, "https://bizapi.hosted.exosite.io/api:1/solution/XYZ/").
|
54
62
|
with(:headers=>{'Authorization'=>'token TTTTTTTTTT',
|
55
63
|
'Content-Type'=>'application/json'}).
|
56
64
|
to_return(body: body.to_json)
|
57
65
|
|
58
|
-
ret = @srv.list
|
66
|
+
ret = @srv.list
|
59
67
|
expect(ret).to eq(body)
|
60
68
|
end
|
61
69
|
|
@@ -90,3 +98,4 @@ RSpec.describe MrMurano::Solution do
|
|
90
98
|
end
|
91
99
|
|
92
100
|
# vim: set ai et sw=2 ts=2 :
|
101
|
+
|
data/spec/SyncRoot_spec.rb
CHANGED
@@ -1,6 +1,14 @@
|
|
1
|
+
# Last Modified: 2017.08.17 /coding: utf-8
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
# Copyright © 2016-2017 Exosite LLC.
|
5
|
+
# License: MIT. See LICENSE.txt.
|
6
|
+
# vim:tw=0:ts=2:sw=2:et:ai
|
7
|
+
|
1
8
|
require 'MrMurano/version'
|
2
9
|
require 'MrMurano/Config'
|
3
10
|
require 'MrMurano/ProjectFile'
|
11
|
+
require 'MrMurano/SyncRoot'
|
4
12
|
require 'MrMurano/SyncUpDown'
|
5
13
|
require '_workspace'
|
6
14
|
|
@@ -8,17 +16,33 @@ RSpec.describe MrMurano::SyncRoot do
|
|
8
16
|
include_context "WORKSPACE"
|
9
17
|
|
10
18
|
after(:example) do
|
11
|
-
MrMurano::SyncRoot.reset
|
19
|
+
MrMurano::SyncRoot.instance.reset
|
12
20
|
end
|
13
21
|
|
14
22
|
before(:example) do
|
15
|
-
MrMurano::SyncRoot.reset # also creates @@syncset
|
16
|
-
|
23
|
+
MrMurano::SyncRoot.instance.reset # also creates @@syncset
|
24
|
+
# Weird/2017-07-31: I [lb] must[ve changed something, because this
|
25
|
+
# block being called twice, which is generating a warning:
|
26
|
+
# /exo/clients/exosite/MuranoCLIs/MuranoCLI+landonb/spec/SyncRoot_spec.rb:30:
|
27
|
+
# warning: method redefined; discarding old description
|
28
|
+
# /exo/clients/exosite/MuranoCLIs/MuranoCLI+landonb/spec/SyncRoot_spec.rb:30:
|
29
|
+
# warning: previous definition of description was here
|
30
|
+
if !defined?(User)
|
31
|
+
class User
|
32
|
+
def self.description
|
33
|
+
%(describe user)
|
34
|
+
end
|
35
|
+
end
|
17
36
|
end
|
18
|
-
|
37
|
+
MrMurano::SyncRoot.instance.add('user', User, 'U', true)
|
38
|
+
if !defined?(Role)
|
39
|
+
class Role
|
40
|
+
def self.description
|
41
|
+
%(describe role)
|
42
|
+
end
|
43
|
+
end
|
19
44
|
end
|
20
|
-
MrMurano::SyncRoot.add('
|
21
|
-
MrMurano::SyncRoot.add('role', Role, 'R', "describe role")
|
45
|
+
MrMurano::SyncRoot.instance.add('role', Role, 'G', false)
|
22
46
|
|
23
47
|
# This must happen after all syncables have been added.
|
24
48
|
$cfg = MrMurano::Config.new
|
@@ -27,7 +51,7 @@ RSpec.describe MrMurano::SyncRoot do
|
|
27
51
|
$project.load
|
28
52
|
|
29
53
|
@options = {}
|
30
|
-
@options.define_singleton_method(:method_missing) do |mid
|
54
|
+
@options.define_singleton_method(:method_missing) do |mid, *args|
|
31
55
|
if mid.to_s.match(/^(.+)=$/) then
|
32
56
|
self[$1.to_sym] = args.first
|
33
57
|
else
|
@@ -37,47 +61,49 @@ RSpec.describe MrMurano::SyncRoot do
|
|
37
61
|
end
|
38
62
|
|
39
63
|
it "has defaults" do
|
40
|
-
ret = MrMurano::SyncRoot.bydefault
|
64
|
+
ret = MrMurano::SyncRoot.instance.bydefault
|
41
65
|
expect(ret).to eq(['user'])
|
42
66
|
end
|
43
67
|
|
44
68
|
it "iterates on each" do
|
45
69
|
ret=[]
|
46
|
-
MrMurano::SyncRoot.each{|a,
|
70
|
+
MrMurano::SyncRoot.instance.each { |a, _b, _c, _d| ret << a }
|
47
71
|
expect(ret).to eq(["user", "role"])
|
48
72
|
end
|
49
73
|
|
50
74
|
it "iterates only on selected" do
|
51
75
|
@options.role = true
|
52
76
|
ret=[]
|
53
|
-
MrMurano::SyncRoot.each_filtered(@options) {|a,
|
77
|
+
MrMurano::SyncRoot.instance.each_filtered(@options) { |a, _b, _c, _d| ret << a }
|
54
78
|
expect(ret).to eq(["role"])
|
55
79
|
end
|
56
80
|
|
57
81
|
it "selects all" do
|
58
82
|
@options.all = true
|
59
|
-
MrMurano::SyncRoot.
|
83
|
+
MrMurano::SyncRoot.instance.check_same(@options)
|
60
84
|
expect(@options).to eq({:all=>true, :user=>true, :role=>true})
|
61
85
|
end
|
62
86
|
|
63
87
|
it "selects defaults when none" do
|
64
|
-
MrMurano::SyncRoot.
|
88
|
+
MrMurano::SyncRoot.instance.check_same(@options)
|
65
89
|
expect(@options).to eq({:user=>true})
|
66
90
|
end
|
67
91
|
|
68
92
|
it "selects custom defaults when none" do
|
69
93
|
$cfg['sync.bydefault'] = 'role'
|
70
|
-
MrMurano::SyncRoot.
|
71
|
-
expect(@options).to eq({:
|
94
|
+
MrMurano::SyncRoot.instance.check_same(@options)
|
95
|
+
expect(@options).to eq({role: true})
|
72
96
|
end
|
73
97
|
|
74
98
|
it "builds option params" do
|
75
|
-
ret=[]
|
76
|
-
MrMurano::SyncRoot.each_option do |s,l,d|
|
77
|
-
ret << [s,l,d]
|
99
|
+
ret = []
|
100
|
+
MrMurano::SyncRoot.instance.each_option do |s, l, d|
|
101
|
+
ret << [s, l, d]
|
78
102
|
end
|
79
|
-
expect(ret).to eq([
|
103
|
+
expect(ret).to eq([
|
104
|
+
["-U", "--[no-]user", "describe user"],
|
105
|
+
["-G", "--[no-]role", "describe role"],
|
106
|
+
])
|
80
107
|
end
|
81
|
-
|
82
108
|
end
|
83
|
-
|
109
|
+
|
data/spec/SyncUpDown_spec.rb
CHANGED
@@ -1,18 +1,39 @@
|
|
1
|
-
require 'MrMurano/version'
|
2
1
|
require 'MrMurano/verbosing'
|
2
|
+
require 'MrMurano/version'
|
3
3
|
require 'MrMurano/Config'
|
4
|
+
require 'MrMurano/ProjectFile'
|
5
|
+
require 'MrMurano/SyncRoot'
|
4
6
|
require 'MrMurano/SyncUpDown'
|
5
7
|
require '_workspace'
|
6
8
|
|
7
9
|
class TSUD
|
8
10
|
include MrMurano::Verbose
|
9
11
|
include MrMurano::SyncUpDown
|
12
|
+
|
10
13
|
def initialize
|
14
|
+
# 2017-07-03: See MrMurano::SolutionBase.state for the list of attrs.
|
15
|
+
@sid = 'XYZ'
|
16
|
+
@valid_sid = true
|
17
|
+
@uriparts = []
|
18
|
+
@solntype = 'application.id'
|
11
19
|
@itemkey = :name
|
12
20
|
@project_section = :routes
|
13
21
|
end
|
22
|
+
|
23
|
+
def sid
|
24
|
+
@sid
|
25
|
+
end
|
26
|
+
|
27
|
+
def sid?
|
28
|
+
@valid_sid
|
29
|
+
end
|
30
|
+
|
14
31
|
def fetch(id)
|
15
32
|
end
|
33
|
+
|
34
|
+
def self.description
|
35
|
+
%(Time Series Database)
|
36
|
+
end
|
16
37
|
end
|
17
38
|
|
18
39
|
RSpec::Matchers.define :pathname_globs do |glob|
|
@@ -21,10 +42,12 @@ RSpec::Matchers.define :pathname_globs do |glob|
|
|
21
42
|
end
|
22
43
|
end
|
23
44
|
|
45
|
+
ITEM_UPDATED_AT="2017-06-24T00:45:15.564Z"
|
46
|
+
|
24
47
|
RSpec.describe MrMurano::SyncUpDown do
|
25
48
|
include_context "WORKSPACE"
|
26
49
|
before(:example) do
|
27
|
-
MrMurano::SyncRoot.reset
|
50
|
+
MrMurano::SyncRoot.instance.reset
|
28
51
|
$cfg = MrMurano::Config.new
|
29
52
|
$cfg.load
|
30
53
|
$project = MrMurano::ProjectFile.new
|
@@ -32,7 +55,8 @@ RSpec.describe MrMurano::SyncUpDown do
|
|
32
55
|
$project['routes.location'] = 'tsud'
|
33
56
|
$project['routes.include'] = ['*.lua', '*/*.lua']
|
34
57
|
$cfg['net.host'] = 'bizapi.hosted.exosite.io'
|
35
|
-
$cfg['
|
58
|
+
$cfg['product.id'] = 'XYZ'
|
59
|
+
$cfg['application.id'] = 'XYZ'
|
36
60
|
end
|
37
61
|
|
38
62
|
context "status" do
|
@@ -40,173 +64,241 @@ RSpec.describe MrMurano::SyncUpDown do
|
|
40
64
|
t = TSUD.new
|
41
65
|
expect(t).to receive(:warning).once.with(/Skipping missing location.*/)
|
42
66
|
ret = t.status
|
43
|
-
expect(ret).to eq({:
|
67
|
+
expect(ret).to eq({toadd: [], todel: [], tomod: [], unchg: [], skipd: []})
|
44
68
|
end
|
45
69
|
|
46
70
|
it "finds nothing in empty directory" do
|
47
|
-
FileUtils.mkpath(@
|
71
|
+
FileUtils.mkpath(@project_dir + '/tsud')
|
48
72
|
t = TSUD.new
|
49
73
|
ret = t.status
|
50
|
-
expect(ret).to eq({:
|
74
|
+
expect(ret).to eq({toadd: [], todel: [], tomod: [], unchg: [], skipd: []})
|
51
75
|
end
|
52
76
|
|
53
77
|
it "finds things there but not here" do
|
54
|
-
FileUtils.mkpath(@
|
78
|
+
FileUtils.mkpath(@project_dir + '/tsud')
|
55
79
|
t = TSUD.new
|
56
80
|
expect(t).to receive(:list).once.and_return([
|
57
|
-
{:name=>1},
|
81
|
+
{:name=>1},
|
82
|
+
{:name=>2},
|
83
|
+
{:name=>3},
|
58
84
|
])
|
59
85
|
ret = t.status
|
60
86
|
expect(ret).to eq({
|
61
87
|
:toadd=>[],
|
62
|
-
:todel=>[
|
88
|
+
:todel=>[
|
89
|
+
{
|
90
|
+
:name=>1,
|
91
|
+
:synckey=>1,
|
92
|
+
:synctype=>TSUD.description,
|
93
|
+
},
|
94
|
+
{
|
95
|
+
:name=>2,
|
96
|
+
:synckey=>2,
|
97
|
+
:synctype=>TSUD.description,
|
98
|
+
},
|
99
|
+
{
|
100
|
+
:name=>3,
|
101
|
+
:synckey=>3,
|
102
|
+
:synctype=>TSUD.description,
|
103
|
+
}],
|
63
104
|
:tomod=>[],
|
64
|
-
:unchg=>[]
|
105
|
+
:unchg=>[],
|
106
|
+
:skipd=>[],
|
107
|
+
})
|
65
108
|
end
|
66
109
|
|
67
110
|
it "finds things there but not here; asdown" do
|
68
|
-
FileUtils.mkpath(@
|
111
|
+
FileUtils.mkpath(@project_dir + '/tsud')
|
69
112
|
t = TSUD.new
|
70
113
|
expect(t).to receive(:list).once.and_return([
|
71
|
-
{:name=>1},
|
114
|
+
{:name=>1},
|
115
|
+
{:name=>2},
|
116
|
+
{:name=>3},
|
72
117
|
])
|
73
118
|
ret = t.status({:asdown=>true})
|
74
119
|
expect(ret).to eq({
|
75
|
-
:
|
76
|
-
|
77
|
-
|
78
|
-
|
120
|
+
todel: [],
|
121
|
+
toadd: [
|
122
|
+
{ name: 1, synckey: 1, synctype: TSUD.description },
|
123
|
+
{ name: 2, synckey: 2, synctype: TSUD.description },
|
124
|
+
{ name: 3, synckey: 3, synctype: TSUD.description },
|
125
|
+
],
|
126
|
+
tomod: [],
|
127
|
+
unchg: [],
|
128
|
+
skipd: [],
|
129
|
+
})
|
79
130
|
end
|
80
131
|
|
81
132
|
it "finds things here but not there" do
|
82
|
-
FileUtils.mkpath(@
|
83
|
-
FileUtils.touch(@
|
84
|
-
FileUtils.touch(@
|
133
|
+
FileUtils.mkpath(@project_dir + '/tsud')
|
134
|
+
FileUtils.touch(@project_dir + '/tsud/one.lua')
|
135
|
+
FileUtils.touch(@project_dir + '/tsud/two.lua')
|
85
136
|
t = TSUD.new
|
86
|
-
expect(t).to receive(:
|
87
|
-
{:name=>'one.lua'},
|
137
|
+
expect(t).to receive(:to_remote_item).and_return(
|
138
|
+
{:name=>'one.lua'},
|
139
|
+
{:name=>'two.lua'},
|
88
140
|
)
|
89
141
|
ret = t.status
|
90
142
|
expect(ret).to match({
|
91
|
-
:
|
92
|
-
{
|
93
|
-
|
94
|
-
|
95
|
-
|
143
|
+
toadd: [
|
144
|
+
{
|
145
|
+
name: 'one.lua',
|
146
|
+
synckey: 'one.lua',
|
147
|
+
synctype: TSUD.description,
|
148
|
+
local_path: an_instance_of(Pathname),
|
149
|
+
},
|
150
|
+
{
|
151
|
+
name: 'two.lua',
|
152
|
+
synckey: 'two.lua',
|
153
|
+
synctype: TSUD.description,
|
154
|
+
local_path: an_instance_of(Pathname),
|
155
|
+
},
|
96
156
|
],
|
97
|
-
:
|
98
|
-
:
|
99
|
-
:
|
157
|
+
todel: [],
|
158
|
+
tomod: [],
|
159
|
+
unchg: [],
|
160
|
+
skipd: [],
|
161
|
+
})
|
100
162
|
end
|
101
163
|
|
102
164
|
it "finds things here and there" do
|
103
|
-
FileUtils.mkpath(@
|
104
|
-
FileUtils.touch(@
|
105
|
-
FileUtils.touch(@
|
165
|
+
FileUtils.mkpath(@project_dir + '/tsud')
|
166
|
+
FileUtils.touch(@project_dir + '/tsud/one.lua')
|
167
|
+
FileUtils.touch(@project_dir + '/tsud/two.lua')
|
106
168
|
t = TSUD.new
|
107
169
|
expect(t).to receive(:list).once.and_return([
|
108
|
-
{:name=>'one.lua'},
|
170
|
+
{:name=>'one.lua'},
|
171
|
+
{:name=>'two.lua'},
|
109
172
|
])
|
110
|
-
expect(t).to receive(:
|
111
|
-
{:name=>'one.lua'},
|
173
|
+
expect(t).to receive(:to_remote_item).and_return(
|
174
|
+
{:name=>'one.lua'},
|
175
|
+
{:name=>'two.lua'},
|
112
176
|
)
|
113
177
|
ret = t.status
|
114
178
|
expect(ret).to match({
|
115
|
-
:
|
116
|
-
{
|
117
|
-
|
118
|
-
|
119
|
-
|
179
|
+
tomod: [
|
180
|
+
{
|
181
|
+
name: 'one.lua',
|
182
|
+
synckey: 'one.lua',
|
183
|
+
synctype: TSUD.description,
|
184
|
+
local_path: an_instance_of(Pathname),
|
185
|
+
},
|
186
|
+
{
|
187
|
+
name: 'two.lua',
|
188
|
+
synckey: 'two.lua',
|
189
|
+
synctype: TSUD.description,
|
190
|
+
local_path: an_instance_of(Pathname),
|
191
|
+
},
|
120
192
|
],
|
121
|
-
:
|
122
|
-
:
|
123
|
-
:
|
193
|
+
todel: [],
|
194
|
+
toadd: [],
|
195
|
+
unchg: [],
|
196
|
+
skipd: [],
|
197
|
+
})
|
124
198
|
end
|
125
199
|
it "finds things here and there; but they're the same" do
|
126
|
-
FileUtils.mkpath(@
|
127
|
-
FileUtils.touch(@
|
128
|
-
FileUtils.touch(@
|
200
|
+
FileUtils.mkpath(@project_dir + '/tsud')
|
201
|
+
FileUtils.touch(@project_dir + '/tsud/one.lua')
|
202
|
+
FileUtils.touch(@project_dir + '/tsud/two.lua')
|
129
203
|
t = TSUD.new
|
130
204
|
expect(t).to receive(:list).once.and_return([
|
131
|
-
{:name=>'one.lua'},
|
205
|
+
{:name=>'one.lua'},
|
206
|
+
{:name=>'two.lua'},
|
132
207
|
])
|
133
|
-
expect(t).to receive(:
|
134
|
-
{:name=>'one.lua'},
|
208
|
+
expect(t).to receive(:to_remote_item).and_return(
|
209
|
+
{:name=>'one.lua'},
|
210
|
+
{:name=>'two.lua'},
|
135
211
|
)
|
136
212
|
expect(t).to receive(:docmp).twice.and_return(false)
|
137
213
|
ret = t.status
|
138
214
|
expect(ret).to match({
|
139
|
-
:
|
140
|
-
{
|
141
|
-
|
142
|
-
|
143
|
-
|
215
|
+
unchg: [
|
216
|
+
{
|
217
|
+
name: 'one.lua',
|
218
|
+
synckey: 'one.lua',
|
219
|
+
synctype: TSUD.description,
|
220
|
+
local_path: an_instance_of(Pathname),
|
221
|
+
},
|
222
|
+
{
|
223
|
+
name: 'two.lua',
|
224
|
+
synckey: 'two.lua',
|
225
|
+
synctype: TSUD.description,
|
226
|
+
local_path: an_instance_of(Pathname),
|
227
|
+
},
|
144
228
|
],
|
145
|
-
:
|
146
|
-
:
|
147
|
-
:
|
229
|
+
todel: [],
|
230
|
+
toadd: [],
|
231
|
+
tomod: [],
|
232
|
+
skipd: [],
|
233
|
+
})
|
148
234
|
end
|
149
235
|
|
150
236
|
it "calls diff" do
|
151
|
-
FileUtils.mkpath(@
|
152
|
-
FileUtils.touch(@
|
237
|
+
FileUtils.mkpath(@project_dir + '/tsud')
|
238
|
+
FileUtils.touch(@project_dir + '/tsud/one.lua')
|
153
239
|
t = TSUD.new
|
154
240
|
expect(t).to receive(:list).once.and_return([
|
155
241
|
{:name=>'one.lua'}
|
156
242
|
])
|
157
|
-
expect(t).to receive(:
|
243
|
+
expect(t).to receive(:to_remote_item).and_return(
|
158
244
|
{:name=>'one.lua'}
|
159
245
|
)
|
160
246
|
expect(t).to receive(:dodiff).once.and_return("diffed output")
|
161
247
|
ret = t.status({:diff=>true})
|
162
248
|
expect(ret).to match({
|
163
|
-
:
|
164
|
-
{
|
165
|
-
|
166
|
-
|
249
|
+
tomod: [
|
250
|
+
{
|
251
|
+
name: 'one.lua',
|
252
|
+
synckey: 'one.lua',
|
253
|
+
synctype: TSUD.description,
|
254
|
+
local_path: an_instance_of(Pathname),
|
255
|
+
diff: "diffed output",
|
256
|
+
},
|
167
257
|
],
|
168
|
-
:
|
169
|
-
:
|
170
|
-
:
|
258
|
+
todel: [],
|
259
|
+
toadd: [],
|
260
|
+
unchg: [],
|
261
|
+
skipd: [],
|
262
|
+
})
|
171
263
|
end
|
172
264
|
|
173
265
|
context "Filtering" do
|
174
266
|
before(:example) do
|
175
|
-
FileUtils.mkpath(@
|
176
|
-
FileUtils.mkpath(@
|
177
|
-
FileUtils.touch(@
|
178
|
-
FileUtils.touch(@
|
179
|
-
FileUtils.touch(@
|
180
|
-
FileUtils.touch(@
|
181
|
-
FileUtils.touch(@
|
182
|
-
FileUtils.touch(@
|
267
|
+
FileUtils.mkpath(@project_dir + '/tsud/ga')
|
268
|
+
FileUtils.mkpath(@project_dir + '/tsud/gb')
|
269
|
+
FileUtils.touch(@project_dir + '/tsud/one.lua') # tomod
|
270
|
+
FileUtils.touch(@project_dir + '/tsud/ga/two.lua') # tomod
|
271
|
+
FileUtils.touch(@project_dir + '/tsud/three.lua') # unchg
|
272
|
+
FileUtils.touch(@project_dir + '/tsud/gb/four.lua') # unchg
|
273
|
+
FileUtils.touch(@project_dir + '/tsud/five.lua') # toadd
|
274
|
+
FileUtils.touch(@project_dir + '/tsud/ga/six.lua') # toadd
|
183
275
|
@t = TSUD.new
|
184
276
|
expect(@t).to receive(:list).once.and_return([
|
185
|
-
MrMurano::SyncUpDown::Item.new({:name=>'
|
186
|
-
MrMurano::SyncUpDown::Item.new({:name=>'
|
187
|
-
MrMurano::SyncUpDown::Item.new({:name=>'
|
188
|
-
MrMurano::SyncUpDown::Item.new({:name=>'
|
189
|
-
MrMurano::SyncUpDown::Item.new({:name=>'
|
190
|
-
MrMurano::SyncUpDown::Item.new({:name=>'
|
277
|
+
MrMurano::SyncUpDown::Item.new({:name=>'eight.lua', :updated_at=>ITEM_UPDATED_AT}), # todel
|
278
|
+
MrMurano::SyncUpDown::Item.new({:name=>'four.lua', :updated_at=>ITEM_UPDATED_AT}), # unchg
|
279
|
+
MrMurano::SyncUpDown::Item.new({:name=>'one.lua', :updated_at=>ITEM_UPDATED_AT}), # tomod
|
280
|
+
MrMurano::SyncUpDown::Item.new({:name=>'seven.lua', :updated_at=>ITEM_UPDATED_AT}), # todel
|
281
|
+
MrMurano::SyncUpDown::Item.new({:name=>'three.lua', :updated_at=>ITEM_UPDATED_AT}), # unchg
|
282
|
+
MrMurano::SyncUpDown::Item.new({:name=>'two.lua', :updated_at=>ITEM_UPDATED_AT}), # tomod
|
191
283
|
])
|
192
|
-
expect(@t).to receive(:
|
284
|
+
expect(@t).to receive(:to_remote_item).
|
193
285
|
with(anything(), pathname_globs('**/one.lua')).
|
194
|
-
and_return(MrMurano::SyncUpDown::Item.new({:name=>'one.lua'}))
|
195
|
-
expect(@t).to receive(:
|
286
|
+
and_return(MrMurano::SyncUpDown::Item.new({:name=>'one.lua', :updated_at=>ITEM_UPDATED_AT}))
|
287
|
+
expect(@t).to receive(:to_remote_item).
|
196
288
|
with(anything(), pathname_globs('**/two.lua')).
|
197
|
-
and_return(MrMurano::SyncUpDown::Item.new({:name=>'two.lua'}))
|
198
|
-
expect(@t).to receive(:
|
289
|
+
and_return(MrMurano::SyncUpDown::Item.new({:name=>'two.lua', :updated_at=>ITEM_UPDATED_AT}))
|
290
|
+
expect(@t).to receive(:to_remote_item).
|
199
291
|
with(anything(), pathname_globs('**/three.lua')).
|
200
|
-
and_return(MrMurano::SyncUpDown::Item.new({:name=>'three.lua'}))
|
201
|
-
expect(@t).to receive(:
|
292
|
+
and_return(MrMurano::SyncUpDown::Item.new({:name=>'three.lua', :updated_at=>ITEM_UPDATED_AT}))
|
293
|
+
expect(@t).to receive(:to_remote_item).
|
202
294
|
with(anything(), pathname_globs('**/four.lua')).
|
203
|
-
and_return(MrMurano::SyncUpDown::Item.new({:name=>'four.lua'}))
|
204
|
-
expect(@t).to receive(:
|
295
|
+
and_return(MrMurano::SyncUpDown::Item.new({:name=>'four.lua', :updated_at=>ITEM_UPDATED_AT}))
|
296
|
+
expect(@t).to receive(:to_remote_item).
|
205
297
|
with(anything(), pathname_globs('**/five.lua')).
|
206
|
-
and_return(MrMurano::SyncUpDown::Item.new({:name=>'five.lua'}))
|
207
|
-
expect(@t).to receive(:
|
298
|
+
and_return(MrMurano::SyncUpDown::Item.new({:name=>'five.lua', :updated_at=>ITEM_UPDATED_AT}))
|
299
|
+
expect(@t).to receive(:to_remote_item).
|
208
300
|
with(anything(), pathname_globs('**/six.lua')).
|
209
|
-
and_return(MrMurano::SyncUpDown::Item.new({:name=>'six.lua'}))
|
301
|
+
and_return(MrMurano::SyncUpDown::Item.new({:name=>'six.lua', :updated_at=>ITEM_UPDATED_AT}))
|
210
302
|
|
211
303
|
expect(@t).to receive(:docmp).with(have_attributes({:name=>'one.lua'}),anything()).and_return(true)
|
212
304
|
expect(@t).to receive(:docmp).with(have_attributes({:name=>'two.lua'}),anything()).and_return(true)
|
@@ -218,27 +310,69 @@ RSpec.describe MrMurano::SyncUpDown do
|
|
218
310
|
ret = @t.status
|
219
311
|
expect(ret).to match({
|
220
312
|
:unchg=>[
|
221
|
-
have_attributes(
|
222
|
-
|
223
|
-
|
224
|
-
|
313
|
+
have_attributes(
|
314
|
+
{
|
315
|
+
:name=>'four.lua',
|
316
|
+
:synckey=>'four.lua',
|
317
|
+
:synctype=>TSUD.description,
|
318
|
+
:local_path=>pathname_globs('**/four.lua'),
|
319
|
+
}),
|
320
|
+
have_attributes(
|
321
|
+
{
|
322
|
+
:name=>'three.lua',
|
323
|
+
:synckey=>'three.lua',
|
324
|
+
:synctype=>TSUD.description,
|
325
|
+
:local_path=>pathname_globs('**/three.lua'),
|
326
|
+
}),
|
225
327
|
],
|
226
328
|
:toadd=>[
|
227
|
-
have_attributes(
|
228
|
-
|
229
|
-
|
230
|
-
|
329
|
+
have_attributes(
|
330
|
+
{
|
331
|
+
:name=>'five.lua',
|
332
|
+
:synckey=>'five.lua',
|
333
|
+
:synctype=>TSUD.description,
|
334
|
+
:local_path=>pathname_globs('**/five.lua'),
|
335
|
+
}),
|
336
|
+
have_attributes(
|
337
|
+
{
|
338
|
+
:name=>'six.lua',
|
339
|
+
:synckey=>'six.lua',
|
340
|
+
:synctype=>TSUD.description,
|
341
|
+
:local_path=>pathname_globs('**/six.lua'),
|
342
|
+
}),
|
231
343
|
],
|
232
344
|
:todel=>[
|
233
|
-
have_attributes(
|
234
|
-
|
345
|
+
have_attributes(
|
346
|
+
{
|
347
|
+
:name=>'eight.lua',
|
348
|
+
:synckey=>'eight.lua',
|
349
|
+
:synctype=>TSUD.description,
|
350
|
+
}),
|
351
|
+
have_attributes(
|
352
|
+
{
|
353
|
+
:name=>'seven.lua',
|
354
|
+
:synckey=>'seven.lua',
|
355
|
+
:synctype=>TSUD.description,
|
356
|
+
}),
|
235
357
|
],
|
236
358
|
:tomod=>[
|
237
|
-
have_attributes(
|
238
|
-
|
239
|
-
|
240
|
-
|
241
|
-
|
359
|
+
have_attributes(
|
360
|
+
{
|
361
|
+
:name=>'one.lua',
|
362
|
+
:synckey=>'one.lua',
|
363
|
+
:synctype=>TSUD.description,
|
364
|
+
:local_path=>pathname_globs('**/one.lua'),
|
365
|
+
}),
|
366
|
+
have_attributes(
|
367
|
+
{
|
368
|
+
:name=>'two.lua',
|
369
|
+
:synckey=>'two.lua',
|
370
|
+
:synctype=>TSUD.description,
|
371
|
+
:local_path=>pathname_globs('**/two.lua'),
|
372
|
+
}),
|
373
|
+
],
|
374
|
+
:skipd=>[],
|
375
|
+
})
|
242
376
|
end
|
243
377
|
|
244
378
|
it "Finds local path globs" do
|
@@ -246,50 +380,104 @@ RSpec.describe MrMurano::SyncUpDown do
|
|
246
380
|
expect(ret).to match({
|
247
381
|
:unchg=>[ ],
|
248
382
|
:toadd=>[
|
249
|
-
have_attributes(
|
250
|
-
|
383
|
+
have_attributes(
|
384
|
+
:name=>'six.lua',
|
385
|
+
:synckey=>'six.lua',
|
386
|
+
:synctype=>TSUD.description,
|
387
|
+
:local_path=>an_instance_of(Pathname)
|
388
|
+
),
|
251
389
|
],
|
252
390
|
:todel=>[ ],
|
253
391
|
:tomod=>[
|
254
|
-
have_attributes(
|
255
|
-
|
256
|
-
|
392
|
+
have_attributes(
|
393
|
+
:name=>'two.lua',
|
394
|
+
:synckey=>'two.lua',
|
395
|
+
:synctype=>TSUD.description,
|
396
|
+
:local_path=>an_instance_of(Pathname)
|
397
|
+
),
|
398
|
+
],
|
399
|
+
:skipd=>[],
|
400
|
+
})
|
257
401
|
end
|
258
402
|
|
259
403
|
it "Finds nothing with specific matcher" do
|
260
404
|
ret = @t.status({}, ['#foo'])
|
261
405
|
expect(ret).to match({
|
262
|
-
:unchg=>[
|
263
|
-
:toadd=>[
|
264
|
-
:todel=>[
|
265
|
-
:tomod=>[
|
406
|
+
:unchg=>[],
|
407
|
+
:toadd=>[],
|
408
|
+
:todel=>[],
|
409
|
+
:tomod=>[],
|
410
|
+
:skipd=>[],
|
411
|
+
})
|
266
412
|
end
|
267
413
|
|
268
414
|
it "gets all the details" do
|
269
415
|
ret = @t.status({:unselected=>true})
|
270
416
|
expect(ret).to match({
|
271
417
|
:unchg=>[
|
272
|
-
have_attributes(
|
273
|
-
|
274
|
-
|
275
|
-
|
418
|
+
have_attributes(
|
419
|
+
:name=>'four.lua',
|
420
|
+
:synckey=>'four.lua',
|
421
|
+
:synctype=>TSUD.description,
|
422
|
+
:selected=>true,
|
423
|
+
:local_path=>pathname_globs('**/four.lua')
|
424
|
+
),
|
425
|
+
have_attributes(
|
426
|
+
:name=>'three.lua',
|
427
|
+
:synckey=>'three.lua',
|
428
|
+
:synctype=>TSUD.description,
|
429
|
+
:selected=>true,
|
430
|
+
:local_path=>pathname_globs('**/three.lua')
|
431
|
+
),
|
276
432
|
],
|
277
433
|
:toadd=>[
|
278
|
-
have_attributes(
|
279
|
-
|
280
|
-
|
281
|
-
|
434
|
+
have_attributes(
|
435
|
+
:name=>'five.lua',
|
436
|
+
:synckey=>'five.lua',
|
437
|
+
:synctype=>TSUD.description,
|
438
|
+
:selected=>true,
|
439
|
+
:local_path=>pathname_globs('**/five.lua')
|
440
|
+
),
|
441
|
+
have_attributes(
|
442
|
+
:name=>'six.lua',
|
443
|
+
:synckey=>'six.lua',
|
444
|
+
:synctype=>TSUD.description,
|
445
|
+
:selected=>true,
|
446
|
+
:local_path=>pathname_globs('**/six.lua')
|
447
|
+
),
|
282
448
|
],
|
283
449
|
:todel=>[
|
284
|
-
have_attributes(
|
285
|
-
|
450
|
+
have_attributes(
|
451
|
+
:name=>'eight.lua',
|
452
|
+
:selected=>true,
|
453
|
+
:synckey=>'eight.lua',
|
454
|
+
:synctype=>TSUD.description,
|
455
|
+
),
|
456
|
+
have_attributes(
|
457
|
+
:name=>'seven.lua',
|
458
|
+
:selected=>true,
|
459
|
+
:synckey=>'seven.lua',
|
460
|
+
:synctype=>TSUD.description,
|
461
|
+
),
|
286
462
|
],
|
287
463
|
:tomod=>[
|
288
|
-
have_attributes(
|
289
|
-
|
290
|
-
|
291
|
-
|
292
|
-
|
464
|
+
have_attributes(
|
465
|
+
:name=>'one.lua',
|
466
|
+
:synckey=>'one.lua',
|
467
|
+
:synctype=>TSUD.description,
|
468
|
+
:selected=>true,
|
469
|
+
:local_path=>pathname_globs('**/one.lua')
|
470
|
+
),
|
471
|
+
have_attributes(
|
472
|
+
:name=>'two.lua',
|
473
|
+
:synckey=>'two.lua',
|
474
|
+
:synctype=>TSUD.description,
|
475
|
+
:selected=>true,
|
476
|
+
:local_path=>pathname_globs('**/two.lua')
|
477
|
+
),
|
478
|
+
],
|
479
|
+
:skipd=>[],
|
480
|
+
})
|
293
481
|
end
|
294
482
|
end
|
295
483
|
end
|
@@ -302,60 +490,86 @@ RSpec.describe MrMurano::SyncUpDown do
|
|
302
490
|
@t = TSUD.new
|
303
491
|
end
|
304
492
|
it "finds local items" do
|
305
|
-
expect(@t).to receive(:
|
306
|
-
{:name=>'one.lua'},
|
493
|
+
expect(@t).to receive(:to_remote_item).and_return(
|
494
|
+
{:name=>'one.lua'},
|
495
|
+
{:name=>'two.lua'},
|
307
496
|
)
|
308
|
-
ret = @t.localitems(Pathname.new(@
|
497
|
+
ret = @t.localitems(Pathname.new(@project_dir + '/tsud').realpath)
|
309
498
|
expect(ret).to match([
|
310
|
-
{
|
311
|
-
|
312
|
-
|
313
|
-
|
499
|
+
{
|
500
|
+
:name=>'one.lua',
|
501
|
+
:local_path=>an_instance_of(Pathname)
|
502
|
+
},
|
503
|
+
{
|
504
|
+
:name=>'two.lua',
|
505
|
+
:local_path=>an_instance_of(Pathname)
|
506
|
+
},
|
314
507
|
])
|
315
508
|
end
|
316
509
|
|
317
|
-
it "takes an array from
|
318
|
-
expect(@t).to receive(:
|
319
|
-
[
|
320
|
-
|
321
|
-
|
322
|
-
|
510
|
+
it "takes an array from to_remote_item" do
|
511
|
+
expect(@t).to receive(:to_remote_item).and_return(
|
512
|
+
[
|
513
|
+
{:name=>'one:1'},
|
514
|
+
{:name=>'one:2'},
|
515
|
+
],
|
516
|
+
[
|
517
|
+
{:name=>'two:1'},
|
518
|
+
{:name=>'two:2'},
|
519
|
+
],
|
520
|
+
)
|
521
|
+
ret = @t.localitems(Pathname.new(@project_dir + '/tsud').realpath)
|
323
522
|
expect(ret).to match([
|
324
|
-
{
|
325
|
-
|
326
|
-
|
327
|
-
|
328
|
-
{
|
329
|
-
|
330
|
-
|
331
|
-
|
523
|
+
{
|
524
|
+
:name=>'one:1',
|
525
|
+
:local_path=>an_instance_of(Pathname),
|
526
|
+
},
|
527
|
+
{
|
528
|
+
:name=>'one:2',
|
529
|
+
:local_path=>an_instance_of(Pathname),
|
530
|
+
},
|
531
|
+
{
|
532
|
+
:name=>'two:1',
|
533
|
+
:local_path=>an_instance_of(Pathname),
|
534
|
+
},
|
535
|
+
{
|
536
|
+
:name=>'two:2',
|
537
|
+
:local_path=>an_instance_of(Pathname),
|
538
|
+
},
|
332
539
|
])
|
333
540
|
end
|
334
541
|
end
|
335
542
|
|
336
543
|
context "download" do
|
337
544
|
it "defaults to :id if @itemkey missing" do
|
338
|
-
FileUtils.mkpath(@
|
339
|
-
FileUtils.touch(@
|
340
|
-
lp = Pathname.new(@
|
545
|
+
FileUtils.mkpath(@project_dir + '/tsud')
|
546
|
+
FileUtils.touch(@project_dir + '/tsud/one.lua')
|
547
|
+
lp = Pathname.new(@project_dir + '/tsud/one.lua').realpath
|
341
548
|
t = TSUD.new
|
342
549
|
expect(t).to receive(:fetch).once.with(1).and_yield("foo")
|
343
|
-
t.download(lp, {:id=>1})
|
550
|
+
t.download(lp, {:id=>1, :updated_at=>ITEM_UPDATED_AT})
|
344
551
|
end
|
345
552
|
end
|
346
553
|
|
347
554
|
context "doing diffs" do
|
348
555
|
before(:example) do
|
349
|
-
FileUtils.mkpath(@
|
556
|
+
FileUtils.mkpath(@project_dir + '/tsud')
|
350
557
|
@t = TSUD.new
|
351
|
-
@scpt = Pathname.new(@
|
558
|
+
@scpt = Pathname.new(@project_dir + '/tsud/one.lua')
|
352
559
|
@scpt.open('w'){|io| io << %{-- fake lua\nreturn 0\n}}
|
353
560
|
@scpt = @scpt.realpath
|
354
561
|
end
|
355
562
|
|
356
563
|
it "nothing when same." do
|
357
564
|
expect(@t).to receive(:fetch).and_yield(%{-- fake lua\nreturn 0\n})
|
358
|
-
ret = @t.dodiff(
|
565
|
+
ret = @t.dodiff(
|
566
|
+
{
|
567
|
+
name: 'one.lua',
|
568
|
+
local_path: @scpt,
|
569
|
+
updated_at: ITEM_UPDATED_AT,
|
570
|
+
},
|
571
|
+
nil
|
572
|
+
)
|
359
573
|
if Gem.win_platform? then
|
360
574
|
expect(ret).to match(/FC: no differences encountered/)
|
361
575
|
else
|
@@ -365,14 +579,29 @@ RSpec.describe MrMurano::SyncUpDown do
|
|
365
579
|
|
366
580
|
it "something when different." do
|
367
581
|
expect(@t).to receive(:fetch).and_yield(%{-- fake lua\nreturn 2\n})
|
368
|
-
ret = @t.dodiff(
|
582
|
+
ret = @t.dodiff(
|
583
|
+
{
|
584
|
+
name: 'one.lua',
|
585
|
+
local_path: @scpt,
|
586
|
+
updated_at: ITEM_UPDATED_AT,
|
587
|
+
},
|
588
|
+
nil
|
589
|
+
)
|
369
590
|
expect(ret).not_to eq('')
|
370
591
|
end
|
371
592
|
|
372
593
|
it "uses script in item" do
|
373
594
|
script = %{-- fake lua\nreturn 2\n}
|
374
595
|
expect(@t).to receive(:fetch).and_yield(script)
|
375
|
-
ret = @t.dodiff(
|
596
|
+
ret = @t.dodiff(
|
597
|
+
{
|
598
|
+
name: 'one.lua',
|
599
|
+
local_path: @scpt,
|
600
|
+
script: script,
|
601
|
+
updated_at: ITEM_UPDATED_AT,
|
602
|
+
},
|
603
|
+
nil
|
604
|
+
)
|
376
605
|
if Gem.win_platform? then
|
377
606
|
expect(ret).to match(/FC: no differences encountered/)
|
378
607
|
else
|
@@ -383,37 +612,42 @@ RSpec.describe MrMurano::SyncUpDown do
|
|
383
612
|
|
384
613
|
context "syncup" do
|
385
614
|
before(:example) do
|
386
|
-
FileUtils.mkpath(@
|
615
|
+
FileUtils.mkpath(@project_dir + '/tsud')
|
387
616
|
@t = TSUD.new
|
388
617
|
end
|
389
618
|
|
390
619
|
it "removes" do
|
391
620
|
expect(@t).to receive(:list).once.and_return([
|
392
|
-
{:name=>1},
|
621
|
+
{:name=>1},
|
622
|
+
{:name=>2},
|
623
|
+
{:name=>3},
|
393
624
|
])
|
394
625
|
expect(@t).to receive(:remove).exactly(3).times
|
395
626
|
@t.syncup({:delete=>true})
|
396
627
|
end
|
397
628
|
|
398
629
|
it "creates" do
|
399
|
-
FileUtils.touch(@
|
400
|
-
FileUtils.touch(@
|
630
|
+
FileUtils.touch(@project_dir + '/tsud/one.lua')
|
631
|
+
FileUtils.touch(@project_dir + '/tsud/two.lua')
|
401
632
|
|
402
633
|
expect(@t).to receive(:upload).twice.with(kind_of(Pathname), kind_of(MrMurano::SyncUpDown::Item), false)
|
403
634
|
@t.syncup({:create=>true})
|
404
635
|
end
|
405
636
|
|
406
637
|
it "updates" do
|
407
|
-
FileUtils.touch(@
|
408
|
-
FileUtils.touch(@
|
638
|
+
FileUtils.touch(@project_dir + '/tsud/one.lua')
|
639
|
+
FileUtils.touch(@project_dir + '/tsud/two.lua')
|
409
640
|
expect(@t).to receive(:list).once.and_return([
|
410
|
-
MrMurano::SyncUpDown::Item.new({:name=>'one.lua'}),
|
411
|
-
MrMurano::SyncUpDown::Item.new({:name=>'two.lua'})
|
641
|
+
MrMurano::SyncUpDown::Item.new({:name=>'one.lua', :updated_at=>ITEM_UPDATED_AT}),
|
642
|
+
MrMurano::SyncUpDown::Item.new({:name=>'two.lua', :updated_at=>ITEM_UPDATED_AT})
|
412
643
|
])
|
413
644
|
|
414
|
-
expect(@t).to receive(:upload).twice.with(
|
415
|
-
|
416
|
-
|
645
|
+
expect(@t).to receive(:upload).twice.with(
|
646
|
+
kind_of(Pathname), kind_of(MrMurano::SyncUpDown::Item), true
|
647
|
+
)
|
648
|
+
expect(@t).to receive(:to_remote_item).and_return(
|
649
|
+
{:name=>'one.lua'},
|
650
|
+
{:name=>'two.lua'},
|
417
651
|
)
|
418
652
|
@t.syncup({:update=>true})
|
419
653
|
end
|
@@ -421,62 +655,62 @@ RSpec.describe MrMurano::SyncUpDown do
|
|
421
655
|
|
422
656
|
context "syncdown" do
|
423
657
|
before(:example) do
|
424
|
-
FileUtils.mkpath(@
|
658
|
+
FileUtils.mkpath(@project_dir + '/tsud')
|
425
659
|
@t = TSUD.new
|
426
660
|
end
|
427
661
|
|
428
662
|
it "removes" do
|
429
|
-
FileUtils.touch(@
|
430
|
-
FileUtils.touch(@
|
663
|
+
FileUtils.touch(@project_dir + '/tsud/one.lua')
|
664
|
+
FileUtils.touch(@project_dir + '/tsud/two.lua')
|
431
665
|
|
432
|
-
@t.syncdown(
|
433
|
-
expect(FileTest.exist?(@
|
434
|
-
expect(FileTest.exist?(@
|
666
|
+
@t.syncdown(delete: true)
|
667
|
+
expect(FileTest.exist?(@project_dir + '/tsud/one.lua')).to be false
|
668
|
+
expect(FileTest.exist?(@project_dir + '/tsud/two.lua')).to be false
|
435
669
|
end
|
436
670
|
|
437
671
|
it "creates" do
|
438
672
|
expect(@t).to receive(:list).once.and_return([
|
439
|
-
MrMurano::SyncUpDown::Item.new({:name=>'one.lua'}),
|
440
|
-
MrMurano::SyncUpDown::Item.new({:name=>'two.lua'})
|
673
|
+
MrMurano::SyncUpDown::Item.new({:name=>'one.lua', :updated_at=>ITEM_UPDATED_AT}),
|
674
|
+
MrMurano::SyncUpDown::Item.new({:name=>'two.lua', :updated_at=>ITEM_UPDATED_AT})
|
441
675
|
])
|
442
676
|
|
443
677
|
expect(@t).to receive(:fetch).twice.and_yield("--foo\n")
|
444
|
-
@t.syncdown(
|
445
|
-
expect(FileTest.exist?(@
|
446
|
-
expect(FileTest.exist?(@
|
678
|
+
@t.syncdown(create: true)
|
679
|
+
expect(FileTest.exist?(@project_dir + '/tsud/one.lua')).to be true
|
680
|
+
expect(FileTest.exist?(@project_dir + '/tsud/two.lua')).to be true
|
447
681
|
end
|
448
682
|
|
449
683
|
it "updates" do
|
450
|
-
FileUtils.touch(@
|
451
|
-
FileUtils.touch(@
|
684
|
+
FileUtils.touch(@project_dir + '/tsud/one.lua')
|
685
|
+
FileUtils.touch(@project_dir + '/tsud/two.lua')
|
452
686
|
expect(@t).to receive(:list).once.and_return([
|
453
|
-
MrMurano::SyncUpDown::Item.new({:name=>'one.lua'}),
|
454
|
-
MrMurano::SyncUpDown::Item.new({:name=>'two.lua'})
|
687
|
+
MrMurano::SyncUpDown::Item.new({:name=>'one.lua', :updated_at=>ITEM_UPDATED_AT}),
|
688
|
+
MrMurano::SyncUpDown::Item.new({:name=>'two.lua', :updated_at=>ITEM_UPDATED_AT})
|
455
689
|
])
|
456
690
|
|
457
691
|
expect(@t).to receive(:fetch).twice.and_yield("--foo\n")
|
458
|
-
expect(@t).to receive(:
|
459
|
-
MrMurano::SyncUpDown::Item.new({:name=>'one.lua'}),
|
460
|
-
MrMurano::SyncUpDown::Item.new({:name=>'two.lua'})
|
692
|
+
expect(@t).to receive(:to_remote_item).and_return(
|
693
|
+
MrMurano::SyncUpDown::Item.new({:name=>'one.lua', :updated_at=>ITEM_UPDATED_AT}),
|
694
|
+
MrMurano::SyncUpDown::Item.new({:name=>'two.lua', :updated_at=>ITEM_UPDATED_AT})
|
461
695
|
)
|
462
|
-
@t.syncdown(
|
463
|
-
expect(FileTest.exist?(@
|
464
|
-
expect(FileTest.exist?(@
|
696
|
+
@t.syncdown(update: true)
|
697
|
+
expect(FileTest.exist?(@project_dir + '/tsud/one.lua')).to be true
|
698
|
+
expect(FileTest.exist?(@project_dir + '/tsud/two.lua')).to be true
|
465
699
|
end
|
466
700
|
end
|
467
701
|
|
468
702
|
# context "bundles" do
|
469
703
|
# before(:example) do
|
470
|
-
# FileUtils.mkpath(@
|
471
|
-
# FileUtils.mkpath(@
|
704
|
+
# FileUtils.mkpath(@project_dir + '/tsud')
|
705
|
+
# FileUtils.mkpath(@project_dir + '/bundles/mybun/tsud')
|
472
706
|
# @t = TSUD.new
|
473
707
|
# end
|
474
708
|
#
|
475
709
|
# it "finds items in bundles." do
|
476
|
-
# FileUtils.touch(@
|
477
|
-
# FileUtils.touch(@
|
710
|
+
# FileUtils.touch(@project_dir + '/tsud/one.lua')
|
711
|
+
# FileUtils.touch(@project_dir + '/bundles/mybun/tsud/two.lua')
|
478
712
|
#
|
479
|
-
# expect(@t).to receive(:
|
713
|
+
# expect(@t).to receive(:to_remote_item).and_return(
|
480
714
|
# {:name=>'two.lua'},{:name=>'one.lua'}
|
481
715
|
# )
|
482
716
|
# ret = @t.locallist
|
@@ -490,8 +724,8 @@ RSpec.describe MrMurano::SyncUpDown do
|
|
490
724
|
# end
|
491
725
|
#
|
492
726
|
# it "Doesn't download a bundled item" do
|
493
|
-
# FileUtils.touch(@
|
494
|
-
# lp = Pathname.new(@
|
727
|
+
# FileUtils.touch(@project_dir + '/tsud/one.lua')
|
728
|
+
# lp = Pathname.new(@project_dir + '/tsud/one.lua').realpath
|
495
729
|
#
|
496
730
|
# expect(@t).to receive(:warning).once.with(/Not downloading into bundled item.*/)
|
497
731
|
#
|
@@ -499,4 +733,6 @@ RSpec.describe MrMurano::SyncUpDown do
|
|
499
733
|
# end
|
500
734
|
# end
|
501
735
|
end
|
736
|
+
|
502
737
|
# vim: set ai et sw=2 ts=2 :
|
738
|
+
|