maglove 0.8.1 → 1.0.2

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.
Files changed (73) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +3 -0
  3. data/.rubocop.yml +157 -0
  4. data/Gemfile.lock +59 -49
  5. data/bin/maglove +13 -13
  6. data/data/maglove/export.haml +11 -0
  7. data/data/maglove/index.haml +17 -0
  8. data/data/maglove/maglove.css +62 -0
  9. data/data/maglove/maglove.haml +18 -0
  10. data/data/maglove/maglove.js +68 -0
  11. data/lib/block_resolver.rb +6 -0
  12. data/lib/ext/thor/option.rb +43 -0
  13. data/lib/magloft/api.rb +39 -0
  14. data/lib/magloft/api_caller.rb +67 -0
  15. data/lib/magloft/remote_collection.rb +50 -0
  16. data/lib/magloft/remote_resource.rb +124 -0
  17. data/lib/magloft/transformable.rb +11 -0
  18. data/lib/magloft/typeloft_block.rb +18 -0
  19. data/lib/magloft/typeloft_image.rb +18 -0
  20. data/lib/magloft/typeloft_template.rb +18 -0
  21. data/lib/magloft/typeloft_theme.rb +41 -0
  22. data/lib/magloft.rb +3 -0
  23. data/lib/maglove/application.rb +10 -12
  24. data/lib/maglove/asset/theme.rb +37 -32
  25. data/lib/maglove/commands/assets.rb +85 -0
  26. data/lib/maglove/commands/base.rb +55 -0
  27. data/lib/maglove/commands/fonts.rb +69 -0
  28. data/lib/maglove/commands/main.rb +24 -0
  29. data/lib/maglove/commands/theme.rb +197 -0
  30. data/lib/maglove/helper/log_helper.rb +3 -18
  31. data/lib/maglove/middleware/live_reload.rb +97 -0
  32. data/lib/maglove/phantom_script.rb +9 -10
  33. data/lib/maglove/server.rb +46 -78
  34. data/lib/maglove/tilt/coffee_template.rb +7 -6
  35. data/lib/maglove/tilt/haml_template.rb +4 -4
  36. data/lib/maglove/tilt/js_template.rb +8 -8
  37. data/lib/maglove/tilt/less_template.rb +5 -4
  38. data/lib/maglove/tilt/scss_template.rb +17 -11
  39. data/lib/maglove/tilt/yaml_template.rb +3 -2
  40. data/lib/maglove/version.rb +1 -1
  41. data/lib/maglove/workspace.rb +41 -0
  42. data/lib/maglove.rb +38 -49
  43. data/lib/powersnap.rb +24 -0
  44. data/lib/workspace/workspace_dir/archive.rb +18 -0
  45. data/lib/workspace/workspace_dir.rb +98 -0
  46. data/lib/workspace/workspace_file/archive.rb +45 -0
  47. data/lib/workspace/workspace_file/media.rb +19 -0
  48. data/lib/workspace/workspace_file/net.rb +18 -0
  49. data/lib/workspace/workspace_file/parse.rb +21 -0
  50. data/lib/workspace/workspace_file.rb +99 -0
  51. data/lib/workspace.rb +11 -0
  52. data/maglove.gemspec +12 -12
  53. metadata +100 -86
  54. data/data/maglove/dump.haml +0 -58
  55. data/data/maglove/sdk.haml +0 -27
  56. data/lib/ext/commander/command.rb +0 -32
  57. data/lib/ext/commander/methods.rb +0 -8
  58. data/lib/maglove/asset/base_theme.rb +0 -17
  59. data/lib/maglove/command/compile.rb +0 -44
  60. data/lib/maglove/command/compress.rb +0 -28
  61. data/lib/maglove/command/copy.rb +0 -35
  62. data/lib/maglove/command/core.rb +0 -23
  63. data/lib/maglove/command/font.rb +0 -80
  64. data/lib/maglove/command/server.rb +0 -16
  65. data/lib/maglove/command/sync.rb +0 -17
  66. data/lib/maglove/command/theme.rb +0 -175
  67. data/lib/maglove/command/util.rb +0 -45
  68. data/lib/maglove/helper/asset_helper.rb +0 -24
  69. data/lib/maglove/helper/command_helper.rb +0 -67
  70. data/lib/maglove/helper/theme_helper.rb +0 -105
  71. data/lib/maglove/server/hpub.rb +0 -185
  72. data/lib/maglove/template/tumblr.rb +0 -81
  73. data/lib/maglove/tilt/twig_template.rb +0 -49
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 6a230c7b19f74faf02d1ec08a10763dc2ff1c129
4
- data.tar.gz: 0b7650f1ec4b650cee59d5089da24e961ade8797
3
+ metadata.gz: 8dccb23a8c8be90fb803c245920d9fdb69a2daf3
4
+ data.tar.gz: c52c4361e99d42bc6b54c8d7d01f5863e27c0c7d
5
5
  SHA512:
