discourse_theme 0.1.0 → 0.1.1
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/.rubocop.yml +110 -0
- data/Guardfile +9 -0
- data/discourse_theme.gemspec +3 -1
- data/lib/discourse_theme.rb +2 -0
- data/lib/discourse_theme/cli.rb +33 -39
- data/lib/discourse_theme/config.rb +76 -0
- data/lib/discourse_theme/uploader.rb +5 -3
- data/lib/discourse_theme/version.rb +1 -1
- metadata +35 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e2c86731ccd3d670e5e80b81bd8667692d6b08e6
|
4
|
+
data.tar.gz: 03f1878d96b8bfffc682193346101393e70e5b3f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f52f41636624d5cce942f16d94a5b2b45d40d4f9aaa1d52a81dc3b0d662ddb24c7bf087125def21e32d20ea31484e57b8ec9a3348c8ba1aad6492371feb6e34e
|
7
|
+
data.tar.gz: 8e193ff8da06e4f9ca6d05ae3de3f1d746c2a7d3286c41e0f7028c4c90f56de1948802167da62a10f800df47c9dedfc776900de7b39ac1bf68750714ede6f9f7
|
data/.rubocop.yml
ADDED
@@ -0,0 +1,110 @@
|
|
1
|
+
AllCops:
|
2
|
+
TargetRubyVersion: 2.2
|
3
|
+
DisabledByDefault: true
|
4
|
+
Exclude:
|
5
|
+
- 'bundle/**/*'
|
6
|
+
- 'pkg/**/*'
|
7
|
+
|
8
|
+
# Prefer &&/|| over and/or.
|
9
|
+
Style/AndOr:
|
10
|
+
Enabled: true
|
11
|
+
|
12
|
+
# Do not use braces for hash literals when they are the last argument of a
|
13
|
+
# method call.
|
14
|
+
Style/BracesAroundHashParameters:
|
15
|
+
Enabled: true
|
16
|
+
|
17
|
+
# Align `when` with `case`.
|
18
|
+
Layout/CaseIndentation:
|
19
|
+
Enabled: true
|
20
|
+
|
21
|
+
# Align comments with method definitions.
|
22
|
+
Layout/CommentIndentation:
|
23
|
+
Enabled: true
|
24
|
+
|
25
|
+
# No extra empty lines.
|
26
|
+
Layout/EmptyLines:
|
27
|
+
Enabled: true
|
28
|
+
|
29
|
+
# Use Ruby >= 1.9 syntax for hashes. Prefer { a: :b } over { :a => :b }.
|
30
|
+
Style/HashSyntax:
|
31
|
+
Enabled: true
|
32
|
+
|
33
|
+
# Two spaces, no tabs (for indentation).
|
34
|
+
Layout/IndentationWidth:
|
35
|
+
Enabled: true
|
36
|
+
|
37
|
+
Layout/SpaceAfterColon:
|
38
|
+
Enabled: true
|
39
|
+
|
40
|
+
Layout/SpaceAfterComma:
|
41
|
+
Enabled: true
|
42
|
+
|
43
|
+
Layout/SpaceAroundEqualsInParameterDefault:
|
44
|
+
Enabled: true
|
45
|
+
|
46
|
+
Layout/SpaceAroundKeyword:
|
47
|
+
Enabled: true
|
48
|
+
|
49
|
+
Layout/SpaceAroundOperators:
|
50
|
+
Enabled: true
|
51
|
+
|
52
|
+
Layout/SpaceBeforeFirstArg:
|
53
|
+
Enabled: true
|
54
|
+
|
55
|
+
# Defining a method with parameters needs parentheses.
|
56
|
+
Style/MethodDefParentheses:
|
57
|
+
Enabled: true
|
58
|
+
|
59
|
+
# Use `foo {}` not `foo{}`.
|
60
|
+
Layout/SpaceBeforeBlockBraces:
|
61
|
+
Enabled: true
|
62
|
+
|
63
|
+
# Use `foo { bar }` not `foo {bar}`.
|
64
|
+
Layout/SpaceInsideBlockBraces:
|
65
|
+
Enabled: true
|
66
|
+
|
67
|
+
# Use `{ a: 1 }` not `{a:1}`.
|
68
|
+
Layout/SpaceInsideHashLiteralBraces:
|
69
|
+
Enabled: true
|
70
|
+
|
71
|
+
Layout/SpaceInsideParens:
|
72
|
+
Enabled: true
|
73
|
+
|
74
|
+
# Detect hard tabs, no hard tabs.
|
75
|
+
Layout/Tab:
|
76
|
+
Enabled: true
|
77
|
+
|
78
|
+
# Blank lines should not have any spaces.
|
79
|
+
Layout/TrailingBlankLines:
|
80
|
+
Enabled: true
|
81
|
+
|
82
|
+
# No trailing whitespace.
|
83
|
+
Layout/TrailingWhitespace:
|
84
|
+
Enabled: true
|
85
|
+
|
86
|
+
Lint/Debugger:
|
87
|
+
Enabled: true
|
88
|
+
|
89
|
+
Layout/BlockAlignment:
|
90
|
+
Enabled: true
|
91
|
+
|
92
|
+
# Align `end` with the matching keyword or starting expression except for
|
93
|
+
# assignments, where it should be aligned with the LHS.
|
94
|
+
Layout/EndAlignment:
|
95
|
+
Enabled: true
|
96
|
+
EnforcedStyleAlignWith: variable
|
97
|
+
|
98
|
+
# Use my_method(my_arg) not my_method( my_arg ) or my_method my_arg.
|
99
|
+
Lint/RequireParentheses:
|
100
|
+
Enabled: true
|
101
|
+
|
102
|
+
Layout/MultilineMethodCallIndentation:
|
103
|
+
Enabled: true
|
104
|
+
EnforcedStyle: indented
|
105
|
+
|
106
|
+
Layout/AlignHash:
|
107
|
+
Enabled: true
|
108
|
+
|
109
|
+
Bundler/OrderedGems:
|
110
|
+
Enabled: false
|
data/Guardfile
ADDED
@@ -0,0 +1,9 @@
|
|
1
|
+
directories %w(app lib test) \
|
2
|
+
.select { |d| Dir.exists?(d) ? d : UI.warning("Directory #{d} does not exist") }
|
3
|
+
|
4
|
+
guard :minitest do
|
5
|
+
# with Minitest::Unit
|
6
|
+
watch(%r{^test/(.*)\/?test_(.*)\.rb$})
|
7
|
+
watch(%r{^lib/(.*/)?([^/]+)\.rb$}) { |m| "test/test_#{m[2]}.rb" }
|
8
|
+
watch(%r{^test/test_helper\.rb$}) { 'test' }
|
9
|
+
end
|
data/discourse_theme.gemspec
CHANGED
@@ -26,8 +26,10 @@ Gem::Specification.new do |spec|
|
|
26
26
|
spec.add_development_dependency "bundler", "~> 1.16"
|
27
27
|
spec.add_development_dependency "rake", "~> 10.0"
|
28
28
|
spec.add_development_dependency "minitest", "~> 5.0"
|
29
|
+
spec.add_development_dependency "guard", "~> 2.14"
|
30
|
+
spec.add_development_dependency "guard-minitest", "~> 2.4"
|
29
31
|
|
30
|
-
spec.add_dependency "minitar", "~> 0.
|
32
|
+
spec.add_dependency "minitar", "~> 0.6"
|
31
33
|
spec.add_dependency "listen", "~> 3.1"
|
32
34
|
spec.add_dependency "multipart-post", "~> 2.0"
|
33
35
|
|
data/lib/discourse_theme.rb
CHANGED
@@ -10,8 +10,10 @@ require 'net/http/post/multipart'
|
|
10
10
|
require 'uri'
|
11
11
|
require 'listen'
|
12
12
|
require 'json'
|
13
|
+
require 'yaml'
|
13
14
|
|
14
15
|
require 'discourse_theme/version'
|
16
|
+
require 'discourse_theme/config'
|
15
17
|
require 'discourse_theme/cli'
|
16
18
|
require 'discourse_theme/uploader'
|
17
19
|
require 'discourse_theme/watcher'
|
data/lib/discourse_theme/cli.rb
CHANGED
@@ -1,71 +1,62 @@
|
|
1
1
|
class DiscourseTheme::Cli
|
2
2
|
|
3
|
-
|
3
|
+
SETTINGS_FILE = File.expand_path("~/.discourse_theme")
|
4
4
|
|
5
5
|
def usage
|
6
|
-
puts "Usage:
|
6
|
+
puts "Usage: discourse_theme COMMAND"
|
7
7
|
puts
|
8
|
-
puts "
|
9
|
-
puts "
|
8
|
+
puts "discourse_theme new DIR : Creates a new theme in the designated directory"
|
9
|
+
puts "discourse_theme watch DIR : Watches the theme directory and synchronizes with Discourse"
|
10
10
|
exit 1
|
11
11
|
end
|
12
12
|
|
13
|
-
def guess_api_key
|
13
|
+
def guess_api_key(settings)
|
14
14
|
api_key = ENV['DISCOURSE_API_KEY']
|
15
15
|
if api_key
|
16
16
|
puts "Using api_key provided by DISCOURSE_API_KEY"
|
17
17
|
end
|
18
18
|
|
19
|
-
if !api_key &&
|
20
|
-
api_key =
|
21
|
-
puts "Using previously stored api key in #{
|
19
|
+
if !api_key && settings.api_key
|
20
|
+
api_key = settings.api_key
|
21
|
+
puts "Using previously stored api key in #{SETTINGS_FILE}"
|
22
22
|
end
|
23
23
|
|
24
24
|
if !api_key
|
25
25
|
puts "No API key found in DISCOURSE_API_KEY env var enter your API key: "
|
26
26
|
api_key = STDIN.gets.strip
|
27
|
-
puts "Would you like me to store this API key in #{
|
27
|
+
puts "Would you like me to store this API key in #{SETTINGS_FILE}? (Yes|No)"
|
28
28
|
answer = STDIN.gets.strip
|
29
29
|
if answer =~ /y(es)?/i
|
30
|
-
|
30
|
+
settings.api_key = api_key
|
31
31
|
end
|
32
32
|
end
|
33
33
|
|
34
34
|
api_key
|
35
35
|
end
|
36
36
|
|
37
|
-
def
|
38
|
-
|
39
|
-
if
|
40
|
-
puts "Site provided by
|
37
|
+
def guess_url(settings)
|
38
|
+
url = ENV['DISCOURSE_URL']
|
39
|
+
if url
|
40
|
+
puts "Site provided by DISCOURSE_URL"
|
41
41
|
end
|
42
42
|
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
site = File.read(site_conf).strip
|
47
|
-
puts "Using #{site} defined in #{site_conf}"
|
43
|
+
if !url && settings.url
|
44
|
+
url = settings.url
|
45
|
+
puts "Using #{url} defined in #{SETTINGS_FILE}"
|
48
46
|
end
|
49
47
|
|
50
|
-
if !
|
51
|
-
puts "No site found
|
52
|
-
|
53
|
-
|
48
|
+
if !url
|
49
|
+
puts "No site found! Where would you like to synchronize the theme to: "
|
50
|
+
url = STDIN.gets.strip
|
51
|
+
url += "http://" unless url =~ /^https?:\/\//
|
52
|
+
puts "Would you like me to store this site name at: #{SETTINGS_FILE}? (Yes|No)"
|
54
53
|
answer = STDIN.gets.strip
|
55
54
|
if answer =~ /y(es)?/i
|
56
|
-
|
57
|
-
# got to make sure this is in .gitignore
|
58
|
-
|
59
|
-
gitignore = File.read(dir + "/.gitignore") rescue ""
|
60
|
-
if gitignore !~ /^.discourse-site/
|
61
|
-
gitignore.strip!
|
62
|
-
gitignore += "\n.discourse-site"
|
63
|
-
File.write(dir + '/.gitignore', gitignore)
|
64
|
-
end
|
55
|
+
settings.url = url
|
65
56
|
end
|
66
57
|
end
|
67
58
|
|
68
|
-
|
59
|
+
url
|
69
60
|
end
|
70
61
|
|
71
62
|
def run
|
@@ -85,11 +76,14 @@ class DiscourseTheme::Cli
|
|
85
76
|
usage
|
86
77
|
end
|
87
78
|
|
88
|
-
|
89
|
-
|
79
|
+
config = DiscourseTheme::Config.new(SETTINGS_FILE)
|
80
|
+
settings = config[dir]
|
81
|
+
|
82
|
+
url = guess_url(settings)
|
83
|
+
api_key = guess_api_key(settings)
|
90
84
|
|
91
|
-
if !
|
92
|
-
puts "Missing site!"
|
85
|
+
if !url
|
86
|
+
puts "Missing site to synchronize with!"
|
93
87
|
usage
|
94
88
|
end
|
95
89
|
|
@@ -98,8 +92,8 @@ class DiscourseTheme::Cli
|
|
98
92
|
usage
|
99
93
|
end
|
100
94
|
|
101
|
-
uploader = DiscourseTheme::Uploader.new(dir: dir, api_key: api_key, site:
|
102
|
-
print "Uploading theme from #{dir} to #{
|
95
|
+
uploader = DiscourseTheme::Uploader.new(dir: dir, api_key: api_key, site: url)
|
96
|
+
print "Uploading theme from #{dir} to #{url} : "
|
103
97
|
uploader.upload_full_theme
|
104
98
|
|
105
99
|
watcher = DiscourseTheme::Watcher.new(dir: dir, uploader: uploader)
|
@@ -0,0 +1,76 @@
|
|
1
|
+
class DiscourseTheme::Config
|
2
|
+
|
3
|
+
class PathSetting
|
4
|
+
def initialize(config, path)
|
5
|
+
@config = config
|
6
|
+
@path = path
|
7
|
+
end
|
8
|
+
|
9
|
+
def api_key
|
10
|
+
safe_config["api_key"]
|
11
|
+
end
|
12
|
+
|
13
|
+
def api_key=(val)
|
14
|
+
set("api_key", val)
|
15
|
+
end
|
16
|
+
|
17
|
+
def url
|
18
|
+
safe_config["url"]
|
19
|
+
end
|
20
|
+
|
21
|
+
def url=(val)
|
22
|
+
set("url", val)
|
23
|
+
end
|
24
|
+
|
25
|
+
protected
|
26
|
+
|
27
|
+
def set(name, val)
|
28
|
+
hash = @config.raw_config[@path] ||= {}
|
29
|
+
hash[name] = val
|
30
|
+
@config.save
|
31
|
+
val
|
32
|
+
end
|
33
|
+
|
34
|
+
def safe_config
|
35
|
+
config = @config.raw_config[@path]
|
36
|
+
if Hash === config
|
37
|
+
config
|
38
|
+
else
|
39
|
+
{}
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
attr_reader :raw_config, :filename
|
45
|
+
|
46
|
+
def initialize(filename)
|
47
|
+
@filename = filename
|
48
|
+
|
49
|
+
if File.exist?(@filename)
|
50
|
+
begin
|
51
|
+
@raw_config = YAML.load_file(@filename)
|
52
|
+
raise unless Hash === @raw_config
|
53
|
+
rescue
|
54
|
+
@raw_config = {}
|
55
|
+
$stderr.puts "ERROR: #{@filename} contains invalid config, resetting"
|
56
|
+
end
|
57
|
+
else
|
58
|
+
@raw_config = {}
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
def set(path, url:, api_key:)
|
63
|
+
@raw_config[path] = {
|
64
|
+
"url" => url,
|
65
|
+
"api_key" => api_key
|
66
|
+
}
|
67
|
+
end
|
68
|
+
|
69
|
+
def save
|
70
|
+
File.write(@filename, @raw_config.to_yaml)
|
71
|
+
end
|
72
|
+
|
73
|
+
def [](path)
|
74
|
+
PathSetting.new(self, path)
|
75
|
+
end
|
76
|
+
end
|
@@ -40,7 +40,6 @@ class DiscourseTheme::Uploader
|
|
40
40
|
count
|
41
41
|
end
|
42
42
|
|
43
|
-
|
44
43
|
def upload_theme_field(target: , name: , type_id: , value:)
|
45
44
|
|
46
45
|
raise "expecting theme_id to be set!" unless @theme_id
|
@@ -59,6 +58,8 @@ class DiscourseTheme::Uploader
|
|
59
58
|
uri = URI.parse(@site + "/admin/themes/#{@theme_id}?api_key=#{@api_key}")
|
60
59
|
|
61
60
|
http = Net::HTTP.new(uri.host, uri.port)
|
61
|
+
http.use_ssl = URI::HTTPS === uri
|
62
|
+
|
62
63
|
request = Net::HTTP::Put.new(uri.request_uri, 'Content-Type' => 'application/json')
|
63
64
|
request.body = args.to_json
|
64
65
|
|
@@ -82,6 +83,7 @@ class DiscourseTheme::Uploader
|
|
82
83
|
# new full upload endpoint
|
83
84
|
uri = URI.parse(@site + "/admin/themes/import.json?api_key=#{@api_key}")
|
84
85
|
http = Net::HTTP.new(uri.host, uri.port)
|
86
|
+
http.use_ssl = URI::HTTPS === uri
|
85
87
|
File.open(filename) do |tgz|
|
86
88
|
|
87
89
|
request = Net::HTTP::Post::Multipart.new(
|
@@ -97,12 +99,12 @@ class DiscourseTheme::Uploader
|
|
97
99
|
end
|
98
100
|
else
|
99
101
|
puts "Error importing theme status: #{response.code}"
|
102
|
+
|
103
|
+
puts response.body
|
100
104
|
end
|
101
105
|
end
|
102
106
|
|
103
107
|
ensure
|
104
108
|
FileUtils.rm_f filename
|
105
109
|
end
|
106
|
-
|
107
|
-
|
108
110
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: discourse_theme
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Sam Saffron
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-03-
|
11
|
+
date: 2018-03-15 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -52,20 +52,48 @@ dependencies:
|
|
52
52
|
- - "~>"
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: '5.0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: guard
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - "~>"
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '2.14'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - "~>"
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '2.14'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: guard-minitest
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - "~>"
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '2.4'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - "~>"
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '2.4'
|
55
83
|
- !ruby/object:Gem::Dependency
|
56
84
|
name: minitar
|
57
85
|
requirement: !ruby/object:Gem::Requirement
|
58
86
|
requirements:
|
59
87
|
- - "~>"
|
60
88
|
- !ruby/object:Gem::Version
|
61
|
-
version: '0.
|
89
|
+
version: '0.6'
|
62
90
|
type: :runtime
|
63
91
|
prerelease: false
|
64
92
|
version_requirements: !ruby/object:Gem::Requirement
|
65
93
|
requirements:
|
66
94
|
- - "~>"
|
67
95
|
- !ruby/object:Gem::Version
|
68
|
-
version: '0.
|
96
|
+
version: '0.6'
|
69
97
|
- !ruby/object:Gem::Dependency
|
70
98
|
name: listen
|
71
99
|
requirement: !ruby/object:Gem::Requirement
|
@@ -103,9 +131,11 @@ extensions: []
|
|
103
131
|
extra_rdoc_files: []
|
104
132
|
files:
|
105
133
|
- ".gitignore"
|
134
|
+
- ".rubocop.yml"
|
106
135
|
- ".travis.yml"
|
107
136
|
- CODE_OF_CONDUCT.md
|
108
137
|
- Gemfile
|
138
|
+
- Guardfile
|
109
139
|
- LICENSE.txt
|
110
140
|
- README.md
|
111
141
|
- Rakefile
|
@@ -113,6 +143,7 @@ files:
|
|
113
143
|
- discourse_theme.gemspec
|
114
144
|
- lib/discourse_theme.rb
|
115
145
|
- lib/discourse_theme/cli.rb
|
146
|
+
- lib/discourse_theme/config.rb
|
116
147
|
- lib/discourse_theme/scaffold.rb
|
117
148
|
- lib/discourse_theme/uploader.rb
|
118
149
|
- lib/discourse_theme/version.rb
|