glimmer-dsl-tk 0.0.22 → 0.0.26

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.
@@ -0,0 +1,138 @@
1
+ # Copyright (c) 2020-2021 Andy Maleh
2
+ #
3
+ # Permission is hereby granted, free of charge, to any person obtaining
4
+ # a copy of this software and associated documentation files (the
5
+ # "Software"), to deal in the Software without restriction, including
6
+ # without limitation the rights to use, copy, modify, merge, publish,
7
+ # distribute, sublicense, and/or sell copies of the Software, and to
8
+ # permit persons to whom the Software is furnished to do so, subject to
9
+ # the following conditions:
10
+ #
11
+ # The above copyright notice and this permission notice shall be
12
+ # included in all copies or substantial portions of the Software.
13
+ #
14
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ # LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
21
+
22
+ require 'glimmer-dsl-tk'
23
+ require 'facets'
24
+ require 'fileutils'
25
+
26
+ class MetaSample
27
+ include Glimmer
28
+
29
+ attr_accessor :selected_sample_index
30
+
31
+ def initialize
32
+ @selected_sample_index = 0
33
+ end
34
+
35
+ def samples
36
+ if @samples.nil?
37
+ sample_files = Dir.glob(File.join(File.expand_path('../hello', __dir__), '**', 'hello_*.rb'))
38
+ sample_file_names = sample_files.map { |f| File.basename(f, '.rb') }
39
+ sample_file_names = sample_file_names.reject { |f| f == 'meta_sample' || f.match(/\d$/) }
40
+ @samples = sample_file_names.map { |f| f.underscore.titlecase }
41
+ end
42
+ @samples
43
+ end
44
+
45
+ def file_path_for(sample)
46
+ File.join(File.expand_path('../hello', __dir__), "#{sample.underscore}.rb")
47
+ end
48
+
49
+ def glimmer_dsl_tk_file
50
+ File.expand_path('../../lib/glimmer-dsl-tk', __dir__)
51
+ end
52
+
53
+ def selected_sample
54
+ samples[@selected_sample_index]
55
+ end
56
+
57
+ def run_sample(sample)
58
+ Thread.new do
59
+ command = "ruby -r #{glimmer_dsl_tk_file} #{sample} 2>&1"
60
+ result = ''
61
+ IO.popen(command) do |f|
62
+ f.each_line do |line|
63
+ result << line
64
+ puts line
65
+ $stdout.flush
66
+ end
67
+ end
68
+ ::Tk.after(100) do
69
+ message_box(parent: @root, title: 'Error Running Sample', message: result) if result.downcase.include?('error')
70
+ end
71
+ end
72
+ end
73
+
74
+ def launch
75
+ @root = root {
76
+ title 'Glimmer Meta-Sample'
77
+ width 700
78
+ height 500
79
+
80
+ frame {
81
+ grid row: 0, column: 0, column_weight: 0, row_weight: 1
82
+
83
+ samples.each_with_index do |sample, index|
84
+ radiobutton {
85
+ text sample
86
+ variable <=> [self, :selected_sample_index, on_write: ->(v) {v ? index : selected_sample_index}, on_read: ->(v) {v == index}]
87
+
88
+ on('command') do
89
+ @selected_sample_index = index
90
+ @code_text.text = File.read(file_path_for(selected_sample))
91
+ end
92
+ }
93
+ end
94
+
95
+ frame {
96
+ button {
97
+ grid row: 0, column: 0
98
+ text 'Launch'
99
+
100
+ on('command') do
101
+ begin
102
+ parent_dir = File.join(Dir.home, '.glimmer-dsl-tk', 'samples', 'hello')
103
+ FileUtils.mkdir_p(parent_dir)
104
+ sample_file = File.join(parent_dir, "#{selected_sample.underscore}.rb")
105
+ File.write(sample_file, @code_text.text)
106
+ FileUtils.cp_r(File.expand_path('../../icons', __dir__), File.dirname(File.dirname(parent_dir)))
107
+ FileUtils.cp_r(File.expand_path('../hello/images', __dir__), parent_dir)
108
+ sample_namespace_directory = File.expand_path("../hello/#{selected_sample.underscore}", __dir__)
109
+ FileUtils.cp_r(sample_namespace_directory, parent_dir) if Dir.exist?(sample_namespace_directory)
110
+ run_sample(sample_file)
111
+ rescue => e
112
+ puts e.full_message
113
+ puts 'Unable to write code changes! Running original sample...'
114
+ run_sample(file_path_for(selected_sample))
115
+ end
116
+ end
117
+ }
118
+ button {
119
+ grid row: 0, column: 1
120
+ text 'Reset'
121
+
122
+ on('command') do
123
+ @code_text.text = File.read(file_path_for(selected_sample))
124
+ end
125
+ }
126
+ }
127
+ }
128
+
129
+ @code_text = text {
130
+ grid row: 0, column: 1, column_weight: 1
131
+ text File.read(file_path_for(selected_sample))
132
+ }
133
+ }
134
+ @root.open
135
+ end
136
+ end
137
+
138
+ MetaSample.new.launch
@@ -23,13 +23,47 @@ require 'glimmer-dsl-tk'
23
23
 
