insup 0.2 → 0.3
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.
- checksums.yaml +4 -4
- data/.gitignore +1 -0
- data/.travis.yml +1 -1
- data/Gemfile.lock +19 -17
- data/README.md +14 -3
- data/bin/insup +11 -1
- data/insup.gemspec +1 -1
- data/insup.template +14 -7
- data/lib/insup.rb +9 -5
- data/lib/insup/console.rb +21 -1
- data/lib/insup/exceptions.rb +2 -0
- data/lib/insup/insales.rb +21 -3
- data/lib/insup/insales/asset.rb +63 -0
- data/lib/insup/listener.rb +27 -24
- data/lib/insup/tracker/git_tracker.rb +1 -2
- data/lib/insup/uploader/insales_uploader.rb +55 -50
- data/lib/insup/version.rb +1 -1
- data/spec/lib/insup/console/upload_observer_spec.rb +5 -3
- data/spec/lib/insup/git_spec.rb +2 -2
- data/spec/lib/insup/settings_spec.rb +2 -2
- data/spec/lib/insup/tracker_spec.rb +2 -2
- data/spec/lib/insup/uploader/insales_uploader_spec.rb +1 -1
- data/spec/lib/insup_spec.rb +1 -1
- metadata +4 -4
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA1:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 50dd77c58e2d1a3ce04bd92d4d7bc9c2d22f4af3
|
|
4
|
+
data.tar.gz: 1dcacbe9f405205fa16c3f8a827b96f934fb96d7
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 4ab17cb95225f9787d1fde6b20b20e5e4edecb93235ba584ed706b99ee15f786362747abb57b88109ca70b36baa320d89b13655828fbea2af85a188f9fbebf69
|
|
7
|
+
data.tar.gz: 95dbbdbd6fe84c8f10ff9799e61610dd5eb9b002266827e1e971d2ebc2178f4668aaeccfa334a907627bd7e3fad11fcf52ed1784a4f1bf0d519ba2e7b98b18f5
|
data/.gitignore
CHANGED
data/.travis.yml
CHANGED
data/Gemfile.lock
CHANGED
|
@@ -1,24 +1,24 @@
|
|
|
1
1
|
PATH
|
|
2
2
|
remote: .
|
|
3
3
|
specs:
|
|
4
|
-
insup (0.
|
|
4
|
+
insup (0.3)
|
|
5
5
|
activeresource (~> 4.0)
|
|
6
6
|
colorize (~> 0.7)
|
|
7
|
-
gli (~> 2.
|
|
7
|
+
gli (~> 2.11)
|
|
8
8
|
listen (~> 2.7)
|
|
9
9
|
match_files (~> 0.2)
|
|
10
10
|
|
|
11
11
|
GEM
|
|
12
12
|
remote: https://rubygems.org/
|
|
13
13
|
specs:
|
|
14
|
-
activemodel (4.1.
|
|
15
|
-
activesupport (= 4.1.
|
|
14
|
+
activemodel (4.1.4)
|
|
15
|
+
activesupport (= 4.1.4)
|
|
16
16
|
builder (~> 3.1)
|
|
17
17
|
activeresource (4.0.0)
|
|
18
18
|
activemodel (~> 4.0)
|
|
19
19
|
activesupport (~> 4.0)
|
|
20
20
|
rails-observers (~> 0.1.1)
|
|
21
|
-
activesupport (4.1.
|
|
21
|
+
activesupport (4.1.4)
|
|
22
22
|
i18n (~> 0.6, >= 0.6.9)
|
|
23
23
|
json (~> 1.7, >= 1.7.7)
|
|
24
24
|
minitest (~> 5.1)
|
|
@@ -35,38 +35,40 @@ GEM
|
|
|
35
35
|
term-ansicolor
|
|
36
36
|
thor
|
|
37
37
|
diff-lcs (1.2.5)
|
|
38
|
-
docile (1.1.
|
|
38
|
+
docile (1.1.5)
|
|
39
39
|
ffi (1.9.3)
|
|
40
|
-
gli (2.
|
|
41
|
-
i18n (0.6.
|
|
40
|
+
gli (2.11.0)
|
|
41
|
+
i18n (0.6.11)
|
|
42
42
|
json (1.8.1)
|
|
43
|
-
listen (2.7.
|
|
43
|
+
listen (2.7.9)
|
|
44
44
|
celluloid (>= 0.15.2)
|
|
45
45
|
rb-fsevent (>= 0.9.3)
|
|
46
46
|
rb-inotify (>= 0.9)
|
|
47
47
|
match_files (0.2)
|
|
48
48
|
mime-types (2.3)
|
|
49
|
-
minitest (5.
|
|
49
|
+
minitest (5.4.0)
|
|
50
50
|
multi_json (1.10.1)
|
|
51
|
+
netrc (0.7.7)
|
|
51
52
|
rails-observers (0.1.2)
|
|
52
53
|
activemodel (~> 4.0)
|
|
53
54
|
rb-fsevent (0.9.4)
|
|
54
|
-
rb-inotify (0.9.
|
|
55
|
+
rb-inotify (0.9.5)
|
|
55
56
|
ffi (>= 0.5.0)
|
|
56
|
-
rest-client (1.
|
|
57
|
-
mime-types (>= 1.16)
|
|
57
|
+
rest-client (1.7.1)
|
|
58
|
+
mime-types (>= 1.16, < 3.0)
|
|
59
|
+
netrc (~> 0.7)
|
|
58
60
|
rspec (3.0.0)
|
|
59
61
|
rspec-core (~> 3.0.0)
|
|
60
62
|
rspec-expectations (~> 3.0.0)
|
|
61
63
|
rspec-mocks (~> 3.0.0)
|
|
62
|
-
rspec-core (3.0.
|
|
64
|
+
rspec-core (3.0.2)
|
|
63
65
|
rspec-support (~> 3.0.0)
|
|
64
|
-
rspec-expectations (3.0.
|
|
66
|
+
rspec-expectations (3.0.2)
|
|
65
67
|
diff-lcs (>= 1.2.0, < 2.0)
|
|
66
68
|
rspec-support (~> 3.0.0)
|
|
67
|
-
rspec-mocks (3.0.
|
|
69
|
+
rspec-mocks (3.0.2)
|
|
68
70
|
rspec-support (~> 3.0.0)
|
|
69
|
-
rspec-support (3.0.
|
|
71
|
+
rspec-support (3.0.2)
|
|
70
72
|
simplecov (0.8.2)
|
|
71
73
|
docile (~> 1.1.0)
|
|
72
74
|
multi_json
|
data/README.md
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
[](http://badge.fury.io/rb/insup)
|
|
5
5
|
[](https://coveralls.io/r/httplab/insup)
|
|
6
6
|
[](https://codeclimate.com/github/httplab/insup)
|
|
7
|
-
[](https://
|
|
7
|
+
[](https://gemnasium.com/httplab/insup)
|
|
8
8
|
|
|
9
9
|
## Description
|
|
10
10
|
|
|
@@ -45,9 +45,9 @@ Currently there are two trackers available:
|
|
|
45
45
|
|
|
46
46
|
Currently there are two uploaders available:
|
|
47
47
|
|
|
48
|
-
* **Insales uploader** will upload files to the specified Insales theme. Specify `Insup::Uploader::
|
|
48
|
+
* **Insales uploader** will upload files to the specified Insales theme. Specify `Insup::Uploader::InsalesUploader` or `insales` in the `class` section of the uploader configuration. Insales uploader also requires `theme_id` to be specified. Working directory should include 3 subfolders *media*, *snippets* and *templates*. The same 3 folders should be specified in the `track` sectio of .insup file.
|
|
49
49
|
|
|
50
|
-
* **Dummy uploader** will only print its operations to the console without actually uploading anything. It can be used for testing the configuration. Use by specifying `dummy` or `Insup::Uploader::
|
|
50
|
+
* **Dummy uploader** will only print its operations to the console without actually uploading anything. It can be used for testing the configuration. Use by specifying `dummy` or `Insup::Uploader::DummyUploader` in the `class` section.
|
|
51
51
|
|
|
52
52
|
### Operation modes
|
|
53
53
|
|
|
@@ -78,6 +78,11 @@ Upload changes
|
|
|
78
78
|
```bash
|
|
79
79
|
insup commit
|
|
80
80
|
```
|
|
81
|
+
You can also specify particlular files with the `commit` command:
|
|
82
|
+
```bash
|
|
83
|
+
insup commit [file1 [file2 [file3 [...]]]]
|
|
84
|
+
```
|
|
85
|
+
In this case **tracking info is ignored** and each file specified is treated as modified or deleted (if it doesn't actually exist).
|
|
81
86
|
|
|
82
87
|
### Other commands
|
|
83
88
|
List all themes in the Insales shop if `insales` section is given in the .insup file:
|
|
@@ -85,6 +90,12 @@ List all themes in the Insales shop if `insales` section is given in the .insup
|
|
|
85
90
|
insup insales list-themes
|
|
86
91
|
```
|
|
87
92
|
|
|
93
|
+
Download all Insales theme files into the working directory:
|
|
94
|
+
```bash
|
|
95
|
+
insup insales download [-f] [-t theme-id]
|
|
96
|
+
```
|
|
97
|
+
Specify `-f` flag to overwrite any existing file. If no theme ID is specified Insup will download theme specified in the .insup file.
|
|
98
|
+
|
|
88
99
|
List files under tracked locations:
|
|
89
100
|
```bash
|
|
90
101
|
insup list-files [--all|--ignored]
|
data/bin/insup
CHANGED
|
@@ -21,6 +21,7 @@ pre do |global_options, command, options, args|
|
|
|
21
21
|
end
|
|
22
22
|
|
|
23
23
|
on_error do |ex|
|
|
24
|
+
puts ex.message
|
|
24
25
|
Insup::Console.process_error(ex)
|
|
25
26
|
false
|
|
26
27
|
end
|
|
@@ -85,7 +86,7 @@ command :listen do |c|
|
|
|
85
86
|
end
|
|
86
87
|
end
|
|
87
88
|
|
|
88
|
-
desc 'Tasks related to
|
|
89
|
+
desc 'Tasks related to Insales'
|
|
89
90
|
command :insales do |c|
|
|
90
91
|
c.default_command 'list-themes'
|
|
91
92
|
c.desc 'List themes in the current Insales shop'
|
|
@@ -94,6 +95,15 @@ command :insales do |c|
|
|
|
94
95
|
Insup::Console.insales_list_themes
|
|
95
96
|
end
|
|
96
97
|
end
|
|
98
|
+
|
|
99
|
+
c.desc 'Download theme files to current directory'
|
|
100
|
+
c.command 'download' do |sc|
|
|
101
|
+
sc.switch [:f, :force], desc: 'Overwrite existing files without prompt'
|
|
102
|
+
sc.flag [:t, :theme], desc: 'Insales theme id', default_value: nil
|
|
103
|
+
sc.action do |global_options, options, args|
|
|
104
|
+
Insup::Console.insales_download_theme(options[:force], options[:theme])
|
|
105
|
+
end
|
|
106
|
+
end
|
|
97
107
|
end
|
|
98
108
|
|
|
99
109
|
default_command :listen
|
data/insup.gemspec
CHANGED
|
@@ -14,7 +14,7 @@ Gem::Specification.new do |s|
|
|
|
14
14
|
s.license = 'MIT'
|
|
15
15
|
|
|
16
16
|
s.add_dependency 'colorize', '~> 0.7'
|
|
17
|
-
s.add_dependency 'gli', '~> 2.
|
|
17
|
+
s.add_dependency 'gli', '~> 2.11'
|
|
18
18
|
s.add_dependency 'listen', '~> 2.7'
|
|
19
19
|
s.add_dependency 'match_files', '~> 0.2'
|
|
20
20
|
s.add_dependency 'activeresource', '~> 4.0'
|
data/insup.template
CHANGED
|
@@ -4,9 +4,15 @@ track:
|
|
|
4
4
|
- snippets
|
|
5
5
|
- templates
|
|
6
6
|
|
|
7
|
+
# Tracker settings
|
|
8
|
+
# class: tracker class. Use 'git' or 'simple'
|
|
7
9
|
tracker:
|
|
8
10
|
class: git
|
|
9
11
|
|
|
12
|
+
# Insales settings
|
|
13
|
+
# subdomain: your Insales subdomain, e.g. my-shop.myinsales.ru
|
|
14
|
+
# api_key: Insales API key for insup application
|
|
15
|
+
# password: Insales API passeword for insup application
|
|
10
16
|
insales:
|
|
11
17
|
subdomain:
|
|
12
18
|
api_key:
|
|
@@ -14,6 +20,7 @@ insales:
|
|
|
14
20
|
|
|
15
21
|
# Uploader settings
|
|
16
22
|
# class: uploader class. Use 'insales' or 'dummy'
|
|
23
|
+
# theme_id: Insales theme ID
|
|
17
24
|
uploader:
|
|
18
25
|
class: insales
|
|
19
26
|
theme_id:
|
|
@@ -30,14 +37,14 @@ ignore:
|
|
|
30
37
|
- '*.log'
|
|
31
38
|
|
|
32
39
|
# Logging settings
|
|
33
|
-
# file:
|
|
34
|
-
#
|
|
35
|
-
#
|
|
36
|
-
#
|
|
37
|
-
#
|
|
40
|
+
# file: path to the log file relative to the working directory. Omit this key to use STDERR instead
|
|
41
|
+
# of file.
|
|
42
|
+
# level: log error level. Available options are 'unknown', 'debug', 'error', 'fatal', 'info',
|
|
43
|
+
# and 'warn'.
|
|
44
|
+
# pattern: a pattern to for logger to use when writing messages. Available substitutions are:
|
|
45
|
+
# %{timestamp}, %{level}, %{message} and %{backtrace}.
|
|
38
46
|
#
|
|
39
|
-
|
|
40
47
|
log:
|
|
41
48
|
file: 'log/insup.log'
|
|
42
49
|
level: 'info'
|
|
43
|
-
pattern: "%{timestamp} - %{level}\t: %{message}\n"
|
|
50
|
+
pattern: "%{timestamp} - %{level}\t: %{message} %{backtrace}\n"
|
data/lib/insup.rb
CHANGED
|
@@ -20,7 +20,8 @@ class Insup
|
|
|
20
20
|
def self.create_insup_file(dir = nil)
|
|
21
21
|
dir ||= Dir.getwd
|
|
22
22
|
template_file = File.join(File.dirname(File.expand_path(__FILE__)), '../insup.template')
|
|
23
|
-
|
|
23
|
+
path = File.join(dir, '.insup')
|
|
24
|
+
FileUtils.cp(template_file, path) if !File.exist?(path)
|
|
24
25
|
end
|
|
25
26
|
|
|
26
27
|
def tracked_locations
|
|
@@ -58,7 +59,7 @@ class Insup
|
|
|
58
59
|
klass = Insup::Uploader.find_uploader(uploader_conf['class']) || Object::const_get(uploader_conf['class'])
|
|
59
60
|
klass.new(@settings)
|
|
60
61
|
else
|
|
61
|
-
Uploader::
|
|
62
|
+
Uploader::DummyUploader.new(@settings)
|
|
62
63
|
end
|
|
63
64
|
end
|
|
64
65
|
|
|
@@ -81,10 +82,13 @@ class Insup
|
|
|
81
82
|
|
|
82
83
|
def listen
|
|
83
84
|
@listener = Listener.new(@base, @settings)
|
|
84
|
-
|
|
85
85
|
@listener.listen do |changes|
|
|
86
|
-
|
|
87
|
-
|
|
86
|
+
begin
|
|
87
|
+
changes.each do |change|
|
|
88
|
+
uploader.process_file(change)
|
|
89
|
+
end
|
|
90
|
+
rescue Exceptions::RecoverableUploaderError => ex
|
|
91
|
+
logger.error(ex)
|
|
88
92
|
end
|
|
89
93
|
end
|
|
90
94
|
end
|
data/lib/insup/console.rb
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
require 'colorize'
|
|
2
2
|
require 'fileutils'
|
|
3
|
+
require 'io/console'
|
|
3
4
|
require_relative '../insup'
|
|
4
5
|
|
|
5
6
|
module Insup::Console
|
|
@@ -71,6 +72,25 @@ module Insup::Console
|
|
|
71
72
|
end
|
|
72
73
|
end
|
|
73
74
|
|
|
75
|
+
def self.insales_download_theme(force = false, theme_id = nil)
|
|
76
|
+
theme_id ||= @settings.uploader['theme_id']
|
|
77
|
+
puts "Downloading theme #{theme_id}"
|
|
78
|
+
|
|
79
|
+
@insup.insales.download_theme(theme_id, Dir.getwd) do |asset, exists|
|
|
80
|
+
if exists && !force
|
|
81
|
+
puts "#{asset.path} already exists"
|
|
82
|
+
false
|
|
83
|
+
else
|
|
84
|
+
if exists
|
|
85
|
+
puts "Overwriting #{asset.path}"
|
|
86
|
+
else
|
|
87
|
+
puts "Downloading #{asset.path}"
|
|
88
|
+
end
|
|
89
|
+
true
|
|
90
|
+
end
|
|
91
|
+
end
|
|
92
|
+
end
|
|
93
|
+
|
|
74
94
|
def self.status
|
|
75
95
|
@insup.changes.each do |x|
|
|
76
96
|
case x.state
|
|
@@ -101,7 +121,7 @@ module Insup::Console
|
|
|
101
121
|
Kernel.trap( "INT" ) { exit_requested = true }
|
|
102
122
|
|
|
103
123
|
while !exit_requested do
|
|
104
|
-
sleep
|
|
124
|
+
sleep(0.1)
|
|
105
125
|
end
|
|
106
126
|
|
|
107
127
|
puts 'Stopping listener...'
|
data/lib/insup/exceptions.rb
CHANGED
data/lib/insup/insales.rb
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
|
-
|
|
1
|
+
require 'net/http'
|
|
2
|
+
require 'json'
|
|
2
3
|
|
|
4
|
+
class Insup::Insales
|
|
3
5
|
def initialize(settings)
|
|
4
6
|
@settings = settings
|
|
5
7
|
end
|
|
@@ -27,9 +29,25 @@ class Insup::Insales
|
|
|
27
29
|
@settings.insales
|
|
28
30
|
end
|
|
29
31
|
|
|
30
|
-
def
|
|
31
|
-
|
|
32
|
+
def download_theme(theme_id, dir)
|
|
33
|
+
configure_api
|
|
34
|
+
theme = Theme.find(theme_id)
|
|
35
|
+
|
|
36
|
+
theme.assets.each do |asset|
|
|
37
|
+
next if !asset.dirname
|
|
38
|
+
path = File.join(dir, asset.path)
|
|
39
|
+
exists = File.exist?(path)
|
|
40
|
+
write = !exists
|
|
41
|
+
write = yield(asset, exists) if block_given?
|
|
42
|
+
|
|
43
|
+
if write
|
|
44
|
+
File.delete(path) if exists
|
|
45
|
+
Dir.mkdir(File.dirname(path)) if !Dir.exist?(File.dirname(path))
|
|
46
|
+
File.open(path, 'wb'){|f| f.write(asset.data)}
|
|
47
|
+
end
|
|
48
|
+
end
|
|
32
49
|
end
|
|
50
|
+
|
|
33
51
|
end
|
|
34
52
|
|
|
35
53
|
require 'active_resource'
|
data/lib/insup/insales/asset.rb
CHANGED
|
@@ -1,5 +1,68 @@
|
|
|
1
|
+
require 'base64'
|
|
2
|
+
require 'net/http'
|
|
1
3
|
class Insup::Insales::Asset < Insup::Insales::Base
|
|
2
4
|
belongs_to :theme, class_name: 'Insup::Insales::Theme'
|
|
3
5
|
|
|
4
6
|
self.prefix = '/admin/themes/:theme_id/'
|
|
7
|
+
|
|
8
|
+
TYPE_MAP = {
|
|
9
|
+
'media' => 'Asset::Media',
|
|
10
|
+
'snippets' => 'Asset::Snippet',
|
|
11
|
+
'templates' => 'Asset::Template',
|
|
12
|
+
'config' => 'Asset::Configuration'
|
|
13
|
+
}.freeze
|
|
14
|
+
|
|
15
|
+
def filename
|
|
16
|
+
fname_rex = /\..*+$/
|
|
17
|
+
if name.match(fname_rex)
|
|
18
|
+
name
|
|
19
|
+
elsif human_readable_name.match(fname_rex)
|
|
20
|
+
human_readable_name
|
|
21
|
+
else
|
|
22
|
+
nil
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def is_image?
|
|
27
|
+
content_type =~ /image/ || content_type =~ /octet-stream/ || content_type =~ /flash/
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def self.get_type(path)
|
|
31
|
+
TYPE_MAP.each do |k,v|
|
|
32
|
+
return v if path.start_with?("#{k}/")
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
def dirname
|
|
37
|
+
TYPE_MAP.invert[type]
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
def path
|
|
41
|
+
"#{dirname}/#{filename}"
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
def data
|
|
45
|
+
if respond_to? (:asset_url)
|
|
46
|
+
download_data_from_url
|
|
47
|
+
elsif ['Asset::Snippet', 'Asset::Template'].include?(type)
|
|
48
|
+
w = get_full
|
|
49
|
+
w.content if w.respond_to?(:content)
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
def theme_id
|
|
54
|
+
prefix_options[:theme_id]
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
def get_full
|
|
58
|
+
self.class.find(id, params: {theme_id: theme_id})
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
def url
|
|
62
|
+
"#{self.class.site}#{self.asset_url}"
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
def download_data_from_url
|
|
66
|
+
Net::HTTP.get(URI(self.url))
|
|
67
|
+
end
|
|
5
68
|
end
|
data/lib/insup/listener.rb
CHANGED
|
@@ -27,35 +27,14 @@ class Listener
|
|
|
27
27
|
|
|
28
28
|
res = []
|
|
29
29
|
|
|
30
|
-
flags.each do |f,
|
|
30
|
+
flags.each do |f, flag|
|
|
31
31
|
pn = Pathname.new(f)
|
|
32
32
|
basepn = Pathname.new(@base)
|
|
33
33
|
file = pn.relative_path_from(basepn).to_s
|
|
34
|
-
|
|
35
34
|
next if ignore_matcher.matched?(file)
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
when 1
|
|
39
|
-
res << Insup::TrackedFile.new(file, Insup::TrackedFile::DELETED)
|
|
40
|
-
when 2
|
|
41
|
-
res << Insup::TrackedFile.new(file, Insup::TrackedFile::MODIFIED)
|
|
42
|
-
when 3
|
|
43
|
-
res << Insup::TrackedFile.new(file, Insup::TrackedFile::DELETED)
|
|
44
|
-
when 4
|
|
45
|
-
res << Insup::TrackedFile.new(file, Insup::TrackedFile::NEW)
|
|
46
|
-
when 5
|
|
47
|
-
if File.exist?(file)
|
|
48
|
-
res << Insup::TrackedFile.new(file, Insup::TrackedFile::UNSURE)
|
|
49
|
-
end
|
|
50
|
-
when 6
|
|
51
|
-
res << Insup::TrackedFile.new(file, Insup::TrackedFile::NEW)
|
|
52
|
-
when 7
|
|
53
|
-
if File.exist?(file)
|
|
54
|
-
res << Insup::TrackedFile.new(file, Insup::TrackedFile::UNSURE)
|
|
55
|
-
end
|
|
56
|
-
end
|
|
35
|
+
tracked_file = create_tracked_file(flag, file)
|
|
36
|
+
res << tracked_file if !tracked_file.nil?
|
|
57
37
|
end
|
|
58
|
-
|
|
59
38
|
yield res
|
|
60
39
|
end
|
|
61
40
|
|
|
@@ -70,6 +49,30 @@ class Listener
|
|
|
70
49
|
|
|
71
50
|
protected
|
|
72
51
|
|
|
52
|
+
def create_tracked_file(flags, file)
|
|
53
|
+
case flags
|
|
54
|
+
when 1
|
|
55
|
+
Insup::TrackedFile.new(file, Insup::TrackedFile::DELETED)
|
|
56
|
+
when 2
|
|
57
|
+
Insup::TrackedFile.new(file, Insup::TrackedFile::MODIFIED)
|
|
58
|
+
when 3
|
|
59
|
+
Insup::TrackedFile.new(file, Insup::TrackedFile::DELETED)
|
|
60
|
+
when 4
|
|
61
|
+
Insup::TrackedFile.new(file, Insup::TrackedFile::NEW)
|
|
62
|
+
when 5
|
|
63
|
+
if File.exist?(file)
|
|
64
|
+
Insup::TrackedFile.new(file, Insup::TrackedFile::UNSURE)
|
|
65
|
+
end
|
|
66
|
+
when 6
|
|
67
|
+
Insup::TrackedFile.new(file, Insup::TrackedFile::NEW)
|
|
68
|
+
when 7
|
|
69
|
+
if File.exist?(file)
|
|
70
|
+
Insup::TrackedFile.new(file, Insup::TrackedFile::UNSURE)
|
|
71
|
+
end
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
end
|
|
75
|
+
|
|
73
76
|
def ignore_matcher
|
|
74
77
|
@ignore_matcher ||= ::MatchFiles.git(@base, ignore_patterns)
|
|
75
78
|
end
|
|
@@ -2,10 +2,9 @@ require_relative('../git')
|
|
|
2
2
|
|
|
3
3
|
# Git tracker: tracks files by evaluating changes in Git repo
|
|
4
4
|
class Insup::Tracker::GitTracker < Insup::Tracker
|
|
5
|
-
|
|
6
5
|
tracker :git
|
|
7
6
|
|
|
8
|
-
def initialize config
|
|
7
|
+
def initialize(base, config)
|
|
9
8
|
super
|
|
10
9
|
@git = ::Insup::Git.new(@path)
|
|
11
10
|
end
|
|
@@ -2,18 +2,15 @@ require 'base64'
|
|
|
2
2
|
require_relative '../insales'
|
|
3
3
|
|
|
4
4
|
class Insup::Uploader::InsalesUploader < Insup::Uploader
|
|
5
|
-
|
|
6
5
|
uploader :insales
|
|
7
6
|
|
|
8
|
-
InsalesUploaderError = Class.new(Insup::Exceptions::UploaderError)
|
|
9
|
-
|
|
10
7
|
def initialize(settings)
|
|
11
8
|
super
|
|
12
9
|
@insales = Insup::Insales.new(settings)
|
|
13
10
|
@insales.configure_api
|
|
14
11
|
|
|
15
12
|
if !theme
|
|
16
|
-
|
|
13
|
+
fail Insup::Exceptions::FatalUploaderError, "Theme #{theme_id} is not found in the Insales shop"
|
|
17
14
|
end
|
|
18
15
|
|
|
19
16
|
assets_list(true)
|
|
@@ -40,10 +37,13 @@ class Insup::Uploader::InsalesUploader < Insup::Uploader
|
|
|
40
37
|
|
|
41
38
|
changed
|
|
42
39
|
notify_observers(CREATING_FILE, file)
|
|
43
|
-
asset_type =
|
|
40
|
+
asset_type = ::Insup::Insales::Asset.get_type(file.path)
|
|
44
41
|
|
|
45
42
|
if !asset_type
|
|
46
|
-
|
|
43
|
+
msg = "Cannot determine asset type for file #{file.path}"
|
|
44
|
+
changed
|
|
45
|
+
notify_observers(ERROR, file, msg)
|
|
46
|
+
raise Insup::Exceptions::RecoverableUploaderError, msg
|
|
47
47
|
end
|
|
48
48
|
|
|
49
49
|
file_contents = File.read(file.path)
|
|
@@ -60,10 +60,16 @@ class Insup::Uploader::InsalesUploader < Insup::Uploader
|
|
|
60
60
|
hash[:attachment] = Base64.encode64(file_contents)
|
|
61
61
|
end
|
|
62
62
|
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
63
|
+
begin
|
|
64
|
+
asset = ::Insup::Insales::Asset.create(hash)
|
|
65
|
+
assets_list << asset
|
|
66
|
+
changed
|
|
67
|
+
notify_observers(CREATED_FILE, file)
|
|
68
|
+
rescue ActiveResource::ServerError => ex
|
|
69
|
+
changed
|
|
70
|
+
notify_observers(ERROR, file, ex.message)
|
|
71
|
+
raise Insup::Exceptions::RecoverableUploaderError, "Server error occured when creating file #{file.path}"
|
|
72
|
+
end
|
|
67
73
|
end
|
|
68
74
|
|
|
69
75
|
def upload_modified_file(file)
|
|
@@ -76,48 +82,57 @@ class Insup::Uploader::InsalesUploader < Insup::Uploader
|
|
|
76
82
|
|
|
77
83
|
changed
|
|
78
84
|
notify_observers(MODIFYING_FILE, file)
|
|
79
|
-
|
|
80
85
|
file_contents = File.read(file.path)
|
|
81
86
|
|
|
82
87
|
if asset.content_type.start_with? 'text/'
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
88
|
+
begin
|
|
89
|
+
res = asset.update_attribute(:content, file_contents)
|
|
90
|
+
|
|
91
|
+
if !res
|
|
92
|
+
process_error(asset, file)
|
|
93
|
+
return
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
changed
|
|
97
|
+
notify_observers(MODIFIED_FILE, file)
|
|
98
|
+
rescue ActiveResource::ServerError => ex
|
|
99
|
+
changed
|
|
100
|
+
notify_observers(ERROR, file, ex.message)
|
|
101
|
+
raise Insup::Exceptions::RecoverableUploaderError, "Server error occured when updating file #{file.path}"
|
|
86
102
|
end
|
|
87
103
|
else
|
|
88
104
|
remove_file(file)
|
|
89
105
|
upload_new_file(file)
|
|
90
106
|
end
|
|
91
|
-
|
|
92
|
-
changed
|
|
93
|
-
notify_observers(MODIFIED_FILE, file)
|
|
94
107
|
end
|
|
95
108
|
|
|
96
109
|
def remove_file(file)
|
|
97
110
|
asset = find_asset(file)
|
|
98
|
-
|
|
111
|
+
|
|
99
112
|
if !asset
|
|
100
|
-
|
|
113
|
+
msg = "Cannot find remote counterpart for file #{file.path}"
|
|
114
|
+
changed
|
|
115
|
+
notify_observers(ERROR, file, msg)
|
|
116
|
+
raise Insup::Exceptions::RecoverableUploaderError, "Cannot find remote counterpart for file #{file.path}"
|
|
101
117
|
end
|
|
102
118
|
|
|
103
119
|
changed
|
|
104
120
|
notify_observers(DELETING_FILE, file)
|
|
105
121
|
|
|
106
|
-
|
|
107
|
-
|
|
122
|
+
begin
|
|
123
|
+
if asset.destroy
|
|
124
|
+
assets_list.delete(asset)
|
|
125
|
+
changed
|
|
126
|
+
notify_observers(DELETED_FILE, file)
|
|
127
|
+
end
|
|
128
|
+
rescue ActiveResource::ServerError => ex
|
|
129
|
+
changed
|
|
130
|
+
notify_observers(ERROR, file, ex.message)
|
|
131
|
+
raise Insup::Exceptions::RecoverableUploaderError, "Server error occured when deleting file #{file.path}"
|
|
108
132
|
end
|
|
109
|
-
|
|
110
|
-
changed
|
|
111
|
-
notify_observers(DELETED_FILE, file)
|
|
112
133
|
end
|
|
113
134
|
|
|
114
135
|
private
|
|
115
|
-
ASSET_TYPE_MAP = {
|
|
116
|
-
'media/' => 'Asset::Media',
|
|
117
|
-
'snippets/' => 'Asset::Snippet',
|
|
118
|
-
'templates/' => 'Asset::Template'
|
|
119
|
-
}.freeze
|
|
120
|
-
|
|
121
136
|
def process_error(entity, file)
|
|
122
137
|
changed
|
|
123
138
|
entity.errors.full_messages.each do |err|
|
|
@@ -126,19 +141,6 @@ private
|
|
|
126
141
|
end
|
|
127
142
|
end
|
|
128
143
|
|
|
129
|
-
def get_asset_type path
|
|
130
|
-
res = nil
|
|
131
|
-
|
|
132
|
-
ASSET_TYPE_MAP.each do |k,v|
|
|
133
|
-
if path.start_with? k
|
|
134
|
-
res = v
|
|
135
|
-
break
|
|
136
|
-
end
|
|
137
|
-
end
|
|
138
|
-
|
|
139
|
-
res
|
|
140
|
-
end
|
|
141
|
-
|
|
142
144
|
def theme
|
|
143
145
|
@theme ||= themes[theme_id]
|
|
144
146
|
end
|
|
@@ -151,15 +153,18 @@ private
|
|
|
151
153
|
@themes ||= Hash[@insales.themes.map{|t| [t.id, t]}]
|
|
152
154
|
end
|
|
153
155
|
|
|
154
|
-
def find_asset
|
|
155
|
-
asset_type =
|
|
156
|
-
|
|
157
|
-
if
|
|
158
|
-
|
|
156
|
+
def find_asset(file)
|
|
157
|
+
asset_type = ::Insup::Insales::Asset.get_type(file.path)
|
|
158
|
+
|
|
159
|
+
if !asset_type
|
|
160
|
+
msg = "Cannot determine asset type for file #{file.path}"
|
|
161
|
+
changed
|
|
162
|
+
notify_observers(ERROR, file, msg)
|
|
163
|
+
raise Insup::Exceptions::RecoverableUploaderError, "Cannot determine asset type for file #{file.path}"
|
|
159
164
|
end
|
|
160
165
|
|
|
161
|
-
files = assets_list.select
|
|
162
|
-
el.type == asset_type &&
|
|
166
|
+
files = assets_list.select do |el|
|
|
167
|
+
el.type == asset_type && el.filename == file.file_name
|
|
163
168
|
end
|
|
164
169
|
|
|
165
170
|
if files && !files.empty?
|
data/lib/insup/version.rb
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
require_relative '../../../spec_helper'
|
|
2
2
|
|
|
3
|
-
describe
|
|
3
|
+
describe Insup::Console::UploadObserver do
|
|
4
4
|
|
|
5
5
|
it 'should handle all types of events' do
|
|
6
|
-
@observer =
|
|
6
|
+
@observer = described_class.new
|
|
7
7
|
|
|
8
8
|
[Insup::Uploader::CREATING_FILE,
|
|
9
9
|
Insup::Uploader::CREATED_FILE,
|
|
@@ -12,7 +12,9 @@ describe 'Insup::Console::UploadObserver' do
|
|
|
12
12
|
Insup::Uploader::DELETING_FILE,
|
|
13
13
|
Insup::Uploader::DELETED_FILE,
|
|
14
14
|
Insup::Uploader::BATCH_UPLOADING_FILES,
|
|
15
|
-
Insup::Uploader::BATCH_UPLOADED_FILES
|
|
15
|
+
Insup::Uploader::BATCH_UPLOADED_FILES,
|
|
16
|
+
Insup::Uploader::ERROR
|
|
17
|
+
].each do |event|
|
|
16
18
|
expect {@observer.update(event, Insup::TrackedFile.new('path/to.file'))}.not_to raise_error
|
|
17
19
|
end
|
|
18
20
|
end
|
data/spec/lib/insup/git_spec.rb
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
require_relative '../../spec_helper'
|
|
2
2
|
|
|
3
|
-
describe
|
|
3
|
+
describe Insup::Settings do
|
|
4
4
|
before(:each) do
|
|
5
|
-
@settings =
|
|
5
|
+
@settings = described_class.new('spec/support/.insup')
|
|
6
6
|
end
|
|
7
7
|
|
|
8
8
|
it 'should have correct tracked locations' do
|
data/spec/lib/insup_spec.rb
CHANGED
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: insup
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: '0.
|
|
4
|
+
version: '0.3'
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- HttpLab
|
|
@@ -9,7 +9,7 @@ authors:
|
|
|
9
9
|
autorequire:
|
|
10
10
|
bindir: bin
|
|
11
11
|
cert_chain: []
|
|
12
|
-
date: 2014-
|
|
12
|
+
date: 2014-07-14 00:00:00.000000000 Z
|
|
13
13
|
dependencies:
|
|
14
14
|
- !ruby/object:Gem::Dependency
|
|
15
15
|
name: colorize
|
|
@@ -31,14 +31,14 @@ dependencies:
|
|
|
31
31
|
requirements:
|
|
32
32
|
- - "~>"
|
|
33
33
|
- !ruby/object:Gem::Version
|
|
34
|
-
version: '2.
|
|
34
|
+
version: '2.11'
|
|
35
35
|
type: :runtime
|
|
36
36
|
prerelease: false
|
|
37
37
|
version_requirements: !ruby/object:Gem::Requirement
|
|
38
38
|
requirements:
|
|
39
39
|
- - "~>"
|
|
40
40
|
- !ruby/object:Gem::Version
|
|
41
|
-
version: '2.
|
|
41
|
+
version: '2.11'
|
|
42
42
|
- !ruby/object:Gem::Dependency
|
|
43
43
|
name: listen
|
|
44
44
|
requirement: !ruby/object:Gem::Requirement
|