6
- metadata.gz: ff4cb7052c03f2ad71bf8ded20e9cdcaf71471a75a291eade057edc8d149d4ee8695c7b4238b5de97556965b9537913441bc518bb4e7e91ace71fa7834906ae0
7
- data.tar.gz: 8df9810cda0e1d6ee6512bbe14409ab60650834d1fa147159ec085d7b00462735df21d6b19e0060e3d9768838f407a1c2da6391c52b1d184ec67b5dbad7a52a8
6
+ metadata.gz: c689282df29d5158e65d1820202d6f69ef0036ee8f3a4feb44df581778539ec6c97202d9dc0f8e0cf1478ace624c726ff013d8a473c78b444e7204e5085aa582
7
+ data.tar.gz: 7707828d8db40facb164f6b6a0a4ce0035775e2aaeb0b50efbe32ec333867d1ae50e91220f9d2f3741ae69b4c0b4e706d2a534ca21f6033b2c638f19870fe753
data/.gitignore CHANGED
@@ -4,3 +4,6 @@
4
4
  .DS_Store
5
5
  /maglove-*.gem
6
6
  /src/*
7
+ /.sass-cache/*
8
+ /export/*
9
+ /widgets/*
data/.rubocop.yml ADDED
@@ -0,0 +1,157 @@
1
+ # kind_of? is a good way to check a type
2
+ Style/ClassCheck:
3
+ EnforcedStyle: kind_of?
4
+
5
+ # It's better to be more explicit about the type
6
+ Style/BracesAroundHashParameters:
7
+ Enabled: false
8
+
9
+ # specs sometimes have useless assignments, which is fine
10
+ Lint/UselessAssignment:
11
+ Exclude:
12
+ - '**/spec/**/*'
13
+
14
+ # We could potentially enable the 2 below:
15
+ Style/IndentHash:
16
+ Enabled: false
17
+
18
+ Style/AlignHash:
19
+ Enabled: false
20
+
21
+ # HoundCI doesn't like this rule
22
+ Style/DotPosition:
23
+ Enabled: false
24
+
25
+ # We allow !! as it's an easy way to convert ot boolean
26
+ Style/DoubleNegation:
27
+ Enabled: false
28
+
29
+ # Sometimes we allow a rescue block that doesn't contain code
30
+ Lint/HandleExceptions:
31
+ Enabled: false
32
+
33
+ # Cop supports --auto-correct.
34
+ Lint/UnusedBlockArgument:
35
+ Enabled: false
36
+
37
+ # Needed for $verbose
38
+ Style/GlobalVars:
39
+ Enabled: false
40
+
41
+ # We want to allow class Fastlane::Class
42
+ Style/ClassAndModuleChildren:
43
+ Enabled: false
44
+
45
+ # $? Exit
46
+ Style/SpecialGlobalVars:
47
+ Enabled: false
48
+
49
+ Metrics/AbcSize:
50
+ Enabled: false
51
+
52
+ Metrics/MethodLength:
53
+ Enabled: false
54
+
55
+ Metrics/CyclomaticComplexity:
56
+ Enabled: false
57
+
58
+ # The %w might be confusing for new users
59
+ Style/WordArray:
60
+ MinSize: 19
61
+
62
+ # raise and fail are both okay
63
+ Style/SignalException:
64
+ Enabled: false
65
+
66
+ # Better too much 'return' than one missing
67
+ Style/RedundantReturn:
68
+ Enabled: false
69
+
70
+ # Having if in the same line might not always be good
71
+ Style/IfUnlessModifier:
72
+ Enabled: false
73
+
74
+ # and and or is okay
75
+ Style/AndOr:
76
+ Enabled: false
77
+
78
+ # Configuration parameters: CountComments.
79
+ Metrics/ClassLength:
80
+ Max: 320
81
+
82
+
83
+ # Configuration parameters: AllowURI, URISchemes.
84
+ Metrics/LineLength:
85
+ Max: 370
86
+
87
+ # Configuration parameters: CountKeywordArgs.
88
+ Metrics/ParameterLists:
89
+ Max: 17
90
+
91
+ Metrics/PerceivedComplexity:
92
+ Max: 20
93
+
94
+ # Sometimes it's easier to read without guards
95
+ Style/GuardClause:
96
+ Enabled: false
97
+
98
+ # We allow both " and '
99
+ Style/StringLiterals:
100
+ Enabled: false
101
+
102
+ # something = if something_else
103
+ # that's confusing
104
+ Style/ConditionalAssignment:
105
+ Enabled: false
106
+
107
+ # Better to have too much self than missing a self
108
+ Style/RedundantSelf:
109
+ Enabled: false
110
+
111
+ # e.g.
112
+ # def self.is_supported?(platform)
113
+ # we may never use `platform`
114
+ Lint/UnusedMethodArgument:
115
+ Enabled: false
116
+
117
+ # the let(:key) { ... }
118
+ Lint/ParenthesesAsGroupedExpression:
119
+ Exclude:
120
+ - '**/spec/**/*'
121
+
122
+ # This would reject is_ in front of methods
123
+ # We use `is_supported?` everywhere already
124
+ Style/PredicateName:
125
+ Enabled: false
126
+
127
+ # We allow the $
128
+ Style/PerlBackrefs:
129
+ Enabled: false
130
+
131
+ # Disable '+ should be surrounded with a single space' for xcodebuild_spec.rb
132
+ Style/SpaceAroundOperators:
133
+ Exclude:
134
+ - '**/spec/actions_specs/xcodebuild_spec.rb'
135
+
136
+ AllCops:
137
+ Include:
138
+ - '**/fastlane/Fastfile'
139
+ Exclude:
140
+ - './vendor/**/*'
141
+ - db/schema.rb
142
+
143
+ # We're not there yet
144
+ Style/Documentation:
145
+ Enabled: false
146
+
147
+ # Added after upgrade to 0.38.0
148
+ Style/MutableConstant:
149
+ Enabled: false
150
+
151
+ # length > 0 is good
152
+ Style/ZeroLengthPredicate:
153
+ Enabled: false
154
+
155
+ # Adds complexity
156
+ Style/IfInsideElse:
157
+ Enabled: false
data/Gemfile.lock CHANGED
@@ -1,26 +1,28 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- maglove (0.8.1)
5
- actionpack (~> 5.0)
6
- activesupport (~> 5.0)
4
+ maglove (1.0.2)
5
+ actionpack (>= 4.0)
6
+ activesupport (>= 4.0)
7
7
  bundler (~> 1.10)