24
24
  class HelloCheckbutton
25
25
  class Person
26
- attr_accessor :skiing, :snowboarding, :snowmobiling, :snowshoeing
26
+ attr_accessor :skiing, :snowboarding, :snowmobiling, :snowshoeing, :snow_activities, :snow_activities_alternate
27
27
 
28
28
  def initialize
29
29
  reset_activities!
30
+ individual_observer = Glimmer::DataBinding::Observer.proc do
31
+ unless @updating_group
32
+ @updating_individual = true
33
+ if skiing && snowboarding && snowmobiling && snowshoeing
34
+ self.snow_activities = true
35
+ self.snow_activities_alternate = false
36
+ elsif skiing || snowboarding || snowmobiling || snowshoeing
37
+ self.snow_activities = true
38
+ self.snow_activities_alternate = true
39
+ else
40
+ self.snow_activities = false
41
+ self.snow_activities_alternate = false
42
+ end
43
+ @updating_individual = false
44
+ end
45
+ end
46
+ individual_observer.observe(self, :skiing)
47
+ individual_observer.observe(self, :snowboarding)
48
+ individual_observer.observe(self, :snowmobiling)
49
+ individual_observer.observe(self, :snowshoeing)
50
+
51
+ group_observer = Glimmer::DataBinding::Observer.proc do
52
+ unless @updating_individual
53
+ @updating_group = true
54
+ self.skiing = self.snow_activities
55
+ self.snowboarding = self.snow_activities
56
+ self.snowmobiling = self.snow_activities
57
+ self.snowshoeing = self.snow_activities
58
+ @updating_group = false
59
+ end
60
+ end
61
+ group_observer.observe(self, :snow_activities)
30
62
  end
31
63
 
32
64
  def reset_activities!
65
+ self.snow_activities = true
66
+ self.snow_activities_alternate = true
33
67
  self.skiing = false
34
68
  self.snowboarding = true
35
69
  self.snowmobiling = false
@@ -46,7 +80,6 @@ class HelloCheckbutton
46
80
  def launch
