discourse_theme 0.1.0 → 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
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