8
8
  coffee-script (~> 2.4)
9
- commander (~> 4.3)
10
- dotenv (~> 2.0)
9
+ dialers (~> 0.2)
10
+ faraday (~> 0.9)
11
+ faye (~> 1.2)
11
12
  filewatcher (~> 0.5)
12
13
  haml (~> 4.0)
13
- hamloft (~> 0.2.1)
14
+ hamloft (~> 0.2.4)
14
15
  image_optim (~> 0.21)
15
16
  image_optim_pack (~> 0.2)
16
17
  less (~> 2.6)
17
18
  logging (~> 2.0)
18
- minitar (~> 0.5)
19
+ maglove-widgets (~> 1.0)
20
+ open_uri_redirections (~> 0.2)
21
+ puma (~> 3.6)
19
22
  rubyzip (~> 1.1)
20
23
  sass (~> 3.4)
21
- therubyracer (~> 0.12)
24
+ thor (~> 0.19)
22
25
  tilt (~> 1.4)
23
- webrick (~> 1.3)
24
26
 
25
27
  GEM
26
28
  remote: https://rubygems.org/
@@ -43,31 +45,58 @@ GEM
43
45
  i18n (~> 0.7)
44
46
  minitest (~> 5.1)
45
47
  tzinfo (~> 1.1)
