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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: f39560cfe4f927edff0919dc9c325d0288982107
4
- data.tar.gz: ad749d7d12462e0eb5b217a1bab3ad19e0398e72
3
+ metadata.gz: e2c86731ccd3d670e5e80b81bd8667692d6b08e6
4
+ data.tar.gz: 03f1878d96b8bfffc682193346101393e70e5b3f
5
5
  SHA512:
6
- metadata.gz: 9c4cc9c5149385f35616b8f0f6aade9320b1eb2fdb0c77fb3d8dcc4fe457301ee9a7082d3e90b28ecc553cc3b07fa74c67729780946ad0de76ede02474b2a48e
7
- data.tar.gz: 538a23533f1e9eebaad4a1decd9e388bfd782c4d0c38e49072eaf98d18b8392c82c93511bf18a206de904c18d44e43fcd937ff877af65b53acc2723c8fd9e367
6
+ metadata.gz: f52f41636624d5cce942f16d94a5b2b45d40d4f9aaa1d52a81dc3b0d662ddb24c7bf087125def21e32d20ea31484e57b8ec9a3348c8ba1aad6492371feb6e34e
7
+ data.tar.gz: 8e193ff8da06e4f9ca6d05ae3de3f1d746c2a7d3286c41e0f7028c4c90f56de1948802167da62a10f800df47c9dedfc776900de7b39ac1bf68750714ede6f9f7
@@ -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
@@ -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
@@ -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.5"
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
 
@@ -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'
@@ -1,71 +1,62 @@
1
1
  class DiscourseTheme::Cli
2
2
 
3
- WATCHER_SETTINGS_FILE = File.expand_path("~/.discourse-theme-watcher")
3
+ SETTINGS_FILE = File.expand_path("~/.discourse_theme")
4
4
 
5
5
  def usage
6
- puts "Usage: discourse-theme COMMAND"
6
+ puts "Usage: discourse_theme COMMAND"
7
7
  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"
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 && File.exist?(WATCHER_SETTINGS_FILE)
20
- api_key = File.read(WATCHER_SETTINGS_FILE).strip
21
- puts "Using previously stored api key in #{WATCHER_SETTINGS_FILE}"
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 #{WATCHER_SETTINGS_FILE}? (Yes|No)"
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
- File.write WATCHER_SETTINGS_FILE, api_key
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 guess_site(dir)
38
- site = ENV['DISCOURSE_SITE']
39
- if site
40
- puts "Site provided by DISCOURSE_SITE"
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
- site_conf = dir + "/.discourse-site"
44
-
45
- if !site && File.exist?(site_conf)
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 !site
51
- puts "No site found, where would you like to synchronize the theme to: "
52
- site = STDIN.gets.strip
53
- puts "Would you like me to store this site name at: #{site_conf}? (Yes|No)"
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
- File.write site_conf, site
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
- site
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
- api_key = guess_api_key
89
- site = guess_site(dir)
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 !site
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: site)
102
- print "Uploading theme from #{dir} to #{site} : "
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
@@ -1,3 +1,3 @@
1
1
  module DiscourseTheme
2
- VERSION = "0.1.0"
2
+ VERSION = "0.1.1"
3
3
  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.0
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-14 00:00:00.000000000 Z
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.5'
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.5'
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