47
81
  root {
48
82
  title 'Hello, Checkbutton!'
49
- background '#ececec' if OS.mac?
50
83
 
51
84
  label {
52
85
  text 'Check all snow activities you are interested in:'
@@ -55,23 +88,31 @@ class HelloCheckbutton
55
88
 
56
89
  frame {
57
90
  checkbutton {
58
- text 'Skiing'
59
- variable <=> [@person, :skiing]
60
- }
61
-
62
- checkbutton {
63
- text 'Snowboarding'
64
- variable <=> [@person, :snowboarding]
91
+ text 'Snow Activities'
92
+ variable <=> [@person, :snow_activities]
93
+ alternate <=> [@person, :snow_activities_alternate] # binds half-checked state
65
94
  }
66
95
 
67
- checkbutton {
68
- text 'Snowmobiling'
69
- variable <=> [@person, :snowmobiling]
70
- }
71
-
72
- checkbutton {
73
- text 'Snowshoeing'
74
- variable <=> [@person, :snowshoeing]
96
+ frame {
97
+ checkbutton {
98
+ text 'Skiing'
99
+ variable <=> [@person, :skiing]
100
+ }
101
+
102
+ checkbutton {
103
+ text 'Snowboarding'
104
+ variable <=> [@person, :snowboarding]
105
+ }
106
+
107
+ checkbutton {
108
+ text 'Snowmobiling'
109
+ variable <=> [@person, :snowmobiling]
110
+ }
111
+
112
+ checkbutton {
113
+ text 'Snowshoeing'
114
+ variable <=> [@person, :snowshoeing]
115
+ }
75
116
  }
76
117
  }
77
118
 
@@ -1,3 +1,4 @@
1
+
1
2
  # Copyright (c) 2020-2021 Andy Maleh
2
3
  #
3
4
  # Permission is hereby granted, free of charge, to any person obtaining
@@ -44,7 +45,7 @@ class HelloCombobox
44
45
  title 'Hello, Combobox!'
45
46
 
46
47
  combobox {
47
- state 'readonly'
48
+ readonly true # this applies to text editing only (item selection still triggers a write to model)
48
49
  text <=> [person, :country]
49
50
  }
50
51
 
@@ -0,0 +1,104 @@
1
+ # Copyright (c) 2020-2021 Andy Maleh
2
+ #
3
+ # Permission is hereby granted, free of charge, to any person obtaining
4
+ # a copy of this software and associated documentation files (the
5
+ # "Software"), to deal in the Software without restriction, including
6
+ # without limitation the rights to use, copy, modify, merge, publish,
7
+ # distribute, sublicense, and/or sell copies of the Software, and to
8
+ # permit persons to whom the Software is furnished to do so, subject to
9
+ # the following conditions:
10
+ #
11
+ # The above copyright notice and this permission notice shall be
12
+ # included in all copies or substantial portions of the Software.
13
+ #
14
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ # LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
21
+
22
+ require 'glimmer-dsl-tk'
23
+
24
+ class HelloEntry
25
+ include Glimmer
26
+
27
+ attr_accessor :default, :password, :telephone, :read_only
28
+
29
+ def initialize
30
+ self.default = 'default'
31
+ self.password = 'password'
32
+ self.telephone = '555-555-5555'
33
+ self.read_only = 'Telephone area code is 555'
34
+ end
35
+
36
+ def launch
37
+ root {
38
+ title 'Hello, Entry!'
39
+
40
+ label {
41
+ grid sticky: 'ew'
42
+ text 'default entry'
43
+ }
44
+ entry {
45
+ grid sticky: 'ew'
46
+ text <=> [self, :default]
47
+ }
48
+
49
+ label {
50
+ grid sticky: 'ew'
51
+ text 'password entry'
52
+ }
53
+ entry {
54
+ grid sticky: 'ew'
55
+ show '*'
56
+ text <=> [self, :password]
57
+ }
58
+
59
+ @validated_entry_label = label {
60
+ grid sticky: 'ew'
61
+ text 'entry with event handlers'
62
+ }
63
+ entry {
64
+ grid sticky: 'ew'
65
+ text <=> [self, :telephone]
66
+ validate 'key'
67
+
68
+ ## this event kicks in just after the user typed and before modifying the text variable
69
+ on('validate') do |new_text_variable|
70
+ telephone?(new_text_variable.value)
71
+ end
72
+
73
+ ## this event kicks in just after the text variable is validated and before it is modified
74
+ on('invalid') do |validate_args|
75
+ @validated_entry_label.text = "#{validate_args.value} is not valid!"
76
+ @validated_entry_label.foreground = 'red'
77
+ end
78
+
79
+ ## this event kicks in just after the text variable is validated and modified
80
+ on('change') do |new_text_variable|
81
+ self.read_only = "Telephone area code is #{new_text_variable.value.gsub(/[^0-9]/, '')[0...3]}"
82
+ @validated_entry_label.text = 'entry with event handlers'
83
+ @validated_entry_label.foreground = nil
84
+ end
85
+ }
86
+
87
+ label {
88
+ grid sticky: 'ew'
89
+ text 'read-only entry'
90
+ }
91
+ entry {
92
+ grid sticky: 'ew'
93
+ text <=> [self, :read_only]
94
+ readonly true
95
+ }
96
+ }.open
97
+ end
98
+
99
+ def telephone?(text)
100
+ !!text.match(/^\d{0,3}[-.\/]?\d{0,3}[-.\/]?\d{0,4}$/)
101
+ end
102
+ end
103
+
104
+ HelloEntry.new.launch
@@ -0,0 +1,107 @@
1
+ # Copyright (c) 2020-2021 Andy Maleh
2
+ #
3
+ # Permission is hereby granted, free of charge, to any person obtaining
4
+ # a copy of this software and associated documentation files (the
5
+ # "Software"), to deal in the Software without restriction, including
6
+ # without limitation the rights to use, copy, modify, merge, publish,
7
+ # distribute, sublicense, and/or sell copies of the Software, and to
8
+ # permit persons to whom the Software is furnished to do so, subject to
9
+ # the following conditions:
10
+ #
11
+ # The above copyright notice and this permission notice shall be
12
+ # included in all copies or substantial portions of the Software.
13
+ #
14
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ # LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
21
+
22
+ require 'glimmer-dsl-tk'
23
+
24
+ class HelloRadiobutton
25
+ class Person
26
+ attr_accessor :male, :female, :child, :teen, :adult, :senior
27
+
28
+ def initialize
29
+ reset!
30
+ end
31
+
32
+ def reset!
33
+ self.male = true
34
+ self.female = nil
35
+ self.child = nil
36
+ self.teen = nil
37
+ self.adult = true
38
+ self.senior = nil
39
+ end
40
+ end
41
+
42
+ include Glimmer
43
+
44
+ def initialize
45
+ @person = Person.new
46
+ end
47
+
48
+ def launch
49
+ root {
50
+ title 'Hello, Radio!'
51
+
52
+ label {
53
+ text 'Gender:'
54
+ font 'caption'
55
+ }
56
+
57
+ frame {
58
+ radiobutton {
59
+ text 'Male'
60
+ variable <=> [@person, :male]
61
+ }
62
+
63
+ radiobutton {
64
+ text 'Female'
65
+ variable <=> [@person, :female]
66
+ }
67
+ }
68
+
69
+ label {
70
+ text 'Age Group:'
71
+ font 'caption'
72
+ }
73
+
74
+ frame {
75
+ radiobutton {
76
+ text 'Child'
77
+ variable <=> [@person, :child]
78
+ }
79
+
80
+ radiobutton {
81
+ text 'Teen'
82
+ variable <=> [@person, :teen]
83
+ }
84
+
85
+ radiobutton {
86
+ text 'Adult'
87
+ variable <=> [@person, :adult]
88
+ }
89
+
90
+ radiobutton {
91
+ text 'Senior'
92
+ variable <=> [@person, :senior]
93
+ }
94
+ }
95
+
96
+ button {
97
+ text 'Reset'
98
+
99
+ command do
100
+ @person.reset!
101
+ end
102
+ }
103
+ }.open
104
+ end
105
+ end
106
+
107
+ HelloRadiobutton.new.launch
@@ -0,0 +1,75 @@
1
+ # Copyright (c) 2020-2021 Andy Maleh
2
+ #
3
+ # Permission is hereby granted, free of charge, to any person obtaining
4
+ # a copy of this software and associated documentation files (the
5
+ # "Software"), to deal in the Software without restriction, including
6
+ # without limitation the rights to use, copy, modify, merge, publish,
7
+ # distribute, sublicense, and/or sell copies of the Software, and to
8
+ # permit persons to whom the Software is furnished to do so, subject to
9
+ # the following conditions:
10
+ #
11
+ # The above copyright notice and this permission notice shall be
12
+ # included in all copies or substantial portions of the Software.
13
+ #
14
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ # LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
21
+
22
+ require 'glimmer-dsl-tk'
23
+
24
+ class HelloSpinbox
25
+ class Person
26
+ attr_accessor :donation
27
+ end
28
+
29
+ include Glimmer
30
+
31
+ def initialize
32
+ @person = Person.new
33
+ @person.donation = 5.0 # in dollars
34
+ end
35
+
36
+ def launch
37
+ root {
38
+ title 'Hello, Spinbox!'
39
+
40
+ label {
41
+ text 'Please select the amount you would like to donate to the poor:'
42
+ }
43
+
44
+ frame {
45
+ label {
46
+ grid row: 0, column: 0
47
+ text 'Amount:'
48
+ font 'caption'
49
+ }
50
+
51
+ label {
52
+ grid row: 0, column: 1
53
+ text '$'
54
+ }
55
+
56
+ spinbox {
57
+ grid row: 0, column: 2
58
+ from 1.0 # minimum value
59
+ to 150.0 # maximum value
60
+ increment 5.0 # increment on up and down
61
+ format '%0.2f'
62
+ text <=> [@person, :donation]
63
+ }
64
+
65
+ label {
66
+ grid row: 1, column: 0, columnspan: 3
67
+ text <=> [@person, :donation, on_read: ->(value) { "Thank you for your donation of $#{"%.2f" % value.to_f}"}]
68
+ }
69
+
70
+ }
71
+ }.open
72
+ end
73
+ end
74
+
75
+ HelloSpinbox.new.launch
@@ -0,0 +1,101 @@
1
+ # Copyright (c) 2020-2021 Andy Maleh
2
+ #
3
+ # Permission is hereby granted, free of charge, to any person obtaining
4
+ # a copy of this software and associated documentation files (the
5
+ # "Software"), to deal in the Software without restriction, including
6
+ # without limitation the rights to use, copy, modify, merge, publish,
7
+ # distribute, sublicense, and/or sell copies of the Software, and to
8
+ # permit persons to whom the Software is furnished to do so, subject to
9
+ # the following conditions:
10
+ #
11
+ # The above copyright notice and this permission notice shall be
12
+ # included in all copies or substantial portions of the Software.
13
+ #
14
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ # LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
21
+
22
+ require 'glimmer-dsl-tk'
23
+
24
+ class HelloText
25
+ include Glimmer
26
+
27
+ COLOR_OPTIONS = %w[black purple blue green orange yellow red white].map(&:capitalize)
28
+ FOREGROUND_PROMPT = '<select foreground>'
29
+ BACKGROUND_PROMPT = '<select background>'
30
+
31
+ def initialize
32
+ @foreground = FOREGROUND_PROMPT
33
+ @background = BACKGROUND_PROMPT
34
+ end
35
+
36
+ attr_accessor :foreground
37
+
38
+ def foreground_options
39
+ [FOREGROUND_PROMPT] + COLOR_OPTIONS
40
+ end
41
+
42
+ attr_accessor :background
43
+
44
+ def background_options
45
+ [BACKGROUND_PROMPT] + COLOR_OPTIONS
46
+ end
47
+
48
+ def launch
49
+ root {
50
+ title 'Hello, Text!'
51
+
52
+ frame {
53
+ grid row: 0, column: 0
54
+
55
+ combobox {
56
+ grid row: 0, column: 0, column_weight: 1
57
+ readonly true
58
+ text <=> [self, :foreground, after_write: ->(value) { @text.add_selection_format('foreground', value == FOREGROUND_PROMPT ? 'black' : value) }]
59
+ }
60
+
61
+ combobox {
62
+ grid row: 0, column: 1, column_weight: 1
63
+ readonly true
64
+ text <=> [self, :background, after_write: ->(value) { @text.add_selection_format('background', value == BACKGROUND_PROMPT ? 'black' : value) }]
65
+ }
66
+ }
67
+
68
+ @text = text {
69
+ grid row: 1, column: 0, row_weight: 1
70
+ text <<~MULTI_LINE_STRING
71
+ According to the National Post, a heavy metal-loving high school principal in Canada will be allowed to keep her job, days after a public campaign to oust her made headlines around the globe.
72
+
73
+ Parents at Eden High School in St. Catharines, Ontario launched a petition to remove principal Sharon Burns after discovering she's an IRON MAIDEN fan.
74
+
75
+ The petition, titled "Eden High School Principal, Sharon Burns, Needs to Be Transferred Immediately!" read, "We are deeply disturbed that the principal assigned to the school blatantly showed Satanic symbols and her allegiance to Satanic practices on her public social media platforms where all the students can see them under @edenprincipal (not her personal account)."
76
+
77
+ More than 500 people signed the petition to transfer Burns after she posted a picture of herself flashing the "devil horns" hand sign with a doll of the MAIDEN zombie mascot Eddie behind her as well as a personalized license plate reading "IRNMADEN" and a handwritten note that reads "Eddie 666" on a car's dashboard.
78
+
79
+
80
+ The number 666 is used to represent the devil, and is featured prominently in MAIDEN's artwork by the band, whose classic third album is titled "The Number Of The Beast".
81
+
82
+ The petition was later updated to state that the demand for her transfer is not because of her love for metal, but for "openly displaying her own handmade sign with the 666 clearly displayed on it".
83
+
84
+ The creator of the original petition wrote: "Sharon knows full well what she did was simply inappropriate, unnecessary and not professional but has yet to publicly admit so and is willing to allow people to believe a completely different story, making very real concerns seem petty."
85
+
86
+ Meanwhile, a counter-petition supporting Burns garnered over 20,000 signatures.
87
+
88
+ "It is ridiculous that a couple of parents judge her role as a principal only based on an Instagram post. (About liking the band IRON MAIDEN. That's it.) Eden High School is a public school. Not a Christian school," the petition titled "We need Mrs Burns" stated. "She has made Eden a safe space for so many people. She spreads nothing but love and kindness."
89
+
90
+ After the complaints were aired, the District School Board of Niagara spoke with Burns and the parents who launched the petition, and the issue is over as far as the board is concerned, Kim Sweeney, the board's chief communications officer, told the National Post. No disciplinary action or policy changes were needed.
91
+
92
+ "Our belief is that taste in music is subjective and we support that both students and staff enjoy a wide variety of genres," Sweeney said.
93
+
94
+ The original petition has since been removed.
95
+ MULTI_LINE_STRING
96
+ }
97
+ }.open
98
+ end
99
+ end
100
+
101
+ HelloText.new.launch