48
+ addressable (2.4.0)
46
49
  ast (2.3.0)
47
50
  builder (3.2.2)
48
- coderay (1.1.1)
49
51
  coffee-script (2.4.1)
50
52
  coffee-script-source
51
53
  execjs
52
54
  coffee-script-source (1.10.0)
53
- commander (4.4.0)
54
- highline (~> 1.7.2)
55
55
  commonjs (0.2.7)
56
56
  concurrent-ruby (1.0.2)
57
- diff-lcs (1.2.5)
58
- dotenv (2.1.1)
57
+ cookiejar (0.3.3)
58
+ dialers (0.2.2)
59
+ faraday (~> 0.9)
60
+ faraday-conductivity (~> 0.3)
61
+ faraday_middleware (~> 0.9)
62
+ em-http-request (1.1.5)
63
+ addressable (>= 2.3.4)
64
+ cookiejar (!= 0.3.1)
65
+ em-socksify (>= 0.3)
66
+ eventmachine (>= 1.0.3)
67
+ http_parser.rb (>= 0.6.0)
68
+ em-socksify (0.3.1)
69
+ eventmachine (>= 1.0.0.beta.4)
59
70
  erubis (2.7.0)
71
+ eventmachine (1.2.0.1)
60
72
  execjs (2.7.0)
61
73
  exifr (1.2.5)
74
+ faraday (0.9.2)
75
+ multipart-post (>= 1.2, < 3)
76
+ faraday-conductivity (0.3.1)
77
+ faraday (~> 0.8)
78
+ faraday_middleware (0.10.0)
79
+ faraday (>= 0.7.4, < 0.10)
80
+ faye (1.2.3)
81
+ cookiejar (>= 0.3.0)
82
+ em-http-request (>= 0.3.0)
83
+ eventmachine (>= 0.12.0)
84
+ faye-websocket (>= 0.9.1)
85
+ multi_json (>= 1.0.0)
86
+ rack (>= 1.0.0)
87
+ websocket-driver (>= 0.5.1)
88
+ faye-websocket (0.10.4)
89
+ eventmachine (>= 0.12.0)
90
+ websocket-driver (>= 0.5.1)
62
91
  filewatcher (0.5.3)
63
92
  trollop (~> 2.0)
64
93
  fspath (3.0.1)
65
94
  haml (4.0.7)
66
95
  tilt
67
- hamloft (0.2.1)
96
+ hamloft (0.2.4)
68
97
  haml (~> 4.0)
69
98
  nokogiri (~> 1.6)
70
- highline (1.7.8)
99
+ http_parser.rb (0.6.0)
71
100
  i18n (0.7.0)
72
101
  image_optim (0.24.0)
73
102
  exifr (~> 1.2, >= 1.2.2)
@@ -75,37 +104,35 @@ GEM
75
104
  image_size (~> 1.3)
76
105
  in_threads (~> 1.3)
77
106
  progress (~> 3.0, >= 3.0.1)
