mirror of
https://github.com/iSoron/uhabits.git
synced 2025-12-06 09:08:52 -06:00
Move tests to commonTest; convert some classes from Swift to Kotlin
This commit is contained in:
@@ -21,6 +21,11 @@ package org.isoron
|
|||||||
|
|
||||||
import org.isoron.platform.gui.*
|
import org.isoron.platform.gui.*
|
||||||
import org.isoron.platform.io.*
|
import org.isoron.platform.io.*
|
||||||
|
import org.isoron.platform.time.*
|
||||||
|
|
||||||
|
enum class Locale {
|
||||||
|
US, JAPAN
|
||||||
|
}
|
||||||
|
|
||||||
interface CanvasHelper {
|
interface CanvasHelper {
|
||||||
fun createCanvas(width: Int, height: Int): Canvas
|
fun createCanvas(width: Int, height: Int): Canvas
|
||||||
@@ -28,7 +33,10 @@ interface CanvasHelper {
|
|||||||
}
|
}
|
||||||
|
|
||||||
expect object DependencyResolver {
|
expect object DependencyResolver {
|
||||||
|
val supportsDatabaseTests: Boolean
|
||||||
|
val supportsCanvasTests: Boolean
|
||||||
suspend fun getFileOpener(): FileOpener
|
suspend fun getFileOpener(): FileOpener
|
||||||
suspend fun getDatabase(): Database
|
suspend fun getDatabase(): Database
|
||||||
fun getCanvasHelper(): CanvasHelper
|
fun getCanvasHelper(): CanvasHelper
|
||||||
|
fun getDateFormatter(locale: Locale): LocalDateFormatter
|
||||||
}
|
}
|
||||||
@@ -25,6 +25,7 @@ import kotlin.test.*
|
|||||||
class CanvasTest {
|
class CanvasTest {
|
||||||
@Test
|
@Test
|
||||||
fun run() {
|
fun run() {
|
||||||
|
if (!DependencyResolver.supportsCanvasTests) return
|
||||||
val helper = DependencyResolver.getCanvasHelper()
|
val helper = DependencyResolver.getCanvasHelper()
|
||||||
val canvas = helper.createCanvas(500, 400)
|
val canvas = helper.createCanvas(500, 400)
|
||||||
|
|
||||||
|
|||||||
@@ -26,6 +26,7 @@ class DatabaseTest {
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
fun testUsage() = asyncTest{
|
fun testUsage() = asyncTest{
|
||||||
|
if (!DependencyResolver.supportsDatabaseTests) return@asyncTest
|
||||||
val db = DependencyResolver.getDatabase()
|
val db = DependencyResolver.getDatabase()
|
||||||
|
|
||||||
db.setVersion(0)
|
db.setVersion(0)
|
||||||
|
|||||||
@@ -17,14 +17,10 @@
|
|||||||
* with this program. If not, see <http://www.gnu.org/licenses/>.
|
* with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package org.isoron.platform
|
package org.isoron.platform.time
|
||||||
|
|
||||||
import junit.framework.TestCase.*
|
|
||||||
import org.isoron.platform.time.*
|
|
||||||
import org.junit.*
|
|
||||||
import java.util.*
|
|
||||||
import java.util.Calendar.*
|
|
||||||
|
|
||||||
|
import org.isoron.*
|
||||||
|
import kotlin.test.*
|
||||||
|
|
||||||
class DatesTest {
|
class DatesTest {
|
||||||
private val d1 = LocalDate(2019, 3, 25)
|
private val d1 = LocalDate(2019, 3, 25)
|
||||||
@@ -32,7 +28,7 @@ class DatesTest {
|
|||||||
private val d3 = LocalDate(2019, 5, 12)
|
private val d3 = LocalDate(2019, 5, 12)
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
fun plusMinusDays() {
|
fun testPlusMinusDays() {
|
||||||
val today = LocalDate(2019, 3, 25)
|
val today = LocalDate(2019, 3, 25)
|
||||||
assertEquals(today.minus(28), LocalDate(2019, 2, 25))
|
assertEquals(today.minus(28), LocalDate(2019, 2, 25))
|
||||||
assertEquals(today.plus(7), LocalDate(2019, 4, 1))
|
assertEquals(today.plus(7), LocalDate(2019, 4, 1))
|
||||||
@@ -40,8 +36,8 @@ class DatesTest {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
fun shortMonthName() {
|
fun testFormatter() {
|
||||||
var fmt = JavaLocalDateFormatter(Locale.US)
|
var fmt = DependencyResolver.getDateFormatter(Locale.US)
|
||||||
assertEquals("Mon", fmt.shortWeekdayName(d1))
|
assertEquals("Mon", fmt.shortWeekdayName(d1))
|
||||||
assertEquals("Thu", fmt.shortWeekdayName(d2))
|
assertEquals("Thu", fmt.shortWeekdayName(d2))
|
||||||
assertEquals("Sun", fmt.shortWeekdayName(d3))
|
assertEquals("Sun", fmt.shortWeekdayName(d3))
|
||||||
@@ -49,7 +45,7 @@ class DatesTest {
|
|||||||
assertEquals("Apr", fmt.shortMonthName(d2))
|
assertEquals("Apr", fmt.shortMonthName(d2))
|
||||||
assertEquals("May", fmt.shortMonthName(d3))
|
assertEquals("May", fmt.shortMonthName(d3))
|
||||||
|
|
||||||
fmt = JavaLocalDateFormatter(Locale.JAPAN)
|
fmt = DependencyResolver.getDateFormatter(Locale.JAPAN)
|
||||||
assertEquals("月", fmt.shortWeekdayName(d1))
|
assertEquals("月", fmt.shortWeekdayName(d1))
|
||||||
assertEquals("木", fmt.shortWeekdayName(d2))
|
assertEquals("木", fmt.shortWeekdayName(d2))
|
||||||
assertEquals("日", fmt.shortWeekdayName(d3))
|
assertEquals("日", fmt.shortWeekdayName(d3))
|
||||||
@@ -59,13 +55,7 @@ class DatesTest {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
fun weekDay() {
|
fun testTimestamps() {
|
||||||
assertEquals(DayOfWeek.SUNDAY, LocalDate(2015, 1, 25).dayOfWeek)
|
|
||||||
assertEquals(DayOfWeek.MONDAY, LocalDate(2017, 7, 3).dayOfWeek)
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
fun timestamps() {
|
|
||||||
val timestamps = listOf(Timestamp(1555977600000),
|
val timestamps = listOf(Timestamp(1555977600000),
|
||||||
Timestamp(968716800000),
|
Timestamp(968716800000),
|
||||||
Timestamp(946684800000))
|
Timestamp(946684800000))
|
||||||
@@ -77,7 +67,7 @@ class DatesTest {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
fun isOlderThan() {
|
fun testIsOlderThan() {
|
||||||
val ref = LocalDate(2010, 10, 5)
|
val ref = LocalDate(2010, 10, 5)
|
||||||
assertTrue(ref.isOlderThan(LocalDate(2010, 10, 10)))
|
assertTrue(ref.isOlderThan(LocalDate(2010, 10, 10)))
|
||||||
assertTrue(ref.isOlderThan(LocalDate(2010, 11, 4)))
|
assertTrue(ref.isOlderThan(LocalDate(2010, 11, 4)))
|
||||||
@@ -104,39 +94,49 @@ class DatesTest {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
fun gregorianCalendarConversion() {
|
fun testGregorianCalendarConversion() {
|
||||||
fun check(cal: GregorianCalendar, daysSince2000: Int) {
|
fun check(daysSince2000: Int,
|
||||||
val year = cal.get(YEAR)
|
expectedYear: Int,
|
||||||
val month = cal.get(MONTH) + 1
|
expectedMonth: Int,
|
||||||
val day = cal.get(DAY_OF_MONTH)
|
expectedDay: Int,
|
||||||
val weekday = cal.get(DAY_OF_WEEK)
|
expectedWeekday: Int) {
|
||||||
val date = LocalDate(year, month, day)
|
val date = LocalDate(daysSince2000)
|
||||||
val millisSince1970 = cal.timeInMillis
|
assertEquals(expectedYear, date.year)
|
||||||
val msg = "date=$year-$month-$day offset=$daysSince2000"
|
assertEquals(expectedMonth, date.month)
|
||||||
|
assertEquals(expectedDay, date.day)
|
||||||
assertEquals(msg, daysSince2000, date.daysSince2000)
|
assertEquals(expectedWeekday, date.dayOfWeek.index)
|
||||||
assertEquals(msg, year, date.year)
|
assertEquals(date, date.timestamp.localDate)
|
||||||
assertEquals(msg, month, date.month)
|
|
||||||
assertEquals(msg, day, date.day)
|
|
||||||
assertEquals(msg, weekday, date.dayOfWeek.index + 1)
|
|
||||||
assertEquals(msg, millisSince1970, date.timestamp.millisSince1970)
|
|
||||||
assertEquals(msg, date, date.timestamp.localDate)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
val cal = GregorianCalendar()
|
check(0, 2000, 1, 1, 6)
|
||||||
cal.timeZone = TimeZone.getTimeZone("GMT")
|
check(626, 2001, 9, 18, 2)
|
||||||
cal.set(MILLISECOND, 0)
|
check(915, 2002, 7, 4, 4)
|
||||||
cal.set(SECOND, 0)
|
check(2759, 2007, 7, 22, 0)
|
||||||
cal.set(MINUTE, 0)
|
check(2791, 2007, 8, 23, 4)
|
||||||
cal.set(HOUR_OF_DAY, 0)
|
check(6524, 2017, 11, 11, 6)
|
||||||
cal.set(DAY_OF_MONTH, 1)
|
check(7517, 2020, 7, 31, 5)
|
||||||
cal.set(MONTH, 0)
|
check(10031, 2027, 6, 19, 6)
|
||||||
cal.set(YEAR, 2000)
|
check(13091, 2035, 11, 4, 0)
|
||||||
|
check(14849, 2040, 8, 27, 1)
|
||||||
// Check all dates from year 2000 until 2400
|
check(17330, 2047, 6, 13, 4)
|
||||||
for(offset in 0..146097) {
|
check(20566, 2056, 4, 22, 6)
|
||||||
check(cal, offset)
|
check(23617, 2064, 8, 29, 5)
|
||||||
cal.add(DAY_OF_YEAR, 1)
|
check(27743, 2075, 12, 16, 1)
|
||||||
}
|
check(31742, 2086, 11, 27, 3)
|
||||||
|
check(36659, 2100, 5, 15, 6)
|
||||||
|
check(39224, 2107, 5, 24, 2)
|
||||||
|
check(39896, 2109, 3, 26, 2)
|
||||||
|
check(40819, 2111, 10, 5, 1)
|
||||||
|
check(43983, 2120, 6, 3, 1)
|
||||||
|
check(46893, 2128, 5, 22, 6)
|
||||||
|
check(51013, 2139, 9, 2, 3)
|
||||||
|
check(55542, 2152, 1, 26, 3)
|
||||||
|
check(58817, 2161, 1, 13, 2)
|
||||||
|
check(63769, 2174, 8, 5, 5)
|
||||||
|
check(64893, 2177, 9, 2, 2)
|
||||||
|
check(66840, 2183, 1, 1, 3)
|
||||||
|
check(68011, 2186, 3, 17, 5)
|
||||||
|
check(70060, 2191, 10, 26, 3)
|
||||||
|
check(70733, 2193, 8, 29, 4)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -28,6 +28,7 @@ import kotlin.test.*
|
|||||||
class CheckmarkRepositoryTest() {
|
class CheckmarkRepositoryTest() {
|
||||||
@Test
|
@Test
|
||||||
fun testCRUD() = asyncTest {
|
fun testCRUD() = asyncTest {
|
||||||
|
if (!DependencyResolver.supportsDatabaseTests) return@asyncTest
|
||||||
val db = DependencyResolver.getDatabase()
|
val db = DependencyResolver.getDatabase()
|
||||||
|
|
||||||
val habitA = 10
|
val habitA = 10
|
||||||
|
|||||||
@@ -26,6 +26,7 @@ import kotlin.test.*
|
|||||||
class HabitRepositoryTest() {
|
class HabitRepositoryTest() {
|
||||||
@Test
|
@Test
|
||||||
fun testCRUD() = asyncTest{
|
fun testCRUD() = asyncTest{
|
||||||
|
if (!DependencyResolver.supportsDatabaseTests) return@asyncTest
|
||||||
val db = DependencyResolver.getDatabase()
|
val db = DependencyResolver.getDatabase()
|
||||||
val original0 = Habit(id = 0,
|
val original0 = Habit(id = 0,
|
||||||
name = "Wake up early",
|
name = "Wake up early",
|
||||||
|
|||||||
@@ -26,6 +26,7 @@ import kotlin.test.*
|
|||||||
class PreferencesRepositoryTest() {
|
class PreferencesRepositoryTest() {
|
||||||
@Test
|
@Test
|
||||||
fun testUsage() = asyncTest{
|
fun testUsage() = asyncTest{
|
||||||
|
if (!DependencyResolver.supportsDatabaseTests) return@asyncTest
|
||||||
val db = DependencyResolver.getDatabase()
|
val db = DependencyResolver.getDatabase()
|
||||||
val prefs = PreferencesRepository(db)
|
val prefs = PreferencesRepository(db)
|
||||||
assertEquals("default", prefs.getString("non_existing_key", "default"))
|
assertEquals("default", prefs.getString("non_existing_key", "default"))
|
||||||
|
|||||||
55
core/src/iosMain/kotlin/org/isoron/platform/time/IosDates.kt
Normal file
55
core/src/iosMain/kotlin/org/isoron/platform/time/IosDates.kt
Normal file
@@ -0,0 +1,55 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2016-2019 Álinson Santos Xavier <isoron@gmail.com>
|
||||||
|
*
|
||||||
|
* This file is part of Loop Habit Tracker.
|
||||||
|
*
|
||||||
|
* Loop Habit Tracker is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by the
|
||||||
|
* Free Software Foundation, either version 3 of the License, or (at your
|
||||||
|
* option) any later version.
|
||||||
|
*
|
||||||
|
* Loop Habit Tracker is distributed in the hope that it will be useful, but
|
||||||
|
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
||||||
|
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||||
|
* more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License along
|
||||||
|
* with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.isoron.platform.time
|
||||||
|
|
||||||
|
import platform.Foundation.*
|
||||||
|
|
||||||
|
fun LocalDate.toNsDate(): NSDate {
|
||||||
|
val calendar = NSCalendar.calendarWithIdentifier(NSCalendarIdentifierGregorian)!!
|
||||||
|
val dc = NSDateComponents()
|
||||||
|
dc.year = year.toLong()
|
||||||
|
dc.month = month.toLong()
|
||||||
|
dc.day = day.toLong()
|
||||||
|
dc.hour = 13
|
||||||
|
dc.minute = 0
|
||||||
|
return calendar.dateFromComponents(dc)!!
|
||||||
|
}
|
||||||
|
|
||||||
|
class IosLocalDateFormatter(val locale: String) : LocalDateFormatter {
|
||||||
|
|
||||||
|
constructor() : this(NSLocale.preferredLanguages[0] as String)
|
||||||
|
|
||||||
|
private val fmt = NSDateFormatter()
|
||||||
|
|
||||||
|
init {
|
||||||
|
fmt.setLocale(NSLocale.localeWithLocaleIdentifier(locale))
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun shortWeekdayName(date: LocalDate): String {
|
||||||
|
fmt.dateFormat = "EEE"
|
||||||
|
return fmt.stringFromDate(date.toNsDate())
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun shortMonthName(date: LocalDate): String {
|
||||||
|
fmt.dateFormat = "MMM"
|
||||||
|
return fmt.stringFromDate(date.toNsDate())
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,67 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2016-2019 Álinson Santos Xavier <isoron@gmail.com>
|
||||||
|
*
|
||||||
|
* This file is part of Loop Habit Tracker.
|
||||||
|
*
|
||||||
|
* Loop Habit Tracker is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by the
|
||||||
|
* Free Software Foundation, either version 3 of the License, or (at your
|
||||||
|
* option) any later version.
|
||||||
|
*
|
||||||
|
* Loop Habit Tracker is distributed in the hope that it will be useful, but
|
||||||
|
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
||||||
|
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||||
|
* more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License along
|
||||||
|
* with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
@file:Suppress("UNCHECKED_CAST")
|
||||||
|
|
||||||
|
package org.isoron.uhabits
|
||||||
|
|
||||||
|
import org.isoron.platform.io.*
|
||||||
|
import org.isoron.uhabits.i18n.*
|
||||||
|
import platform.Foundation.*
|
||||||
|
|
||||||
|
class IosLocaleHelper(private val log: Log) : LocaleHelper {
|
||||||
|
override fun getStringsForCurrentLocale(): Strings {
|
||||||
|
val pref = NSLocale.preferredLanguages as List<String>
|
||||||
|
val lang = if (pref.isEmpty()) "en-US" else pref[0]
|
||||||
|
log.info("IosLocaleHelper", lang)
|
||||||
|
return when {
|
||||||
|
lang.startsWith("ar") -> StringsArabic()
|
||||||
|
lang.startsWith("ca") -> StringsCatalan()
|
||||||
|
lang.startsWith("cs") -> StringsCzech()
|
||||||
|
lang.startsWith("da") -> StringsDanish()
|
||||||
|
lang.startsWith("de") -> StringsGerman()
|
||||||
|
lang.startsWith("el") -> StringsGreek()
|
||||||
|
lang.startsWith("es") -> StringsSpanish()
|
||||||
|
lang.startsWith("fi") -> StringsFinnish()
|
||||||
|
lang.startsWith("fr") -> StringsFrench()
|
||||||
|
lang.startsWith("he") -> StringsHebrew()
|
||||||
|
lang.startsWith("hi") -> StringsHindi()
|
||||||
|
lang.startsWith("hr") -> StringsCroatian()
|
||||||
|
lang.startsWith("hu") -> StringsHungarian()
|
||||||
|
lang.startsWith("id") -> StringsIndonesian()
|
||||||
|
lang.startsWith("it") -> StringsItalian()
|
||||||
|
lang.startsWith("ja") -> StringsJapanese()
|
||||||
|
lang.startsWith("ko") -> StringsKorean()
|
||||||
|
lang.startsWith("nb") -> StringsNorwegian()
|
||||||
|
lang.startsWith("nl") -> StringsDutch()
|
||||||
|
lang.startsWith("pl") -> StringsPolish()
|
||||||
|
lang.startsWith("pt-BR") -> StringsPortugueseBR()
|
||||||
|
lang.startsWith("pt") -> StringsPortuguesePT()
|
||||||
|
lang.startsWith("ro") -> StringsRomanian()
|
||||||
|
lang.startsWith("ru") -> StringsRussian()
|
||||||
|
lang.startsWith("sk") -> StringsSlovak()
|
||||||
|
lang.startsWith("sv") -> StringsSwedish()
|
||||||
|
lang.startsWith("tr") -> StringsTurkish()
|
||||||
|
lang.startsWith("vi") -> StringsVietnamese()
|
||||||
|
lang.startsWith("zh-Hans") -> StringsChineseCN()
|
||||||
|
lang.startsWith("zh-Hant") -> StringsChineseTW()
|
||||||
|
else -> Strings()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -20,12 +20,22 @@
|
|||||||
package org.isoron
|
package org.isoron
|
||||||
|
|
||||||
import org.isoron.platform.io.*
|
import org.isoron.platform.io.*
|
||||||
|
import org.isoron.platform.time.*
|
||||||
|
|
||||||
actual object DependencyResolver {
|
actual object DependencyResolver {
|
||||||
actual suspend fun getFileOpener(): FileOpener = IosFileOpener()
|
actual suspend fun getFileOpener(): FileOpener = IosFileOpener()
|
||||||
|
|
||||||
|
actual fun getDateFormatter(locale: Locale): LocalDateFormatter {
|
||||||
|
return when(locale) {
|
||||||
|
Locale.US -> IosLocalDateFormatter("en-US")
|
||||||
|
Locale.JAPAN -> IosLocalDateFormatter("ja-JP")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// IosDatabase and IosCanvas are currently implemented in Swift, so we
|
// IosDatabase and IosCanvas are currently implemented in Swift, so we
|
||||||
// cannot test these classes here.
|
// cannot test these classes here. The tests will be skipped.
|
||||||
actual suspend fun getDatabase(): Database = TODO()
|
actual suspend fun getDatabase(): Database = TODO()
|
||||||
actual fun getCanvasHelper(): CanvasHelper = TODO()
|
actual fun getCanvasHelper(): CanvasHelper = TODO()
|
||||||
|
actual val supportsDatabaseTests = false
|
||||||
|
actual val supportsCanvasTests = false
|
||||||
}
|
}
|
||||||
@@ -17,17 +17,22 @@
|
|||||||
* with this program. If not, see <http://www.gnu.org/licenses/>.
|
* with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import UIKit
|
package org.isoron.platform.time
|
||||||
|
|
||||||
extension Color {
|
import kotlin.js.*
|
||||||
var uicolor: UIColor {
|
|
||||||
return UIColor(red: CGFloat(self.red),
|
fun LocalDate.toJsDate(): Date {
|
||||||
green: CGFloat(self.green),
|
return Date(year, month - 1, day)
|
||||||
blue: CGFloat(self.blue),
|
|
||||||
alpha: CGFloat(self.alpha))
|
|
||||||
}
|
|
||||||
|
|
||||||
var cgcolor : CGColor {
|
|
||||||
return uicolor.cgColor
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
class JsDateFormatter(private val locale: String) : LocalDateFormatter {
|
||||||
|
override fun shortWeekdayName(date: LocalDate): String {
|
||||||
|
val options = dateLocaleOptions { weekday = "short" }
|
||||||
|
return date.toJsDate().toLocaleString(locale, options)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun shortMonthName(date: LocalDate): String {
|
||||||
|
val options = dateLocaleOptions { month = "short" }
|
||||||
|
return date.toJsDate().toLocaleString(locale, options)
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -21,12 +21,14 @@ package org.isoron
|
|||||||
|
|
||||||
import org.isoron.platform.gui.*
|
import org.isoron.platform.gui.*
|
||||||
import org.isoron.platform.io.*
|
import org.isoron.platform.io.*
|
||||||
|
import org.isoron.platform.time.*
|
||||||
import org.isoron.uhabits.*
|
import org.isoron.uhabits.*
|
||||||
import org.w3c.dom.*
|
import org.w3c.dom.*
|
||||||
import kotlin.browser.*
|
import kotlin.browser.*
|
||||||
|
|
||||||
actual object DependencyResolver {
|
actual object DependencyResolver {
|
||||||
|
actual val supportsDatabaseTests = true
|
||||||
|
actual val supportsCanvasTests = true
|
||||||
var fileOpener: JsFileOpener? = null
|
var fileOpener: JsFileOpener? = null
|
||||||
|
|
||||||
actual suspend fun getFileOpener(): FileOpener {
|
actual suspend fun getFileOpener(): FileOpener {
|
||||||
@@ -48,6 +50,13 @@ actual object DependencyResolver {
|
|||||||
actual fun getCanvasHelper(): CanvasHelper {
|
actual fun getCanvasHelper(): CanvasHelper {
|
||||||
return JsCanvasHelper()
|
return JsCanvasHelper()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
actual fun getDateFormatter(locale: Locale): LocalDateFormatter {
|
||||||
|
return when(locale) {
|
||||||
|
Locale.US -> JsDateFormatter("en-US")
|
||||||
|
Locale.JAPAN -> JsDateFormatter("ja-JP")
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
class JsCanvasHelper : CanvasHelper {
|
class JsCanvasHelper : CanvasHelper {
|
||||||
|
|||||||
@@ -22,7 +22,6 @@ package org.isoron.platform.time
|
|||||||
import java.util.*
|
import java.util.*
|
||||||
import java.util.Calendar.*
|
import java.util.Calendar.*
|
||||||
|
|
||||||
|
|
||||||
fun LocalDate.toGregorianCalendar(): GregorianCalendar {
|
fun LocalDate.toGregorianCalendar(): GregorianCalendar {
|
||||||
val cal = GregorianCalendar()
|
val cal = GregorianCalendar()
|
||||||
cal.timeZone = TimeZone.getTimeZone("GMT")
|
cal.timeZone = TimeZone.getTimeZone("GMT")
|
||||||
@@ -36,12 +35,6 @@ fun LocalDate.toGregorianCalendar(): GregorianCalendar {
|
|||||||
return cal
|
return cal
|
||||||
}
|
}
|
||||||
|
|
||||||
fun GregorianCalendar.toLocalDate(): LocalDate {
|
|
||||||
return LocalDate(this.get(YEAR),
|
|
||||||
this.get(MONTH) + 1,
|
|
||||||
this.get(DAY_OF_MONTH))
|
|
||||||
}
|
|
||||||
|
|
||||||
class JavaLocalDateFormatter(private val locale: Locale) : LocalDateFormatter {
|
class JavaLocalDateFormatter(private val locale: Locale) : LocalDateFormatter {
|
||||||
override fun shortMonthName(date: LocalDate): String {
|
override fun shortMonthName(date: LocalDate): String {
|
||||||
val cal = date.toGregorianCalendar()
|
val cal = date.toGregorianCalendar()
|
||||||
|
|||||||
@@ -21,12 +21,16 @@ package org.isoron
|
|||||||
|
|
||||||
import org.isoron.platform.gui.*
|
import org.isoron.platform.gui.*
|
||||||
import org.isoron.platform.io.*
|
import org.isoron.platform.io.*
|
||||||
|
import org.isoron.platform.time.*
|
||||||
import org.isoron.uhabits.*
|
import org.isoron.uhabits.*
|
||||||
import java.awt.image.*
|
import java.awt.image.*
|
||||||
import java.io.*
|
import java.io.*
|
||||||
import javax.imageio.*
|
import javax.imageio.*
|
||||||
|
|
||||||
actual object DependencyResolver {
|
actual object DependencyResolver {
|
||||||
|
actual val supportsDatabaseTests = true
|
||||||
|
actual val supportsCanvasTests = true
|
||||||
|
|
||||||
actual suspend fun getFileOpener(): FileOpener = JavaFileOpener()
|
actual suspend fun getFileOpener(): FileOpener = JavaFileOpener()
|
||||||
actual fun getCanvasHelper(): CanvasHelper = JavaCanvasHelper()
|
actual fun getCanvasHelper(): CanvasHelper = JavaCanvasHelper()
|
||||||
|
|
||||||
@@ -42,6 +46,12 @@ actual object DependencyResolver {
|
|||||||
return db
|
return db
|
||||||
}
|
}
|
||||||
|
|
||||||
|
actual fun getDateFormatter(locale: Locale): LocalDateFormatter {
|
||||||
|
return when(locale) {
|
||||||
|
Locale.US -> JavaLocalDateFormatter(java.util.Locale.US)
|
||||||
|
Locale.JAPAN -> JavaLocalDateFormatter(java.util.Locale.JAPAN)
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
class JavaCanvasHelper : CanvasHelper {
|
class JavaCanvasHelper : CanvasHelper {
|
||||||
|
|||||||
@@ -32,7 +32,7 @@ import UIKit
|
|||||||
backend = Backend(databaseName: "uhabits.db",
|
backend = Backend(databaseName: "uhabits.db",
|
||||||
databaseOpener: IosDatabaseOpener(withLog: log),
|
databaseOpener: IosDatabaseOpener(withLog: log),
|
||||||
fileOpener: IosFileOpener(),
|
fileOpener: IosFileOpener(),
|
||||||
localeHelper: IosLocaleHelper(NSLocale.preferredLanguages),
|
localeHelper: IosLocaleHelper(log: log),
|
||||||
log: log,
|
log: log,
|
||||||
scope: UIDispatcher())
|
scope: UIDispatcher())
|
||||||
|
|
||||||
|
|||||||
@@ -19,6 +19,19 @@
|
|||||||
|
|
||||||
import UIKit
|
import UIKit
|
||||||
|
|
||||||
|
extension Color {
|
||||||
|
var uicolor: UIColor {
|
||||||
|
return UIColor(red: CGFloat(self.red),
|
||||||
|
green: CGFloat(self.green),
|
||||||
|
blue: CGFloat(self.blue),
|
||||||
|
alpha: CGFloat(self.alpha))
|
||||||
|
}
|
||||||
|
|
||||||
|
var cgcolor : CGColor {
|
||||||
|
return uicolor.cgColor
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
class ComponentView : UIView {
|
class ComponentView : UIView {
|
||||||
var component: Component?
|
var component: Component?
|
||||||
|
|
||||||
|
|||||||
@@ -1,60 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (C) 2016-2019 Álinson Santos Xavier <isoron@gmail.com>
|
|
||||||
*
|
|
||||||
* This file is part of Loop Habit Tracker.
|
|
||||||
*
|
|
||||||
* Loop Habit Tracker is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License as published by the
|
|
||||||
* Free Software Foundation, either version 3 of the License, or (at your
|
|
||||||
* option) any later version.
|
|
||||||
*
|
|
||||||
* Loop Habit Tracker is distributed in the hope that it will be useful, but
|
|
||||||
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
|
||||||
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
|
||||||
* more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License along
|
|
||||||
* with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
import Foundation
|
|
||||||
|
|
||||||
extension LocalDate {
|
|
||||||
var iosDate : Date {
|
|
||||||
let calendar = Calendar(identifier: .gregorian)
|
|
||||||
var dc = DateComponents()
|
|
||||||
dc.year = Int(self.year)
|
|
||||||
dc.month = Int(self.month)
|
|
||||||
dc.day = Int(self.day)
|
|
||||||
dc.hour = 13
|
|
||||||
dc.minute = 0
|
|
||||||
return calendar.date(from: dc)!
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
extension Date {
|
|
||||||
var localDate : LocalDate {
|
|
||||||
let calendar = Calendar(identifier: .gregorian)
|
|
||||||
return LocalDate(year: Int32(calendar.component(.year, from: self)),
|
|
||||||
month: Int32(calendar.component(.month, from: self)),
|
|
||||||
day: Int32(calendar.component(.day, from: self)))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class IosLocalDateFormatter : NSObject, LocalDateFormatter {
|
|
||||||
let fmt = DateFormatter()
|
|
||||||
|
|
||||||
override init() {
|
|
||||||
fmt.locale = Locale(identifier: NSLocale.preferredLanguages.first!)
|
|
||||||
}
|
|
||||||
|
|
||||||
func shortMonthName(date: LocalDate) -> String {
|
|
||||||
fmt.dateFormat = "MMM"
|
|
||||||
return fmt.string(from: date.iosDate)
|
|
||||||
}
|
|
||||||
|
|
||||||
func shortWeekdayName(date: LocalDate) -> String {
|
|
||||||
fmt.dateFormat = "EEE"
|
|
||||||
return fmt.string(from: date.iosDate)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,64 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (C) 2016-2019 Álinson Santos Xavier <isoron@gmail.com>
|
|
||||||
*
|
|
||||||
* This file is part of Loop Habit Tracker.
|
|
||||||
*
|
|
||||||
* Loop Habit Tracker is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License as published by the
|
|
||||||
* Free Software Foundation, either version 3 of the License, or (at your
|
|
||||||
* option) any later version.
|
|
||||||
*
|
|
||||||
* Loop Habit Tracker is distributed in the hope that it will be useful, but
|
|
||||||
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
|
||||||
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
|
||||||
* more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License along
|
|
||||||
* with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
import Foundation
|
|
||||||
|
|
||||||
class IosLocaleHelper : NSObject, LocaleHelper {
|
|
||||||
var preferredLanguages: [String]
|
|
||||||
|
|
||||||
init(_ preferredLanguages: [String]) {
|
|
||||||
self.preferredLanguages = preferredLanguages
|
|
||||||
}
|
|
||||||
|
|
||||||
func getStringsForCurrentLocale() -> Strings {
|
|
||||||
let lang = preferredLanguages.first ?? "en-US"
|
|
||||||
StandardLog().debug(tag: "IosLocale", msg: lang)
|
|
||||||
if lang.hasPrefix("ar") { return StringsArabic() }
|
|
||||||
if lang.hasPrefix("fr") { return StringsFrench() }
|
|
||||||
if lang.hasPrefix("es") { return StringsSpanish() }
|
|
||||||
if lang.hasPrefix("pt-BR") { return StringsPortugueseBR() }
|
|
||||||
if lang.hasPrefix("pt") { return StringsPortuguesePT() }
|
|
||||||
if lang.hasPrefix("it") { return StringsItalian() }
|
|
||||||
if lang.hasPrefix("de") { return StringsGerman() }
|
|
||||||
if lang.hasPrefix("zh-Hans") { return StringsChineseCN() }
|
|
||||||
if lang.hasPrefix("zh-Hant") { return StringsChineseTW() }
|
|
||||||
if lang.hasPrefix("nl") { return StringsDutch() }
|
|
||||||
if lang.hasPrefix("ja") { return StringsJapanese() }
|
|
||||||
if lang.hasPrefix("ko") { return StringsKorean() }
|
|
||||||
if lang.hasPrefix("vi") { return StringsVietnamese() }
|
|
||||||
if lang.hasPrefix("ru") { return StringsRussian() }
|
|
||||||
if lang.hasPrefix("sv") { return StringsSwedish() }
|
|
||||||
if lang.hasPrefix("da") { return StringsDanish() }
|
|
||||||
if lang.hasPrefix("fi") { return StringsFinnish() }
|
|
||||||
if lang.hasPrefix("nb") { return StringsNorwegian() }
|
|
||||||
if lang.hasPrefix("tr") { return StringsTurkish() }
|
|
||||||
if lang.hasPrefix("el") { return StringsGreek() }
|
|
||||||
if lang.hasPrefix("id") { return StringsIndonesian() }
|
|
||||||
if lang.hasPrefix("hi") { return StringsHindi() }
|
|
||||||
if lang.hasPrefix("hu") { return StringsHungarian() }
|
|
||||||
if lang.hasPrefix("pl") { return StringsPolish() }
|
|
||||||
if lang.hasPrefix("cs") { return StringsCzech() }
|
|
||||||
if lang.hasPrefix("sk") { return StringsSlovak() }
|
|
||||||
if lang.hasPrefix("ca") { return StringsCatalan() }
|
|
||||||
if lang.hasPrefix("ro") { return StringsRomanian() }
|
|
||||||
if lang.hasPrefix("hr") { return StringsCroatian() }
|
|
||||||
if lang.hasPrefix("he") { return StringsHebrew() }
|
|
||||||
return Strings()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,35 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (C) 2016-2019 Álinson Santos Xavier <isoron@gmail.com>
|
|
||||||
*
|
|
||||||
* This file is part of Loop Habit Tracker.
|
|
||||||
*
|
|
||||||
* Loop Habit Tracker is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License as published by the
|
|
||||||
* Free Software Foundation, either version 3 of the License, or (at your
|
|
||||||
* option) any later version.
|
|
||||||
*
|
|
||||||
* Loop Habit Tracker is distributed in the hope that it will be useful, but
|
|
||||||
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
|
||||||
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
|
||||||
* more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License along
|
|
||||||
* with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
import XCTest
|
|
||||||
import UIKit
|
|
||||||
|
|
||||||
@testable import uhabits
|
|
||||||
|
|
||||||
class IosDateFormatterTest : XCTestCase {
|
|
||||||
func testShortMonthName() {
|
|
||||||
let fmt = IosLocalDateFormatter()
|
|
||||||
let d1 = LocalDate(year: 2019, month: 3, day: 25)
|
|
||||||
let d2 = LocalDate(year: 2019, month: 4, day: 4)
|
|
||||||
let d3 = LocalDate(year: 2019, month: 5, day: 12)
|
|
||||||
XCTAssertEqual(fmt.shortWeekdayName(date: d1), "Mon")
|
|
||||||
XCTAssertEqual(fmt.shortWeekdayName(date: d2), "Thu")
|
|
||||||
XCTAssertEqual(fmt.shortWeekdayName(date: d3), "Sun")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -8,7 +8,6 @@
|
|||||||
|
|
||||||
/* Begin PBXBuildFile section */
|
/* Begin PBXBuildFile section */
|
||||||
001592642260AE0F00D2814F /* main.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C0C6C92246E543003D8AF0 /* main.framework */; };
|
001592642260AE0F00D2814F /* main.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C0C6C92246E543003D8AF0 /* main.framework */; };
|
||||||
006EFE4E2252EA2B008464E0 /* IosLocale.swift in Sources */ = {isa = PBXBuildFile; fileRef = 006EFE4D2252EA2B008464E0 /* IosLocale.swift */; };
|
|
||||||
006EFE50225432B8008464E0 /* AboutScreenController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 006EFE4F225432B8008464E0 /* AboutScreenController.swift */; };
|
006EFE50225432B8008464E0 /* AboutScreenController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 006EFE4F225432B8008464E0 /* AboutScreenController.swift */; };
|
||||||
00A5B42822009F590024E00C /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 00A5B42722009F590024E00C /* AppDelegate.swift */; };
|
00A5B42822009F590024E00C /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 00A5B42722009F590024E00C /* AppDelegate.swift */; };
|
||||||
00A5B42A22009F590024E00C /* MainScreenController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 00A5B42922009F590024E00C /* MainScreenController.swift */; };
|
00A5B42A22009F590024E00C /* MainScreenController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 00A5B42922009F590024E00C /* MainScreenController.swift */; };
|
||||||
@@ -20,11 +19,8 @@
|
|||||||
00C0C6BF22465F65003D8AF0 /* migrations in Resources */ = {isa = PBXBuildFile; fileRef = 00C0C6BC22465F65003D8AF0 /* migrations */; };
|
00C0C6BF22465F65003D8AF0 /* migrations in Resources */ = {isa = PBXBuildFile; fileRef = 00C0C6BC22465F65003D8AF0 /* migrations */; };
|
||||||
00C0C6CA2246E543003D8AF0 /* main.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C0C6C92246E543003D8AF0 /* main.framework */; };
|
00C0C6CA2246E543003D8AF0 /* main.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C0C6C92246E543003D8AF0 /* main.framework */; };
|
||||||
00C0C6CC2246E550003D8AF0 /* main.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 00C0C6C92246E543003D8AF0 /* main.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
|
00C0C6CC2246E550003D8AF0 /* main.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 00C0C6C92246E543003D8AF0 /* main.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
|
||||||
00C0C6CE2246EFB3003D8AF0 /* IosExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 00C0C6CD2246EFB3003D8AF0 /* IosExtensions.swift */; };
|
|
||||||
00C0C6D122470705003D8AF0 /* IosCanvas.swift in Sources */ = {isa = PBXBuildFile; fileRef = 00C0C6D022470705003D8AF0 /* IosCanvas.swift */; };
|
00C0C6D122470705003D8AF0 /* IosCanvas.swift in Sources */ = {isa = PBXBuildFile; fileRef = 00C0C6D022470705003D8AF0 /* IosCanvas.swift */; };
|
||||||
00C0C6D92247DC13003D8AF0 /* IosCanvasTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 00C0C6D82247DC13003D8AF0 /* IosCanvasTest.swift */; };
|
00C0C6D92247DC13003D8AF0 /* IosCanvasTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 00C0C6D82247DC13003D8AF0 /* IosCanvasTest.swift */; };
|
||||||
00C0C6DB2247E6B0003D8AF0 /* IosDates.swift in Sources */ = {isa = PBXBuildFile; fileRef = 00C0C6DA2247E6B0003D8AF0 /* IosDates.swift */; };
|
|
||||||
00C0C6DD2247E6C4003D8AF0 /* IosDatesTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 00C0C6DC2247E6C4003D8AF0 /* IosDatesTest.swift */; };
|
|
||||||
00C0C6E0224A3602003D8AF0 /* DetailScreenController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 00C0C6DE224A35FC003D8AF0 /* DetailScreenController.swift */; };
|
00C0C6E0224A3602003D8AF0 /* DetailScreenController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 00C0C6DE224A35FC003D8AF0 /* DetailScreenController.swift */; };
|
||||||
00D48BD12200A31300CC4527 /* Launch.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 00D48BD02200A31300CC4527 /* Launch.storyboard */; };
|
00D48BD12200A31300CC4527 /* Launch.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 00D48BD02200A31300CC4527 /* Launch.storyboard */; };
|
||||||
00D48BD32200AC1600CC4527 /* EditHabitController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 00D48BD22200AC1600CC4527 /* EditHabitController.swift */; };
|
00D48BD32200AC1600CC4527 /* EditHabitController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 00D48BD22200AC1600CC4527 /* EditHabitController.swift */; };
|
||||||
@@ -55,7 +51,6 @@
|
|||||||
/* End PBXCopyFilesBuildPhase section */
|
/* End PBXCopyFilesBuildPhase section */
|
||||||
|
|
||||||
/* Begin PBXFileReference section */
|
/* Begin PBXFileReference section */
|
||||||
006EFE4D2252EA2B008464E0 /* IosLocale.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IosLocale.swift; sourceTree = "<group>"; };
|
|
||||||
006EFE4F225432B8008464E0 /* AboutScreenController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AboutScreenController.swift; sourceTree = "<group>"; };
|
006EFE4F225432B8008464E0 /* AboutScreenController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AboutScreenController.swift; sourceTree = "<group>"; };
|
||||||
00A5B42422009F590024E00C /* uhabits.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = uhabits.app; sourceTree = BUILT_PRODUCTS_DIR; };
|
00A5B42422009F590024E00C /* uhabits.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = uhabits.app; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||||
00A5B42722009F590024E00C /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; };
|
00A5B42722009F590024E00C /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; };
|
||||||
@@ -71,11 +66,8 @@
|
|||||||
00C0C6BB22465F65003D8AF0 /* databases */ = {isa = PBXFileReference; lastKnownFileType = folder; path = databases; sourceTree = "<group>"; };
|
00C0C6BB22465F65003D8AF0 /* databases */ = {isa = PBXFileReference; lastKnownFileType = folder; path = databases; sourceTree = "<group>"; };
|
||||||
00C0C6BC22465F65003D8AF0 /* migrations */ = {isa = PBXFileReference; lastKnownFileType = folder; path = migrations; sourceTree = "<group>"; };
|
00C0C6BC22465F65003D8AF0 /* migrations */ = {isa = PBXFileReference; lastKnownFileType = folder; path = migrations; sourceTree = "<group>"; };
|
||||||
00C0C6C92246E543003D8AF0 /* main.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = main.framework; path = ../core/build/bin/ios/mainDebugFramework/main.framework; sourceTree = "<group>"; };
|
00C0C6C92246E543003D8AF0 /* main.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = main.framework; path = ../core/build/bin/ios/mainDebugFramework/main.framework; sourceTree = "<group>"; };
|
||||||
00C0C6CD2246EFB3003D8AF0 /* IosExtensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IosExtensions.swift; sourceTree = "<group>"; };
|
|
||||||
00C0C6D022470705003D8AF0 /* IosCanvas.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IosCanvas.swift; sourceTree = "<group>"; };
|
00C0C6D022470705003D8AF0 /* IosCanvas.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IosCanvas.swift; sourceTree = "<group>"; };
|
||||||
00C0C6D82247DC13003D8AF0 /* IosCanvasTest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IosCanvasTest.swift; sourceTree = "<group>"; };
|
00C0C6D82247DC13003D8AF0 /* IosCanvasTest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IosCanvasTest.swift; sourceTree = "<group>"; };
|
||||||
00C0C6DA2247E6B0003D8AF0 /* IosDates.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IosDates.swift; sourceTree = "<group>"; };
|
|
||||||
00C0C6DC2247E6C4003D8AF0 /* IosDatesTest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IosDatesTest.swift; sourceTree = "<group>"; };
|
|
||||||
00C0C6DE224A35FC003D8AF0 /* DetailScreenController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DetailScreenController.swift; sourceTree = "<group>"; };
|
00C0C6DE224A35FC003D8AF0 /* DetailScreenController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DetailScreenController.swift; sourceTree = "<group>"; };
|
||||||
00D48BD02200A31300CC4527 /* Launch.storyboard */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; path = Launch.storyboard; sourceTree = "<group>"; };
|
00D48BD02200A31300CC4527 /* Launch.storyboard */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; path = Launch.storyboard; sourceTree = "<group>"; };
|
||||||
00D48BD22200AC1600CC4527 /* EditHabitController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EditHabitController.swift; sourceTree = "<group>"; };
|
00D48BD22200AC1600CC4527 /* EditHabitController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EditHabitController.swift; sourceTree = "<group>"; };
|
||||||
@@ -179,9 +171,6 @@
|
|||||||
children = (
|
children = (
|
||||||
00C0C6D022470705003D8AF0 /* IosCanvas.swift */,
|
00C0C6D022470705003D8AF0 /* IosCanvas.swift */,
|
||||||
00C0C6A7224654A2003D8AF0 /* IosDatabase.swift */,
|
00C0C6A7224654A2003D8AF0 /* IosDatabase.swift */,
|
||||||
00C0C6DA2247E6B0003D8AF0 /* IosDates.swift */,
|
|
||||||
00C0C6CD2246EFB3003D8AF0 /* IosExtensions.swift */,
|
|
||||||
006EFE4D2252EA2B008464E0 /* IosLocale.swift */,
|
|
||||||
);
|
);
|
||||||
path = Platform;
|
path = Platform;
|
||||||
sourceTree = "<group>";
|
sourceTree = "<group>";
|
||||||
@@ -191,7 +180,6 @@
|
|||||||
children = (
|
children = (
|
||||||
00C0C6D82247DC13003D8AF0 /* IosCanvasTest.swift */,
|
00C0C6D82247DC13003D8AF0 /* IosCanvasTest.swift */,
|
||||||
00C0C6A222465365003D8AF0 /* IosDatabaseTest.swift */,
|
00C0C6A222465365003D8AF0 /* IosDatabaseTest.swift */,
|
||||||
00C0C6DC2247E6C4003D8AF0 /* IosDatesTest.swift */,
|
|
||||||
);
|
);
|
||||||
path = Platform;
|
path = Platform;
|
||||||
sourceTree = "<group>";
|
sourceTree = "<group>";
|
||||||
@@ -323,11 +311,8 @@
|
|||||||
buildActionMask = 2147483647;
|
buildActionMask = 2147483647;
|
||||||
files = (
|
files = (
|
||||||
00C0C6D122470705003D8AF0 /* IosCanvas.swift in Sources */,
|
00C0C6D122470705003D8AF0 /* IosCanvas.swift in Sources */,
|
||||||
00C0C6CE2246EFB3003D8AF0 /* IosExtensions.swift in Sources */,
|
|
||||||
00C0C6E0224A3602003D8AF0 /* DetailScreenController.swift in Sources */,
|
00C0C6E0224A3602003D8AF0 /* DetailScreenController.swift in Sources */,
|
||||||
00C0C6A8224654A2003D8AF0 /* IosDatabase.swift in Sources */,
|
00C0C6A8224654A2003D8AF0 /* IosDatabase.swift in Sources */,
|
||||||
006EFE4E2252EA2B008464E0 /* IosLocale.swift in Sources */,
|
|
||||||
00C0C6DB2247E6B0003D8AF0 /* IosDates.swift in Sources */,
|
|
||||||
00A5B42A22009F590024E00C /* MainScreenController.swift in Sources */,
|
00A5B42A22009F590024E00C /* MainScreenController.swift in Sources */,
|
||||||
00A5B42822009F590024E00C /* AppDelegate.swift in Sources */,
|
00A5B42822009F590024E00C /* AppDelegate.swift in Sources */,
|
||||||
00D48BD32200AC1600CC4527 /* EditHabitController.swift in Sources */,
|
00D48BD32200AC1600CC4527 /* EditHabitController.swift in Sources */,
|
||||||
@@ -339,7 +324,6 @@
|
|||||||
isa = PBXSourcesBuildPhase;
|
isa = PBXSourcesBuildPhase;
|
||||||
buildActionMask = 2147483647;
|
buildActionMask = 2147483647;
|
||||||
files = (
|
files = (
|
||||||
00C0C6DD2247E6C4003D8AF0 /* IosDatesTest.swift in Sources */,
|
|
||||||
00C0C6D92247DC13003D8AF0 /* IosCanvasTest.swift in Sources */,
|
00C0C6D92247DC13003D8AF0 /* IosCanvasTest.swift in Sources */,
|
||||||
00C0C6A62246537E003D8AF0 /* IosDatabaseTest.swift in Sources */,
|
00C0C6A62246537E003D8AF0 /* IosDatabaseTest.swift in Sources */,
|
||||||
);
|
);
|
||||||
|
|||||||
Reference in New Issue
Block a user