78
- image_optim_pack (0.3.0.20160812)
107
+ image_optim_pack (0.3.0.20161021)
79
108
  fspath (>= 2.1, < 4)
80
109
  image_optim (~> 0.19)
81
110
  image_size (1.4.2)
82
111
  in_threads (1.3.1)
83
112
  less (2.6.0)
84
113
  commonjs (~> 0.2.7)
85
- libv8 (3.16.14.15)
86
114
  little-plugger (1.1.4)
87
115
  logging (2.1.0)
88
116
  little-plugger (~> 1.1)
89
117
  multi_json (~> 1.10)
90
118
  loofah (2.0.3)
91
119
  nokogiri (>= 1.5.9)
92
- method_source (0.8.2)
120
+ maglove-widgets (1.0.0)
121
+ bundler (~> 1.10)
122
+ haml (~> 4.0)
123
+ hamloft (~> 0.2.4)
93
124
  mini_portile2 (2.1.0)
94
- minitar (0.5.4)
95
- minitest (5.9.0)
125
+ minitest (5.9.1)
96
126
  multi_json (1.12.1)
97
- nokogiri (1.6.8)
127
+ multipart-post (2.0.0)
128
+ nokogiri (1.6.8.1)
98
129
  mini_portile2 (~> 2.1.0)
99
- pkg-config (~> 1.1.7)
130
+ open_uri_redirections (0.2.1)
100
131
  parser (2.3.1.2)
101
132
  ast (~> 2.2)
102
- pkg-config (1.1.7)
103
133
  powerpack (0.1.1)
104
134
  progress (3.2.2)
105
- pry (0.10.4)
106
- coderay (~> 1.1.0)
107
- method_source (~> 0.8.1)
108
- slop (~> 3.4)
135
+ puma (3.6.0)
109
136
  rack (2.0.1)
110
137
  rack-test (0.6.3)
111
138
  rack (>= 1.0)
@@ -115,20 +142,6 @@ GEM
115
142
  rails-html-sanitizer (1.0.3)
116
143
  loofah (~> 2.0)
117
144
  rainbow (2.1.0)
118
- ref (2.0.0)
119
- rspec (3.5.0)
120
- rspec-core (~> 3.5.0)
121
- rspec-expectations (~> 3.5.0)
122
- rspec-mocks (~> 3.5.0)
123
- rspec-core (3.5.2)
124
- rspec-support (~> 3.5.0)
125
- rspec-expectations (3.5.0)
126
- diff-lcs (>= 1.2.0, < 2.0)
127
- rspec-support (~> 3.5.0)
128
- rspec-mocks (3.5.0)
129
- diff-lcs (>= 1.2.0, < 2.0)
130
- rspec-support (~> 3.5.0)
131
- rspec-support (3.5.0)
132
145
  rubocop (0.42.0)
133
146
  parser (>= 2.3.1.1, < 3.0)
134
147
  powerpack (~> 0.1)
@@ -138,25 +151,22 @@ GEM
138
151
  ruby-progressbar (1.8.1)
139
152
  rubyzip (1.2.0)
140
153
  sass (3.4.22)
141
- slop (3.6.0)
142
- therubyracer (0.12.2)
143
- libv8 (~> 3.16.14.0)
144
- ref
154
+ thor (0.19.1)
145
155
  thread_safe (0.3.5)
146
156
  tilt (1.4.1)
147
157
  trollop (2.1.2)
148
158
  tzinfo (1.2.2)
149
159
  thread_safe (~> 0.1)
150
160
  unicode-display_width (1.1.0)
151
- webrick (1.3.1)
161
+ websocket-driver (0.6.4)
162
+ websocket-extensions (>= 0.1.0)
163
+ websocket-extensions (0.1.2)
152
164
 
153
165
  PLATFORMS
154
166
  ruby
155
167
 
156
168
  DEPENDENCIES
157
169
  maglove!
158
- pry (~> 0.10)
159
- rspec (~> 3.3)
160
170
  rubocop (~> 0.32)
161
171
 
162
172
  BUNDLED WITH
data/bin/maglove CHANGED
@@ -1,18 +1,18 @@
1
1
  #!/usr/bin/env ruby
2
- $:.push File.expand_path("../../lib", __FILE__)
3
-
2
+ $:.push("lib/")
3
+ require "thor"
4
+ require "ext/thor/option"
5
+ require 'coffee_script'
6
+ require "active_support/all"
7
+ require "hamloft"
8
+ require "workspace"
4
9
  require "maglove"
10
+ require "action_dispatch/http/mime_type"
5
11
 
6
- Dotenv.load
12
+ # require local widgets
13
+ Dir["widgets/*.rb"].each { |path| require File.join(Dir.pwd, path) }
7
14
 
8
- # Set up Hamloft
9
- Hamloft.register_template(:tumblr, MagLove::Template::Tumblr)
10
- Tilt.mappings["haml"] = [MagLove::Tilt::HamlTemplate]
11
- Tilt.mappings["scss"] = [MagLove::Tilt::ScssTemplate]
12
- Tilt.mappings["less"] = [MagLove::Tilt::LessTemplate]
13
- Tilt.mappings["yml"] = [MagLove::Tilt::YamlTemplate]
14
- Tilt.mappings["coffee"] = [MagLove::Tilt::CoffeeTemplate]
15
- Tilt.mappings["js"] = [MagLove::Tilt::JsTemplate]
16
- Tilt.mappings["twig"] = [MagLove::Tilt::TwigTemplate]
15
+ # allow colons
16
+ ARGV.unshift(*ARGV.shift.split(":")) if ARGV.count > 0 and ARGV[0].include?(":")
17
17
 
18
- MagLove::Application.new.run
18
+ MagLove::Commands::Main.start
@@ -0,0 +1,11 @@
1
+ !!! 5
2
+ %html
3
+ %head
4
+ %meta{ charset: "UTF-8" }
5
+ %title= "#{theme} - EXPORT"
6
+ %meta{ name: "viewport", content: "width=device-width, initial-scale=1.0" }
7
+ %link{ href: asset("theme.css"), media: "screen", rel: "stylesheet" }
8
+ %link{ href: root_asset("fonts/fonts.css"), media: "screen", rel: "stylesheet" }
9
+ %script{ src: asset("theme.js"), type: "text/javascript" }
10
+ %body
11
+ = contents
@@ -0,0 +1,17 @@
1
+ !!! 5
2
+ %html
3
+ %head
4
+ %meta{ charset: "UTF-8" }
5
+ %title= "#{theme} - INDEX"
6
+ %meta{ name: "viewport", content: "width=device-width, initial-scale=1.0" }
7
+ %meta{ name: "pageid", content: "0" }
8
+ %link{ href: "/fonts/fonts.css", media: "screen", rel: "stylesheet" }
9
+ %link{ href: "/maglove.css", media: "screen", rel: "stylesheet" }
10
+ %body#index
11
+ #templates-container
12
+ - templates.each do |template|
13
+ %div.template-item
14
+ %a.template{href: "/#{template}", style: "background-image: url(#{MagLoft::ApiCaller::MAGLOFT_CDN_URL}/themes/#{theme}/thumbnails/#{template}.png);"}
15
+ %div.template-label
16
+ %span
17
+ #{template}
@@ -0,0 +1,62 @@
1
+ body#index {
2
+ padding: 0;
3
+ margin: 0;
4
+ font-family: "Helvetica Neue", Helvetica;
5
+ background: #F5F5F5;
6
+ }
7
+
8
+ div#templates-container {
9
+ display: flex;
10
+ position: relative;
11
+ flex-wrap: wrap;
12
+ padding: 10px;
13
+ margin: 0px auto;
14
+ max-width: 1024px;
15
+ }
16
+
17
+ div#templates-container .template-item {
18
+ flex: 1;
19
+ min-width: 300px;
20
+ margin: 10px;
21
+ position: relative;
22
+ border: 4px solid #FFFFFF;
23
+ }
24
+
25
+ div#templates-container .template-item a.template {
26
+ position: relative;
27
+ padding-top: 133.333%;
28
+ background-size: cover;
29
+ background-repeat: no-repeat;
30
+ background-position: center center;
31
+ background-color: #EEEEEE;
32
+ display: flex;
33
+ color: #FFFFFF;
34
+ text-shadow: 0px 1px 4px #000;
35
+ }
36
+
37
+ div#templates-container .template-item a.template:hover .template-label {
38
+ background-color: rgba(0,0,0,0.5);
39
+ color: #FFFFFF;
40
+ }
41
+
42
+ div#templates-container .template-item a.template .template-label {
43
+ position: absolute;
44
+ top: 0;
45
+ left: 0;
46
+ right: 0;
47
+ bottom: 0;
48
+ transition: background-color 250ms, color 250ms;
49
+ display: flex;
50
+ align-items: center;
51
+ justify-content: center;
52
+ text-decoration: none;
53
+ }
54
+
55
+ div#templates-container .template-item a.template .template-label span {
56
+ font-weight: bold;
57
+ text-align: center;
58
+ font-size: 20px;
59
+ text-transform: uppercase;
60
+ padding: 20px;
61
+ border-radius: 4px;
62
+ }
@@ -0,0 +1,18 @@
1
+ !!! 5
2
+ %html
3
+ %head
4
+ %meta{ charset: "UTF-8" }
5
+ %title= "#{theme} - #{template}"
6
+ %meta{ name: "viewport", content: "width=device-width, initial-scale=1.0" }
7
+ %meta{ name: "pageid", content: "0" }
8
+ %style{ type: "text/css", id: "theme-css" }
9
+ = css_contents
10
+ %link{ href: "/fonts/fonts.css", media: "screen", rel: "stylesheet" }
11
+ %script{ type: "text/javascript", id: "theme-js" }
12
+ = js_contents
13
+ %script{ src: "/maglove.js", type: "text/javascript" }
14
+ %link{ href: "/maglove.css", media: "screen", rel: "stylesheet" }
15
+ :javascript
16
+ const maglove = new MagLove("#{template}", "127.0.0.1", "#{port}")
17
+ %body
18
+ = contents
@@ -0,0 +1,68 @@
1
+ class MagLove {
2
+
3
+ constructor(template, host="127.0.0.1", port="3000", endpoint="maglove") {
4
+ this.template = template
5
+ this.templates = []
6
+ this.host = host
7
+ this.port = port
8
+ this.endpoint = endpoint
9
+ this.socket = null
10
+
11
+ // Connect to WebSocket
12
+ this.socket = new WebSocket(`ws://${this.host}:${this.port}/${this.endpoint}`)
13
+ this.socket.onopen = this.onSocketOpen.bind(this)
14
+ this.socket.onmessage = this.onSocketMessage.bind(this)
15
+ this.socket.onclose = this.onSocketClose.bind(this)
16
+ }
17
+
18
+ onSocketOpen(event) {
19
+ console.log("MagLove Opened")
20
+ this.send("init")
21
+ }
22
+
23
+ onSocketMessage(event) {
24
+ const message = JSON.parse(event.data)
25
+ this[message.command](message)
26
+ }
27
+
28
+ onSocketClose(event) {
29
+ console.log("MagLove Closed")
30
+ }
31
+
32
+ send(command, data={}) {
33
+ data.command = command
34
+ this.socket.send(JSON.stringify(data))
35
+ }
36
+
37
+ init(message) {
38
+ console.log("MagLove Initialized")
39
+ this.templates = message.templates
40
+ this.send("watch")
41
+ if(window.ThemeApi) {
42
+ window.ThemeApi.init({deviceId: 'AAAAAAAA-BBBB-CCCC-DDDD-EEEEEEEEEEEE', appId: 'com.magloft.maglove', apiHost: 'www.magloft.com'})
43
+ }
44
+ }
45
+
46
+ html(message) {
47
+ if(message.template === this.template) {
48
+ document.body.innerHTML = message.contents
49
+ }
50
+ $(window.document).trigger("typeloftWidgetChanged")
51
+ }
52
+
53
+ css(message) {
54
+ document.getElementById("theme-css").textContent = message.contents
55
+ }
56
+
57
+ js(message) {
58
+ document.getElementById("theme-js").remove()
59
+ let script = document.createElement('script')
60
+ script.id = "theme-js"
61
+ script.textContent = message.contents
62
+ document.getElementsByTagName('head')[0].appendChild(script)
63
+
64
+ if(window.ThemeApi) {
65
+ window.ThemeApi.init({deviceId: 'AAAAAAAA-BBBB-CCCC-DDDD-EEEEEEEEEEEE', appId: 'com.magloft.maglove', apiHost: 'www.magloft.com'})
66
+ }
67
+ }
68
+ }
@@ -0,0 +1,6 @@
1
+ class BlockResolver
2
+ def self.resolve(identifier, locals)
3
+ File.read("src/themes/#{locals[:theme]}/blocks/#{identifier}.haml")
4
+ end
5
+ end
6
+ Hamloft.block_resolver = BlockResolver
@@ -0,0 +1,43 @@
1
+ class Thor
2
+ class Option
3
+ attr_reader :validator
4
+
5
+ def initialize(name, options = {})
6
+ options[:required] = false unless options.key?(:required)
7
+ super
8
+ @lazy_default = options[:lazy_default]
9
+ @group = options[:group].to_s.capitalize if options[:group]
10
+ @aliases = Array(options[:aliases])
11
+ @hide = options[:hide]
12
+ @validator = options[:validator]
13
+ end
14
+ end
15
+
16
+ class Options
17
+ # Parse the value at the peek analyzing if it requires an input or not.
18
+ #
19
+ def parse_peek(switch, option)
20
+ if parsing_options? && (current_is_switch_formatted? || last?)
21
+ if option.boolean?
22
+ # No problem for boolean types
23
+ elsif no_or_skip?(switch)
24
+ return nil # User set value to nil
25
+ elsif option.string? && !option.required?
26
+ # Return the default if there is one, else the human name
27
+ return option.lazy_default || option.default || option.human_name
28
+ elsif option.lazy_default
29
+ return option.lazy_default
30
+ else
31
+ fail MalformattedArgumentError, "No value provided for option '#{switch}'"
32
+ end
33
+ end
34
+
35
+ @non_assigned_required.delete(option)
36
+ if option.validator and !option.validator.validate(switch, peek)
37
+ fail MalformattedArgumentError, option.validator.message(switch, peek)
38
+ end
39
+
40
+ send(:"parse_#{option.type}", switch)
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,39 @@
1
+ require "dialers"
2
+ require "magloft/api_caller"
3
+ require "magloft/remote_collection"
4
+ require "magloft/remote_resource"
5
+ require "magloft/transformable"
6
+ require "magloft/typeloft_block"
7
+ require "magloft/typeloft_image"
8
+ require "magloft/typeloft_template"
9
+ require "magloft/typeloft_theme"
10
+
11
+ module MagLoft
12
+ class Api < Dialers::Wrapper
13
+ attr_accessor :token
14
+
15
+ def self.client(token = nil)
16
+ @client ||= self.new(token)
17
+ end
18
+
19
+ def initialize(token)
20
+ @token = token
21
+ end
22
+
23
+ def api_caller
24
+ @api_caller ||= ApiCaller.new
25
+ end
26
+
27
+ def typeloft_themes
28
+ TypeloftTheme
29
+ end
30
+
31
+ def typeloft_templates
32
+ TypeloftTemplate
33
+ end
34
+
35
+ def typeloft_blocks
36
+ TypeloftBlock
37
+ end
38
+ end
39
+ end